开发过程中,用到了的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 版权协议,转载请附上原文出处链接和本声明。