Linux编程 关于串口通讯编程的几个问题
编者按:看《鸟哥的Linux私房菜》,说记录问题和解决方案是个特别好的习惯。好哦,在学习串口编程的时候遇到了许多问题也查了一些资料,有的解决了有的还没有,有的明白了有的还没有。在这里做一个记录。
学习参考资料:
慕课课程:嵌入式Linux应用与开发实践(国家精品(平震宇 、刘丽 、许常青 、匡亮 、凌路 、李涛
https://www.icourse163.org/learn/JSIT-1001754045?tid=1450235453#/learn/content?type=detail&id=1214366486&cid=1218053142
「WuYuJun's blog」的原创文章:Linux串口编程
https://blog.****.net/caijiwyj/article/details/90314312
1 不知如何设置虚拟串口
这个问题说来也十分沙雕,在读和写程序中我用的是同一个串口,以为就是对同一个文件进行读写而已,结果一直写不进东西,自然也读不到。而且我完全没有意识到我的虚拟机根本就没有虚拟串口可以使用。
参考文章:
利用linux虚拟机进行串口通信模拟
VMWARE虚拟机串口添加与调试
说一下,串口其实是一个硬件设备,只不过Linux中“万物皆文件”,所以对文件(ttySx)的读写就是对串口的读写,但这个设备文件它又不是普普通通简简单单的文件,实质上它是和硬件设备一样的,所以没有硬件设备的时候,看到的文件就是个空壳子而已,对它怎么写和读都是没有用的。所以根据上面两篇文章设置好两个虚拟串口,就可以在虚拟机中实现两个串口的通信。
“测试是否连通:以root权限,在一个终端中运行cat /dev/ttyS1,在另一个终端中运行echo
1234>/dev/ttyS2,如果在第一个终端中收到1234,则表明已经连通!!”
说一下对上面这句话的理解:
cat相当于对串口的读,就是打开设备文件/dev/ttyS1看里面的东西;
echo就是写,> 即重定向,把1234写到/dev/ttyS2中
串口ttyS2将数据发送到/dev/ttyS1中,就可以在/dev/ttyS1里面看到 1234
串口编程读写端的原理也不过大致如此。
2 串口发送正常,但是接收不到数据
参考文章:
linux下串口通信打开正常,发送正常,但是接收不到数据的解决办法
关于嵌入式linux下的串口通讯问题—回车、换行、缓冲
“发现是串口配置一般在正规模式(.c_lflag =ICANON)下,因此数据读取到时一直存放在缓冲区,read()进行读取时只有识别到"回车"或者“换行”符号的时候,才会从缓冲区读取成功。”
重点如上,大致的原因就是发送端发送的数据一直放在缓存里面,可是读端必须读到回车或者换行的时候才会将数据中读取出来。
这里我在写程序中的buf数据加上\n后,读端能够读到数据,但却会连续读两次(即写一次读了两次),第一次读到的是正确的数据,第二次读出了换行。具体情形如下图,这个问题暂时还想不明白,先放在这里【2020.7.21】