实现代码
数据不丢失
void serial_read()
{
int nread;
int BUFSIZE=1024;
unsigned char buff[BUFSIZE];
unsigned char ComBuff[1024];
unsigned char dst[1024];
int RecvValidLen = 0;
int RecvDataLen=0;
unsigned char *RecvData;
struct timeval tv;
fd_set rfds;
tv.tv_sec=3;
tv.tv_usec=0;
int dst_cnt = 0;
int i=0;
int j=0;
int k=0;
gettimeofday(&starttime,NULL);
while (true)
{
FD_ZERO(&rfds);
FD_SET(fd, &rfds);
//selsect:测试fd可读
//如果在指定的时间段tv里有事件发生或者时间耗尽,函数均返回)
if (select(1+fd, &rfds, NULL, NULL, &tv)>0)
{
if (FD_ISSET(fd, &rfds))
{
nread=read(fd, buff, BUFSIZE);
printf("readlength=%d\n", nread);
for(int i=0; i<nread; i++)
{
ComBuff[RecvValidLen++] = buff[i];
}
memset(buff,0,sizeof(buff));
GetValidFrame(ComBuff,RecvValidLen);
}
}
}
}
int main()
{
if ((fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY|O_NONBLOCK))<0)
{
printf("err: can't open serial port!\n");
return -1;
}//打开串口
//串口参数配置
struct termios options; // 串口配置结构体
tcgetattr(fd,&options); // 获取串口原来的参数设置
bzero(&options,sizeof(options));
options.c_cflag |= B115200 | CLOCAL | CREAD; // 设置波特率,本地连接,接收使能
options.c_cflag &= ~CSIZE; // 屏蔽数据位
options.c_cflag |= CS8; // 数据位为 8 ,CS7 for 7
options.c_cflag &= ~CSTOPB; // 一位停止位, 两位停止位 |= CSTOPB
options.c_cflag &=~PARENB; // 奇偶校验
tcflush(fd, TCIOFLUSH); // 清除所有正在发生的I/O数据。
if(tcsetattr(fd, TCSANOW, &options)!=0) // TCSANOW立刻对值进行修改
return -1;
thread s(serial_read);
发送数据
std::unique_lock<std::mutex> lk(serialmutex);
send_stateset_request1();
lk.unlock();
while(true)
{
///循环
}
return 0;
}