'void (*)(const char*)' 'void (*)()' [-允许]

'void (*)(const char*)' to 'void (*)()' [-fpermissive]

本文关键字:void 允许 const char      更新时间:2023-10-16

我正在使用这个Arduino库来标记和解析通过串行端口接收的命令,但我有一些奇怪的指针问题。我在堆栈溢出上看到了其他一些解决方案(如建议的那样(,但它们都没有帮助我解决问题。

请让我知道我在这个addCommand功能上做错了什么。对我来说一切似乎都很好

调用pingHandler,将"PING"字符串传递给函数定义,仅此而已。

#include <SoftwareSerial.h>
#include "SerialCommand.h"
SerialCommand sCmd;
void pingHandler (const char *command) {
Serial.println("PONG");
}
void setup() {
Serial.begin(9600);
while (!Serial);
sCmd.addCommand("PING", pingHandler);
}
void loop() {
// put your main code here, to run repeatedly:
if(Serial.available() > 0){
sCmd.readSerial();
}
}

我收到此错误

C:UsersGK_Desk_07DocumentsArduinoArduinoSerialCommandArduinoUnityArduinoUnity.ino: In function 'void setup()':
C:UsersGK_Desk_07DocumentsArduinoArduinoSerialCommandArduinoUnityArduinoUnity.ino:13:38: warning: invalid conversion from 'void (*)(const char*)' to 'void (*)()' [-fpermissive]
sCmd.addCommand("PING", pingHandler);
^
In file included from C:UsersGK_Desk_07DocumentsArduinoArduinoSerialCommandArduinoUnityArduinoUnity.ino:2:0:
sketchSerialCommand.h:84:8: note: initializing argument 2 of 'void SerialCommand::addCommand(const char*, void (*)())'
void addCommand(const char *, void(*)());   // Add commands to processing dictionary
^

addCommand的定义是

void addCommand(const char *, void(*)()); // Add commands to processing dictionary

所以它需要一个void(*)()(C++中没有任何参数的函数,在 C 中有任何任意参数(,但你给了它一个const char*参数

pingHandler更改为

void pingHandler (void) {

编辑:

由于Arduino是C++因此您不需要括号内的void部分

void pingHandler () {

addCommand的第二个参数应该是指向不带参数的函数的指针,如示例中所示。

尝试将pingHandler更改为:

void pingHandler () {
const char *command = sCmd.next();
Serial.println("PONG");
}