串口读取数据部分数据有错误

需求 在使用串口调试助手调试读写程序时,发现在开启定时 10ms 发送的情况下,接收到的数据有时候会不对。 解决 原因 经过反复调试,最终确定问题是 RS485 导致的问题。因为下面几个原因叠加导致: RS485 是半双工设备,同时只能收或者发。 串口调试助手,定时发送没有办法刚好完全避开程序的发送 所以,就出现了,当程序在发送时,串口调试助手也在发送,等到程序接收的时候,数据就不完整,或者有问题。 验证 验证也很简单: 程序只收不发,然后查看所有受到的数据,没有错误。 程序发送的间隔拉的很长,观察在发送间隔中的接收数据,也是没有错误的。 参考

2023-03-21 · 1 min · 18 words · RamLife

多进程如何使用单串口的方案

需求 数据处理的程序是多进程的,那么如何让多进程的处理程序使用硬件上的单个的串口呢? 解决 最适合的方法还是,把串口部分的程序独立出来,做成一个服务程序。 这个服务,对下是一条一条的把数据帧通过硬件串口进行收发。 这个服务,自身需要对数据进行一定的加工处理,比如按照指定的协议对数据帧进行编解码。 这个服务,对上可以使用队列,管道等进程间通讯的方式,把相关数据送到不同的进程中去。 当然如果多进程的处理功能特别简单,也可以考虑把这个处理的功能和串口二合一,然后通过多线程的方式去做。 参考 这个很有必要讨论讨论,我搞过一小段时间售货机,串口通信 多个进程间如何实现串口控制共享 linux两个进程同时打开串口,linux串口操作及设置详解

2023-03-13 · 1 min · 12 words · RamLife

Linux 串口的配置和读写

需求 需要在 linux 中配置好串口,并且通过串口收发数据 解决 打开串口 打开串口直接使用 open 函数即可,需要注意的是, flag 中的参数 O_NOCTTY, O_NDELAY. O_NOCTTY:告诉Unix这个程序不想成为“控制终端”控制的程序,不说明这个标志的话,任何输入都会影响你的程序。 O_NDELAY:告诉Unix这个程序不关心DCD信号线状态,即其他端口是否运行,不说明这个标志的话,该程序就会在DCD信号线为低电平时停止。但是在 man 中,是把 O_NDELAY 和 O_NONBLOCK 放在一起,并没有说明两者的区别,所以这这个参数的作用存疑。 open 时需要指定串口的串口号,比如 /dev/ttyS0 int OpenDevice(const char * dev) { int fd = 0; fd = open(dev, O_RDWR | O_NOCTTY | O_NONBLOCK); if (fd < 0) { fprintf(stderr, "Can not open serial port %s", dev); return -1; } cout << "open " << dev << " Ok!" << endl; return fd; } if ((serial_fd = OpenDevice(kSerialName....

2023-03-13 · 4 min · 782 words · RamLife

命令行调试串口

需求 在编程使用串口之前,希望先确定串口硬件和系统层面是否正常。 解决 可以使用 stty 来调试串口功能。 查询当前串口配置 sudo stty -aF /dev/ttyS0 上面这个命令可以打印出当前串口的所有配置,有些配置选项前面有 -, 这个表示关闭此选项,或者额外意义,具体可以参考手册 man stty. 需要注意这几个配置: speed, -parenb, cs8, -cstopb, -ixon, -ixoff, -echo. 表示: 波特率,关闭校验,8位,1位停止,无流控,无回显. 保存,读取当前配置 在进行串口配置之前,应该先保存现在配置,便于以后的恢复。 # 保存 sudo stty -gF /dev/ttyS0 > save_stty # 读取 sudo stty -F /dev/ttyS0 $(cat save_stty) 脚本中可以这样写: save_stty="$(stty -g)" ... stty $save_stty 配置串口 sudo stty -F /dev/ttyS0 speed 115200 cs8 -parenb -cstopb -ixon -echo 上面这条命令立即生效,即使已经使用 cat 读取串口数据。 读取数据 sudo cat /dev/ttyS0 *注意: *...

2023-03-09 · 1 min · 106 words · RamLife