某些 strtok 调用的分段错误
segmentation fault on some strtok calls
这是一个循环内的函数运行。基本上,应用程序从 Arduino 接收消息并将消息发送到此函数:
void parseMessage(char *message){
char *sensor_num="";
char *value="";
char *percentage="";
char *delimiter = "|";
sensor_num = strtok(message , delimiter);
value = strtok(NULL, delimiter);
percentage = strtok(NULL, delimiter);
// Do stuff with values
}
它保持 运行 一段时间,但有时我会在 value = strtok(NULL, delimiter);
部分出现段错误。
到达的消息是这样的:
1|123|50|
以及正在调用的主函数 parseMessage
int main() {
SYS_LOG_INFO("Opening device... ");
int BLUETOOTH = open("/dev/tty.HC-05-DevB", O_RDONLY | O_NOCTTY | O_NONBLOCK);
SYS_LOG_INFO("Opened!");
struct termios tty;
struct termios tty_old;
memset (&tty, 0, sizeof tty);
/* Error Handling */
if (tcgetattr(BLUETOOTH, &tty) != 0) {
SYS_LOG_ERROR("Error on read Bluetooth.");
return 1;
}
/* Save old tty parameters */
tty_old = tty;
/* Set Baud Rate */
cfsetospeed (&tty, (speed_t)B9600);
cfsetispeed (&tty, (speed_t)B9600);
/* Setting other Port Stuff */
tty.c_cflag &= ~PARENB; // Make 8n1
tty.c_cflag &= ~CSTOPB;
tty.c_cflag &= ~CSIZE;
tty.c_cflag |= CS8;
tty.c_cflag &= ~CRTSCTS; // no flow control
tty.c_cc[VMIN] = 1;
tty.c_cc[VTIME] = 5;
tty.c_cflag |= CREAD | CLOCAL; // turn on READ & ignore ctrl lines
/* Make raw */
cfmakeraw(&tty);
/* Flush Port, then applies attributes */
tcflush(BLUETOOTH, TCIFLUSH);
if ( tcsetattr ( BLUETOOTH, TCSANOW, &tty ) != 0) {
SYS_LOG_ERROR("Error on flush port.");
return 1;
}
int n = 0;
char buf[255];
SYS_LOG_INFO("Starting to read data...");
do {
n = read(BLUETOOTH, &buf, sizeof buf);
if (n > 0) {
printf("buf = %s\n", buf);
parseMessage(buf);
memset(&buf, '[=12=]', sizeof buf);
}
usleep(500000); /* sleep for 100 milliSeconds */
} while(1);
return 0;
}
1.As strtok
在 parseMessage
中被调用,buf
应该是 nul-terminate,否则可能会出现段错误。试试下面的代码:
char buf[255]={0};
SYS_LOG_INFO("Starting to read data...");
n = read(BLUETOOTH, &buf, sizeof(buf)-1);
if (n > 0) {
buf[n]=0;
printf("buf = %s\n", buf);
parseMessage(buf);
}
2。 strtok
不可重入,请改用 strtok_r
。有时,这可能会导致奇怪的问题。
我从 Arduino 收到一些不一致的数据。
所以,我解决了在发送数据进行解析之前使用正则表达式检查数据的问题。
谢谢大家
这是一个循环内的函数运行。基本上,应用程序从 Arduino 接收消息并将消息发送到此函数:
void parseMessage(char *message){
char *sensor_num="";
char *value="";
char *percentage="";
char *delimiter = "|";
sensor_num = strtok(message , delimiter);
value = strtok(NULL, delimiter);
percentage = strtok(NULL, delimiter);
// Do stuff with values
}
它保持 运行 一段时间,但有时我会在 value = strtok(NULL, delimiter);
部分出现段错误。
到达的消息是这样的:
1|123|50|
以及正在调用的主函数 parseMessage
int main() {
SYS_LOG_INFO("Opening device... ");
int BLUETOOTH = open("/dev/tty.HC-05-DevB", O_RDONLY | O_NOCTTY | O_NONBLOCK);
SYS_LOG_INFO("Opened!");
struct termios tty;
struct termios tty_old;
memset (&tty, 0, sizeof tty);
/* Error Handling */
if (tcgetattr(BLUETOOTH, &tty) != 0) {
SYS_LOG_ERROR("Error on read Bluetooth.");
return 1;
}
/* Save old tty parameters */
tty_old = tty;
/* Set Baud Rate */
cfsetospeed (&tty, (speed_t)B9600);
cfsetispeed (&tty, (speed_t)B9600);
/* Setting other Port Stuff */
tty.c_cflag &= ~PARENB; // Make 8n1
tty.c_cflag &= ~CSTOPB;
tty.c_cflag &= ~CSIZE;
tty.c_cflag |= CS8;
tty.c_cflag &= ~CRTSCTS; // no flow control
tty.c_cc[VMIN] = 1;
tty.c_cc[VTIME] = 5;
tty.c_cflag |= CREAD | CLOCAL; // turn on READ & ignore ctrl lines
/* Make raw */
cfmakeraw(&tty);
/* Flush Port, then applies attributes */
tcflush(BLUETOOTH, TCIFLUSH);
if ( tcsetattr ( BLUETOOTH, TCSANOW, &tty ) != 0) {
SYS_LOG_ERROR("Error on flush port.");
return 1;
}
int n = 0;
char buf[255];
SYS_LOG_INFO("Starting to read data...");
do {
n = read(BLUETOOTH, &buf, sizeof buf);
if (n > 0) {
printf("buf = %s\n", buf);
parseMessage(buf);
memset(&buf, '[=12=]', sizeof buf);
}
usleep(500000); /* sleep for 100 milliSeconds */
} while(1);
return 0;
}
1.As strtok
在 parseMessage
中被调用,buf
应该是 nul-terminate,否则可能会出现段错误。试试下面的代码:
char buf[255]={0};
SYS_LOG_INFO("Starting to read data...");
n = read(BLUETOOTH, &buf, sizeof(buf)-1);
if (n > 0) {
buf[n]=0;
printf("buf = %s\n", buf);
parseMessage(buf);
}
2。 strtok
不可重入,请改用 strtok_r
。有时,这可能会导致奇怪的问题。
我从 Arduino 收到一些不一致的数据。
所以,我解决了在发送数据进行解析之前使用正则表达式检查数据的问题。
谢谢大家