Arduino команда разбора - PullRequest
       31

Arduino команда разбора

0 голосов
/ 23 ноября 2018

Я пишу проект ESP32, который получает пакет UDP и на его основе необходимо выполнить какое-то действие.Вот эти команды:

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 Ответ

0 голосов
/ 23 ноября 2018

Таким образом, здесь на самом деле есть два отдельных шага:

  1. Найдите, где в вашем сообщении начинаются целые подстроки
  2. Преобразуйте эти подстроки в фактические int s

Для шага 1 есть много способов сделать это, но использование strchr, вероятно, является самым простым для ваших целей.

Для шага 2, используйте atoi или безопаснее, но сложнее-to-use 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...

}
...