C 串行读取时丢失数据

C 串行读取时丢失数据,c,embedded,C,Embedded,我正在尝试用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);

我正在尝试用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的值是正确的,但是strlenbuf不应该与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);
知道我做错了什么吗


谢谢你,我想说几点。正如unwind所指出的,如果您在strlen中使用二进制数据,您的新代码将无法工作

但是,您需要检查读取的返回值是否正确。它很可能不会返回您期望的数据量,而仅仅是任务切换,而读取会给您带来问题

所以我怀疑你是在正确的轨道上,检查你是否已经阅读了你所期望的内容,如果是简短的阅读,就返回去获取剩下的内容。在二进制数据上使用strlen无法做到这一点

人们编写read_all函数是相当常见的,它会一直读取,直到获得所需的所有数据,或者在出现错误时退出,而read本身并不会这样做

我可能会这样修改您的支票:

if((n = read(fd, &buf, sizeof(buf)) != sizeof(buf)) {
// Check for errors or short reads and handle appropriately.

如果您正在读取的数据是二进制的,那么没有理由相信它将是一个C字符串,即以0结尾。所以斯特伦的使用似乎很可疑,你是对的。我在文件上写的是这样的fwritebuf,strlenbuf,1,fptr;。我将strlen改为n,现在它可以工作了。与硬件相关的编程不使用字符类型,使用uint8\t。总是