繁体   English   中英

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

[英]Extra Characters Reading from Serial Port Using libserial on Linux

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

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

  • 输入“ 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”,但我不想通过获取特定长度的数据(以防将来发生更改)以及在读取结束时产生垃圾来使自己陷入困境似乎并不总是相同的长度或相同的数据。

非常感谢您的关注,

汤姆

Zack&keshlam:谢谢您的帮助。 Zack的建议在字符串的末尾写一个NULL解决了这个问题,但实际上我在使用另一个字符串时遇到了一个更简单的方法(试图获取输出的子字符串)。

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

char next_char[100];

我这样做是这样的:

char next_char[100] = "";

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

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

谢谢您的帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM