导航:首页 > 操作系统 > linux串口丢数据

linux串口丢数据

发布时间:2023-03-16 08:34:32

1. linux下串口通信丢字节的问题是怎么样解决

int con=atoi(portstr);
unsigned char Port_file_name[30];
int fd0,rc;
struct termios ts0;
switch (con)
{ //选项O_NOCTTY 表示不能把本串口当成控制终端,否则用户的键盘输入信息将影响程序的执行
//O_NDELAY表示打开串口的时候,程序并不关心另一端的串口是否在使用中
case 1: fd0=open("/dev/ttyM0",O_RDWR | O_NOCTTY | O_NDELAY); break;
case 2: fd0=open("/dev/ttyM1",O_RDWR | O_NOCTTY | O_NDELAY); break;
case 3: fd0=open("/dev/ttyM2",O_RDWR | O_NOCTTY | O_NDELAY); break;
case 4: fd0=open("/dev/ttyM3",O_RDWR | O_NOCTTY | O_NDELAY); break;
case 5: fd0=open("/dev/ttyM4",O_RDWR | O_NOCTTY | O_NDELAY); break;
case 6: fd0=open("/dev/ttyM5",O_RDWR | O_NOCTTY | O_NDELAY); break;
case 7: fd0=open("/dev/ttyM6",O_RDWR | O_NOCTTY | O_NDELAY); break;
case 8: fd0=open("/dev/ttyM7",O_RDWR | O_NOCTTY | O_NDELAY); break;
default : fd0=open("/dev/ttyM0",O_RDWR | O_NOCTTY | O_NDELAY); break;
}

tcgetattr(fd0,&ts0);
bzero(&ts0,sizeof(struct termios));
switch (gytype)
{
case 1:{ts0.c_cflag |= B300 | CS7 | CLOCAL | CREAD | PARENB ;
ts0.c_cflag &= ~PARODD; // 转换为偶效验
ts0.c_iflag |= INPCK; // Disnable parity checking
break; }
case 2:{ts0.c_cflag |= B1200 | CS8 | CLOCAL | CREAD | PARENB ;
ts0.c_cflag &= ~PARODD; // 转换为偶效验
ts0.c_iflag |= INPCK; // Disnable parity checking
break;
}
case 3:{
ts0.c_cflag |= B9600 | CS8 | CLOCAL | CREAD ;
ts0.c_cflag &= ~PARENB; // Clear parity enable
ts0.c_iflag &= ~INPCK; // Enable parity checking
break;
}
case 4:{ts0.c_cflag |= B9600 | CS8 | CLOCAL | CREAD | PARENB ;
ts0.c_cflag &= ~PARODD; // 转换为偶效验
ts0.c_iflag |= INPCK; // Disnable parity checking
break;
}
}

ts0.c_lflag &= ~ECHO;
ts0.c_lflag &= ~ECHONL;
ts0.c_iflag &= ~IXOFF;
ts0.c_iflag &= ~IXON;
ts0.c_cflag &= ~CSIZE;
switch (gytype)
{
case 1:{ts0.c_cflag |= CS7 ; break;}
case 2:{ts0.c_cflag |= CS8 ; break;}
case 3:{ts0.c_cflag |= CS8 ; break;}
case 4:{ts0.c_cflag |= CS8 ; break;}
}

ts0.c_lflag &= ~ICANON; //如果设置使能规范输入,否则使用原始数据(本文使用)
ts0.c_oflag &= ~ONLCR; //如果设置将NL转换成CR-NL后输出
ts0.c_iflag &= ~INLCR; //如果设置将接收到的NL(换行)转换成CR(回车)。
ts0.c_cc[VMIN] = 0; //最少可读数据
ts0.c_cc[VTIME] = 0; //等待数据时间(10秒的倍数)
ts0.c_cflag &= ~CSTOPB; //如果设置则使用两个停止位 ,如果取消则使用一个停止位
ts0.c_iflag |= IGNBRK; //如果设置则忽略接收到的break信号
ts0.c_lflag &= ~IEXTEN; //如果设置则启用实现自定义的输入处理
ts0.c_lflag |= NOFLSH; //如果设置则禁止产生SIGINT,SIGQUIT和SIGSUSP信号时刷新输入和输出队列
switch (gytype)
{
case 1:{rc = cfsetospeed(&ts0,B300);break; }
case 2:{rc = cfsetospeed(&ts0,B1200);break; }
case 3:{rc = cfsetospeed(&ts0,B9600);break; }
case 4:{rc = cfsetospeed(&ts0,B9600);break; }
}
rc = tcsetattr(fd0,TCSAFLUSH,&ts0);
return fd0;

2. linux 下,串口读取很多数据 放到1.txt里

你的这个串口设备在打开(也就是调用open函数获取设备描述符)的时候设置的是非阻塞方式。导致串口上没数据的时候read也立即返回,但是你的while已经把有效的数据读走了,if里面读到的一定是空的,所以什么也不打印。

建议
1. 在打开串口设备时使用阻塞方式,不会设置的话查查open系统调用的帮助,它有个flag;
2. 把while循环内的if语句去掉。

阅读全文

与linux串口丢数据相关的资料

热点内容
丁字框架梁处用加密吗 浏览:678
海聊app怎么玩 浏览:207
单文件夹是什么 浏览:234
程序员生财案例 浏览:354
男兵接上级命令电视剧全集 浏览:5
什么是系统级编译 浏览:336
学习php最好的入门书籍 浏览:592
当上程序员的八年是怎么过来的 浏览:104
android两个焦点 浏览:875
如何在核桃编程app报名 浏览:642
linux基础命令教程豪华版chm 浏览:147
失物招领代码python 浏览:247
基于c51单片机的设计 浏览:350
服务器升级什么鬼 浏览:912
微信做照片小程序源码 浏览:561
linuxsftp连接命令 浏览:190
string函数php 浏览:342
输入接收邮件服务器地址 浏览:807
程序员炒股的段子 浏览:208
php执行流程 浏览:869