Arduino命令解析

Arduino command parsing

我正在编写一个接收 UDP 数据包的 ESP32 项目,并根据它执行一些操作。有那些命令:

FON
FOFF
MSC <INT> <INT>
TC <INT>

我收到这样的消息:

void receiveUdpMessages(){
  int udpMsgLength = Udp.parsePacket(); 
  if(udpMsgLength != 0){
      byte udpPacket[udpMsgLength+1];
      IPAddress senderIp = Udp.remoteIP();
      Udp.read(udpPacket, udpMsgLength);
      udpPacket[udpMsgLength] = 0;
      Udp.flush(); 

      Serial.println("Received UDP Message from : " + String(senderIp[0]) + "." + String(senderIp[1]) + "." + String(senderIp[2])+ "."+ String(senderIp[3]));

      processReceivedMessage((char *)udpPacket);
  }
}

这是 processReceivedMessage 方法:

void processReceivedMessage(char *message){
    if(strncmp("FON",message,3)==0){
      setParameters(ct, 100);  
    }else if(strncmp("FOFF",message,4)==0){
      setParameters(ct, 0);  
    }else if(strncmp("MSC",message,3)==0){

    }else if(strncmp("TC",message,2)==0){

    }
}

我的问题是,为参数化命令拆分两个整数的最佳方法是什么?另外,如果您发现上述代码有任何问题,请告诉我,我还没有机会对其进行测试。

所以这里实际上有两个独立的步骤:

  1. 查找消息中整数子字符串的起始位置
  2. 将这些子字符串转换为实际的 ints

对于第 1 步,有很多方法可以做到这一点,但使用 strchr 可能是最简单的方法。

对于第 2 步,请使用 atoi 或更安全但更难使用的 strtol

这是 MSC 消息的示例,处理 TC 消息的示例非常相似。

为清楚起见,我将其保留为一个函数,但仍有重构它的余地。

void process_msc_message(char * message)
{
    int integers[2];
    // strchr returns a pointer to the space character
    char* substring = strchr(message, ' ');
    if (substring)
    {
        // atoi will convert the first number it finds in the given string
        integers[0] = atoi(substring); 
    }

    // Jump forward to the next number
    substring = strchr(substring+1, ' ');
    if (substring)
    {
        integers[1] = atoi(substring);
    }

    // Do something with the integers...

}