我有一个非常基本的设备,我试图通过Linux上的串行连接进行交互。我仍处于学习曲线的陡峭部分,所以请保持温柔!
无论如何,我可以通过Windows中的Hyperterminal或Linux中的cu,screen或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”发送到串口,但是当我读回它时,在有效数据之后我得到了许多非打印字符:
root@dc5000:~# g++ -o serialtest serialtest.cpp -lserial
root@dc5000:~# ./serialtest
Sending Command:
Result:
V
ADD111C
��se�Xw��AN��ƿ,�
root@dc5000:~#
我只想抓住对查询的回复而错过了什么?我猜我需要在端口上刷一个缓冲区或其他东西,但我已经达到了我有限的知识的终点。
理想情况下,我想获得“ADD111C”,但我不想通过抓取特定长度的数据(以防将来发生变化)将自己描绘成一个角落,最后是垃圾读取的数据似乎并不总是相同或相同的数据。
非常感谢你看一看,
汤姆
答案 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
感谢您的帮助!