在Linux上使用libserial将ASCII控制字符发送到串行设备
Sending ASCII Control Characters to Serial Device using libserial on Linux
我有一个非常基本的设备,我正试图在Linux上通过串行连接与它进行交互。我仍然处于学习曲线的陡峭部分,所以请温柔一点!
其中一个功能涉及将数据发送到连接的打印机。您向设备发送命令,然后设备将您输入的数据中继到连接到设备的打印机。命令如下:
- 发送"EXEX*"。设备回显"EXEX"("*"尚未回显)
- 发送一个字节,指示您将发送的数据的长度,包括末尾的LF
- 发送数据(设备现在将回显*)
- 发送"#"。设备现在可以接受另一个命令了
我有一个小C++程序来与设备通信,我可以成功地发送单个字符等,但当我尝试发送此命令时,我没有得到预期的结果。
在Windows中使用超级终端,使用alt组合键发送ASCII控制码特别容易。只需连接即可:
- 键入"EXEX*">
- 键入Alt+010发送一个LF字符,表示您正在向打印机发送10个字节(9个字符和一个LF)
- 键入要发送的数据:"123456789"(长度为9个字节)
- 再次键入Alt+010将最后一个LF字符发送到打印机
- 键入"#"完成
以下是我拼凑起来在C++中尝试的内容:
#include <SerialStream.h>
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
using namespace LibSerial;
int main(){
char buffer [50];
int n;
n=sprintf (buffer, "EXEX*%c123456789%c#",10,10);
printf("Variable buffer was set to a %d character string: %sn",n,buffer);
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 << buffer;
//my_serial_stream << printf("%s",buffer);
//my_serial_stream << "EXEX*n123456789n#";
my_serial_stream.read(next_char,100);
cout<<"Result: "<<next_char<<"n";
my_serial_stream.Close();
return 0;
}
我还尝试了两条注释出来的行,但都不起作用。设备在另一端没有接收到正确的字符。'
我确信这是非常基本的,也许是什么东西抓住了中间的控制字符?如果有人对更好的方法有任何想法,我将不胜感激。具体来说,我可能需要发送一个值在1到40之间的字节,这取决于我希望发送到打印机的数据的长度。
我很抱歉说不清楚,如果我需要进一步细分,请告诉我。
非常感谢,
Tom
您发送的行不包括您在字符序列中提到的#。
您是否使用gtkterm/cutecom等检查了/dev/ttyS0上的串行通信工作情况?
要测试你的接口,你可以读回串行端口。如果你有第二个端口或计算机,你可以通过空调制解调器连接到另一个端口。否则,您可以缩短串行端口的引脚2和3,并检查您是否收到了发送的字符。
您可能需要检查要对串行库进行的调用的返回值,以查看是否返回了任何错误。
打印机可能有时间要求,您可能需要在发送某些字符之间等待。
我编译了代码,并用gtkterm检查了另一个串行端口上的输出,它确实收到了您期望的字符串:
45 58 45 58 2A 0A 31 32-33 34 36 37 38 39 0A exexex*。12 3456789。
它不会影响代码的发送部分,但接收看起来很可疑。如果read()成员函数类似于系统调用,并且next_char是一个字符数组,那么它不会以null终止字符串。相反,您必须查看返回值以获得大小,如果要将其用作以null结尾的C字符串,则必须终止null。
- C++,在int数组中输入字符串或字符会输出0,而不是ascii或error
- xcode 从源代码中删除奇怪的控制字符
- 在控制台中以C++打印(并存储)高 ASCII 字符 (╔)
- 读取字符 ASCII 值并将其记录到矢量
- QTEXTEDIT更改控制字符
- 在Linux上使用libserial将ASCII控制字符发送到串行设备
- 如何以可读格式打印控制字符
- 如何在C++中读取带有ifstream的替换字符?(ASCII 中的 SUB)
- C 逃脱控制字符
- 使用退格控制字符擦除
- 在发送数据之前压缩数据 - 控制字符
- 如何通过C++代码在MySQL数据库中存储控制字符
- 将文件从客户端传输到服务器时缺少字节,字节值也表示一些控制字符
- 由于隐藏/控制字符,在C++中读取文本文件的行失败
- 如何在c++中打印/cout不可打印/控制字符
- 如何将十六进制值转换为ASCII控制字符的首字母缩略词
- Qt, c++ -从文件中读取控制字符
- getline和控制字符
- string控制字符:将十六进制数字赋给字符串
- 将控制字符传递给字符数组