我试图在C中写一个小应用程序,它从串口读取数据并将其存储在二进制文件中。我使用这条指令从串口读取但是我丢失了数据。
n = read(fd, &buf, sizeof(buf));
所以我在前一个代码之后添加了这段代码,以便了解会发生什么。
if(n!= strlen(buf)&&n!=-1){
printf("N= %d strlen = %d\n",n,strlen(buf));
printf("%s",buf);
}
我看到n
的值是正确的,但strlen(buf)
不是(应该与n
相同),我不知道为什么......
缓冲区变量buf
的定义与char[1000] buf;
类似,n
是整数。
端口在两侧都处于原始模式,这就是我在应用程序侧面设置的方式。
tcgetattr(fd, &options);
/*
* Set the baud rates to 38400...
*/
cfsetispeed(&options, B38400);
cfsetospeed(&options, B38400);
/*
* Enable the receiver and set local mode...
*/
options.c_cflag |= (CLOCAL | CREAD);
/*
* No parity (8N1):
*/
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
/* To disable software flow control simply mask those bits: */
options.c_iflag &= ~(IXON | IXOFF | IXANY);
options.c_lflag &= ~(ICANON|ECHO|ECHOE|ISIG);
/* Disable hardware flow control: */
/* unavailable to the gcc -> options.c_cflag &= ~CNEW_RTSCTS;*/
/*
* Set the new options for the port...
*/
tcsetattr(fd, TCSANOW, &options);
知道我能做错什么吗?
由于
答案 0 :(得分:1)
有几点。正如unwind指出的那样,如果您使用带有strlen的二进制数据,那么您的新代码将无法正常工作。
但是,您需要检查读取的返回值是否正确。它可能不会返回您期望的数据量(只是在阅读时切换任务会给您带来问题)。
所以我怀疑你是在正确的轨道上,检查你是否已经阅读了你所期望的内容,并且如果它是一个简短的阅读,那就回去了。你不能通过在二进制数据上使用strlen来做到这一点。
人们写一个" read_all"这是相当普遍的。功能,一直持续阅读,直到它获得所需的所有数据或在出现错误时退出,单独阅读不会表现得像这样。
我可能会像这样修改你的支票:
if((n = read(fd, &buf, sizeof(buf)) != sizeof(buf)) {
// Check for errors or short reads and handle appropriately.