我有一个非常基本的设备,我试图通过 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”,但我不想通过抓取特定长度的数据(以防将来发生变化)和读取结束时的垃圾来将自己描绘成一个角落似乎并不总是相同的长度或相同的数据。
非常感谢您的观看,
汤姆