首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux下使用libserial从串口读取额外字符

Linux下使用libserial从串口读取额外字符
EN

Stack Overflow用户
提问于 2014-02-21 02:51:33
回答 1查看 1.9K关注 0票数 0

我有一个非常基本的设备,我正试图通过Linux上的串行连接与其进行交互。我在这里学习曲线的陡峭部分,仍然,所以请温柔!

无论如何,我能够通过Windows中的超级终端控制设备,或者通过Linux中的cu、屏幕或minicom来控制设备。我是通过一个内置的串行端口上的PC 19200,8N1连接。该设备的接口非常简单:

  • 输入"H",设备回显"H“。
  • 输入"V",设备回显一个包含其软件版本"ADD111C“的字符串。
  • 输入"S",设备根据打印机状态返回"0“、"1”或"?“。
  • 输入"Q",它将返回一个5行响应,其中包含最后处理的事务的详细信息。
  • 每次回复后都会有一条新的线路,也许也是一条CR,我不确定.

还有更多,但这是个好的开始。当我使用屏幕连接到设备时,它工作得很好:

代码语言:javascript
复制
root@dc5000:~# screen /dev/ttyS0 19200,cs8,-ixon,-ixoff

V
ADD111C

一旦我手动完成这个操作,我就尝试用C++和libserial编写一个简单的程序来与设备交互。看起来是这样的:

代码语言:javascript
复制
#include <SerialStream.h>
#include <string>
#include <iostream>
#include <fstream>

using namespace std;
using namespace LibSerial;

int main(){

    char next_char[100];
    int i;

    SerialStream my_serial_stream;
    my_serial_stream.Open("/dev/ttyS0") ;
    my_serial_stream.SetBaudRate( SerialStreamBuf::BAUD_19200 ) ;
    my_serial_stream.SetCharSize( SerialStreamBuf::CHAR_SIZE_8 ) ;
    my_serial_stream.SetFlowControl( SerialStreamBuf::FLOW_CONTROL_NONE ) ;
    my_serial_stream.SetParity( SerialStreamBuf::PARITY_NONE ) ;
    my_serial_stream.SetNumOfStopBits(1) ;
    my_serial_stream.SetVTime(1);
    my_serial_stream.SetVMin(100);

    cout<<"Sending Command:\n";
    my_serial_stream << "V";

    my_serial_stream.read(next_char,100);
    cout<<"Result: "<<next_char<<"\n";

    my_serial_stream.Close();

    return 0;
}

这可以成功地将"V“发送到串口,但当我将”V“读回时,我会得到一些非打印字符,返回到有效的数据之后:

代码语言:javascript
复制
root@dc5000:~# g++ -o serialtest serialtest.cpp -lserial
root@dc5000:~# ./serialtest 
Sending Command:
Result: 
V
ADD111C
��se�Xw��AN��ƿ,�
root@dc5000:~# 

我遗漏了什么,只抓取对我的查询的响应?我猜我需要在端口上冲洗一个缓冲区,但是我在这里的知识已经到了极限。

理想情况下,我只想得到"ADD111C",但我不想通过抓取特定长度的数据(以防将来发生变化)将自己画到一个角落里,并且读取结束处的垃圾似乎并不总是相同的长度,或相同的数据。

非常感谢你来看我,

汤姆

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-21 18:05:34

扎克:谢谢你的帮助。Zack关于在字符串末尾写NULL的建议解决了这个问题,但实际上我在处理另一个字符串时偶然发现了一个更简单的方法(试图获取输出的一个子字符串)。

而不是像这样定义C字符串:

char next_char[100];

我就是这样做的:

char next_char[100] = "";

似乎在读取串行端口之前为char分配一个值正确地终止了这个值。现在,我可以从代码中删除memset命令,它现在工作得很好:

root@dc5000:~# ./serialtest Sending Command: Result: V ADD111C

谢谢你的帮助!

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

https://stackoverflow.com/questions/21924343

复制
相关文章

相似问题

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