首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止libserial吃掉来自我的串行设备的0x0A、0x0D或0x0F之类的字符?

如何防止libserial吃掉来自我的串行设备的0x0A、0x0D或0x0F之类的字符?
EN

Stack Overflow用户
提问于 2020-06-07 16:13:11
回答 2查看 129关注 0票数 0

当使用FM9对象与串行USB设备(用于获取道路交通警报的GNS FM9接收器)通信时,我发现并非所有来自该设备的字符实际上都在读取。这就是我一直得到的服务:

代码语言:javascript
复制
3F 00 56 08 37 3F

当在RDS测量师应用程序中使用相同的设备(用Java编写并使用com.fazecast.jSerialComm.SerialPort)时,相同的响应如下所示:

代码语言:javascript
复制
3F 00 00 56 08 0A 37 0C 0D 3F

经过一些研究,我无意中发现了这个帖子:串口上换行符错误(CR而不是LF)。海报上没有使用libserial (但有些是现成的串口通讯应用程序),但他的问题和我的完全一样。

这是所讨论的端口的系统端配置:

代码语言:javascript
复制
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

该系统是一个RaspberyPI3B,具有最新的生产版本的Raspbian正在运行。在系统方面,该设备如下所示:

代码语言:javascript
复制
pi@autoradio:~ $ ls -al /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 0 Jun  7 17:11 /dev/ttyUSB0

现在,我的问题是:如何使我的SerialStream在没有任何转换的情况下读取所有字符,就像它们来自端口一样?我真的不想在这个上下文中使用stty,因为在删除和重新附加设备时,它的设置可能会被覆盖。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-08 15:54:16

好的,我开了个问题libserial的维护人员,并得到了答案,C++ std::iostream (甚至不是LibSerial::SerialStream!)默认情况下踢出空格字符。CR、LF和FF被认为是这样。

他们向我提出了这个解决方案:

代码语言:javascript
复制
SerialStream tmc_receiver_handler ("/dev/ttyUSB0", ios::in | ios::out);
char c = 0x00;

tmc_receiver_handler.SetBaudRate      (SerialStreamBuf::BAUD_38400);
tmc_receiver_handler.SetCharSize      (SerialStreamBuf::CHAR_SIZE_8);
tmc_receiver_handler.SetFlowControl   (SerialStreamBuf::FLOW_CONTROL_NONE);
tmc_receiver_handler.SetParity        (SerialStreamBuf::PARITY_NONE);
tmc_receiver_handler.SetNumOfStopBits (SerialPort::STOP_BITS_1);

tmc_receiver_handler >> noskipws >> c;

noskipws关闭空白抑制。应用这个之后,一切都很好。

票数 0
EN

Stack Overflow用户

发布于 2020-06-07 17:07:02

您需要确保端口处于“原始”模式。

从快速查看libserial文档来看,它似乎没有一个参数来设置原始模式。一些备选方案:

  • 修改libserial以设置原始模式。
  • 不要使用libserial,也不要使用其他的东西。
  • 更改操作系统的端口默认值。

libserial的实现似乎相当基本;您可能最好使用类似Boost.asio的东西。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62248160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档