c++ - 如何防止 libserial 吞噬来自串行设备的 0x0A、0x0D 或 0x0F 等字符?
问题描述
libserial
当使用's 对象与串行 USB 设备(用于获取道路交通警报的 GNS FM9 接收器)通信SerialStream
时,我发现并非来自设备的所有字符实际上都被读取。这是我一直得到的服务:
3F 00 56 08 37 3F
将同一设备与RDS Surveyor 应用程序(用 Java 编写并使用com.fazecast.jSerialComm.SerialPort
)一起使用时,相同的响应如下所示:
3F 00 00 56 08 0A 37 0C 0D 3F
经过一番研究,我偶然发现了这个帖子:Wrong newline character over the serial port (CR instead of LF)。发帖人没有使用libserial
(而是一些现成的串口通讯应用),但他的问题和我的一模一样。
这是相关端口的系统端配置:
pi@autoradio:~ $ stty -a
speed 38400 baud; rows 40; columns 80; line = 0; intr = ^C; quit = ^\; erase = ^?; kill = ^U;
eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z;
rprnt = ^R; werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0; -parenb -parodd -cmspar
cs8 -hupcl -cstopb cread -clocal -crtscts -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr
-igncr icrnl ixon ixoff -iuclc -ixany -imaxbel iutf8 opost -olcuc -ocrnl onlcr -onocr -onlret
-ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten echo echoe echok -echonl -noflsh
-xcase -tostop -echoprt echoctl echoke -flusho -extproc
该系统是运行最新生产版本的 Raspbian 的 Raspbery Pi 3B。在系统端,设备如下所示:
pi@autoradio:~ $ ls -al /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 0 Jun 7 17:11 /dev/ttyUSB0
现在,我的问题是:如何让我的 SerialStream 读取所有字符而不进行任何转换,就像它们来自端口一样?我真的不想stty
在这种情况下使用,因为它的设置可能会在移除和重新连接设备时被覆盖。谢谢你。
解决方案
您需要确保端口处于“原始”模式。
快速浏览一下 libserial 文档,似乎它没有设置原始模式的参数。一些选项:
- 修改 libserial 以设置原始模式。
- 不要使用 libserial,而使用其他东西。
- 更改操作系统的端口默认值。
libserial 的实现似乎很基础;你可能最好使用 Boost.asio 之类的东西。
推荐阅读
- python - 寻找建议以摆脱光线投射中低效的 for 循环
- c# - 使用进程从 c# 调用 script.py 但得到错误的导入模块,如 cv2
- bootstrap-4 - 尝试将引导按钮居中(避免“全宽”)
- html - html 的自动完成属性在本地机器上工作,但是当我将它部署在服务器上时它不起作用
- java - 地图
> - 使用 Stream 选择键值 - php - 为什么 __soapCall 抛出“Forbidden”而 __doRequest 成功?
- javascript - 我无法将 PreactX 组件直接渲染到 document.body
- javascript - 刷新页面后维护 JavaScript 附加项
- android - Android本机库的CrashlyticsUploadSymbols成功但Firebase控制台中没有显示符号?
- javascript - 如何从对象 HTMLTableCellElement 中获取属性?