在Linux上使用libserial从串口读取额外字符

时间:2014-02-21 02:51:33

标签: c++ linux serial-port libserial

我有一个非常基本的设备,我试图通过Linux上的串行连接进行交互。我仍处于学习曲线的陡峭部分,所以请保持温柔!

无论如何,我可以通过Windows中的Hyperterminal或Linux中的cu,screen或minicom来控制设备。我通过PC上的内置串口连接19200,8N1。该设备的界面非常简单:

  • 键入“H”,设备回显“H”。
  • 键入“V”,设备回送包含其软件版本“ADD111C”的字符串。
  • 键入“S”,设备将返回“0”,“1”或“?”,具体取决于其打印机状态。
  • 键入“Q”,它会返回一个五行响应,其中包含有关上次处理的事务的详细信息。
  • 每个回复都跟着一个新行,也许是CR,我也不确定。

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

root@dc5000:~# screen /dev/ttyS0 19200,cs8,-ixon,-ixoff

V
ADD111C

一旦我手动工作,我尝试使用C ++和libserial编写一个简单的程序来与设备进行交互。它看起来像这样:

#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”发送到串口,但是当我读回它时,在有效数据之后我得到了许多非打印字符:

root@dc5000:~# g++ -o serialtest serialtest.cpp -lserial
root@dc5000:~# ./serialtest 
Sending Command:
Result: 
V
ADD111C
��se�Xw��AN��ƿ,�
root@dc5000:~# 

我只想抓住对查询的回复而错过了什么?我猜我需要在端口上刷一个缓冲区或其他东西,但我已经达到了我有限的知识的终点。

理想情况下,我想获得“ADD111C”,但我不想通过抓取特定长度的数据(以防将来发生变化)将自己描绘成一个角落,最后是垃圾读取的数据似乎并不总是相同或相同的数据。

非常感谢你看一看,

汤姆

1 个答案:

答案 0 :(得分:0)

Zack&amp;凯什拉姆:谢谢你的帮助。 Zack建议在字符串末尾写一个NULL解决了这个问题,但实际上我在使用另一个字符串(试图获取输出的子字符串)时偶然发现了一个更简单的方法。

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

char next_char[100];

我是这样做的:

char next_char[100] = "";

似乎在从串口正确读取之前为char赋值给null终止了它。我现在可以从我的代码中删除memset命令,现在它可以正常工作:

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

感谢您的帮助!