【发布时间】:2012-02-22 17:54:00
【问题描述】:
我一直在为 arduino 进行编程,但今天我遇到了一个我无法用我非常有限的 C 知识解决的问题。 事情是这样的。 我正在创建一个将串行输入发送到 arduino(设备 ID、命令、命令参数)的 pc 应用程序。该arduino将通过RF将该命令传输到其他arduino。根据 deviceID,正确的 arduino 将执行命令。
为了能够确定我想在“,”上拆分该字符串的设备ID。 这是我的问题,我知道如何在 java 中轻松做到这一点(即使不使用标准的 split 函数),但是在 C 中这是一个完全不同的故事。
谁能告诉我如何让它工作?
谢谢
/*
Serial Event example
When new serial data arrives, this sketch adds it to a String.
When a newline is received, the loop prints the string and
clears it.
A good test for this is to try it with a GPS receiver
that sends out NMEA 0183 sentences.
Created 9 May 2011
by Tom Igoe
This example code is in the public domain.
http://www.arduino.cc/en/Tutorial/SerialEvent
*/
String inputString; // a string to hold incoming data
boolean stringComplete = false; // whether the string is complete
String[] receivedData;
void setup() {
// initialize serial:
Serial.begin(9600);
// reserve 200 bytes for the inputString:
inputString.reserve(200);
}
void loop() {
// print the string when a newline arrives:
if (stringComplete) {
Serial.println(inputString);
// clear the string:
inputString = "";
stringComplete = false;
}
}
/*
SerialEvent occurs whenever a new data comes in the
hardware serial RX. This routine is run between each
time loop() runs, so using delay inside loop can delay
response. Multiple bytes of data may be available.
*/
void serialEvent() {
while (Serial.available()) {
// get the new byte:
char inChar = (char)Serial.read();
if (inChar == '\n') {
stringComplete = true;
}
// add it to the inputString:
if(stringComplete == false) {
inputString += inChar;
}
// if the incoming character is a newline, set a flag
// so the main loop can do something about it:
}
}
String[] splitCommand(String text, char splitChar) {
int splitCount = countSplitCharacters(text, splitChar);
String returnValue[splitCount];
int index = -1;
int index2;
for(int i = 0; i < splitCount - 1; i++) {
index = text.indexOf(splitChar, index + 1);
index2 = text.indexOf(splitChar, index + 1);
if(index2 < 0) index2 = text.length() - 1;
returnValue[i] = text.substring(index, index2);
}
return returnValue;
}
int countSplitCharacters(String text, char splitChar) {
int returnValue = 0;
int index = -1;
while (index > -1) {
index = text.indexOf(splitChar, index + 1);
if(index > -1) returnValue+=1;
}
return returnValue;
}
我决定使用strtok 函数。
我现在遇到了另一个问题。发生的错误是
SerialEvent.cpp:在函数'void splitCommand(String, char)'中:
SerialEvent:68: 错误:无法将参数 '1' 的 'String' 转换为 'char*' 到 'char* strtok(char*, const char*)'
SerialEvent:68: 错误:'null' 未在此范围内声明
代码就像,
String inputString; // a string to hold incoming data
void splitCommand(String text, char splitChar) {
String temp;
int index = -1;
int index2;
for(temp = strtok(text, splitChar); temp; temp = strtok(null, splitChar)) {
Serial.println(temp);
}
for(int i = 0; i < 3; i++) {
Serial.println(command[i]);
}
}
【问题讨论】:
-
看
strtok()函数。 -
strtok已折旧。改用strsep -
为了将来参考,AFAIK
strtok()已不弃用(或折旧)。 MS Visual C++ 编译器将其标记为不安全的广告提供和替代方案,GNU/POSIX 也是如此(尽管有不同的替代方案)。正确使用并意识到其缺点,它将按预期运行。 -
strtok不是解决此问题的好方法:它会将,的任何序列视为单个分隔符。此外,它可能在 arduino 平台上不可用。