我有一个非常基本的设备,我正试图通过Linux上的串行连接与其进行交互。我在这里学习曲线的陡峭部分,仍然,所以请温柔!
无论如何,我能够通过Windows中的超级终端控制设备,或者通过Linux中的cu、屏幕或minicom来控制设备。我是通过一个内置的串行端口上的PC 19200,8N1连接。该设备的接口非常简单:
还有更多,但这是个好的开始。当我使用屏幕连接到设备时,它工作得很好:
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“发送到串口,但当我将”V“读回时,我会得到一些非打印字符,返回到有效的数据之后:
root@dc5000:~# g++ -o serialtest serialtest.cpp -lserial
root@dc5000:~# ./serialtest
Sending Command:
Result:
V
ADD111C
��se�Xw��AN��ƿ,�
root@dc5000:~# 我遗漏了什么,只抓取对我的查询的响应?我猜我需要在端口上冲洗一个缓冲区,但是我在这里的知识已经到了极限。
理想情况下,我只想得到"ADD111C",但我不想通过抓取特定长度的数据(以防将来发生变化)将自己画到一个角落里,并且读取结束处的垃圾似乎并不总是相同的长度,或相同的数据。
非常感谢你来看我,
汤姆
发布于 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
谢谢你的帮助!
https://stackoverflow.com/questions/21924343
复制相似问题