解决linux串口只能一次性接收8个字节的问题

  • Post author:
  • Post category:linux


开发过程中,用到了的linux串口,发现一次性只能接收8个字节,相信很多人都遇到过,在此记录解决问题的过程。只需要缓存接收到的大于8个字节的数据即可,直到小于8便结束。废话不多,贴出代码:

接受代码

int SerialRecv(int fd, char *rcv_buf, int data_len)
{   
    static int count=0;
    int len, fs_sel;
    char rcv_data[100];
    fd_set fs_read;

    struct timeval time;

    FD_ZERO(&fs_read);
    FD_SET(fd, &fs_read);

    time.tv_sec = 10;
    time.tv_usec = 0;

    //使用select实现串口的多路通信
    fs_sel = select(fd + 1, &fs_read, NULL, NULL, &time);
    if (fs_sel)
    {
        len = read(fd, rcv_data, data_len);
    }
    else
    {
        return FALSE;
    }
    if(len==8)
    {
        strncpy(rcv_buf+count,rcv_data,8);
        count+=8;

    }
    if(len>0&&len<8)
    {
        strncpy(rcv_buf+count,rcv_data,len);
        count+=len;
        printf("count=%d\n",count);
        len=count;
        count=0;
        return len;
    }
    return 0;    
}

调用代码:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#include <string.h>
#include "serial.h"
int fd;
int main(void)
{
    int len;
    int rt = -1;
    char send_buf[20] = "hello world";
    char rcv_buf[100];
    memset(rcv_buf, 0, sizeof(rcv_buf));
    fd = SerialInit(2, 9600, 8, 0, 0);
    SerialSend(fd, send_buf, 10);
    // read_datas_tty(fd,rcv_buf,1,10);
    while (1) //循环读取数据
    {
        len = SerialRecv(fd, rcv_buf, sizeof(rcv_buf));
        if (len >0)
        {
            rcv_buf[len] = '\0';

            printf("len: %d   ,receive data : %s\n", len,rcv_buf);
            SerialSend(fd, rcv_buf, len);
        }
        else
        {
        }
    }

    return 0;
}



版权声明:本文为seven_masters原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。