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){
}
}
我的问题是,为参数化命令拆分两个整数的最佳方法是什么?另外,如果您发现上述代码有任何问题,请告诉我,我还没有机会对其进行测试。
所以这里实际上有两个独立的步骤:
- 查找消息中整数子字符串的起始位置
- 将这些子字符串转换为实际的
int
s
对于第 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...
}
我正在编写一个接收 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){
}
}
我的问题是,为参数化命令拆分两个整数的最佳方法是什么?另外,如果您发现上述代码有任何问题,请告诉我,我还没有机会对其进行测试。
所以这里实际上有两个独立的步骤:
- 查找消息中整数子字符串的起始位置
- 将这些子字符串转换为实际的
int
s
对于第 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...
}