我有一个非常基本的设备,我试图通过Linux上的串行连接进行交互。我仍处于学习曲线的陡峭部分,所以请保持温柔!
其中一项功能涉及将数据发送到连接的打印机。您向设备发送命令,然后将输入的数据中继到连接到设备的打印机。该命令如下所示:
我有一个小的C ++程序与设备通信,我可以成功发送单个字符等,但是当我尝试发送此命令时,我没有得到预期的结果。
在Windows中使用Hyperterminal,使用alt-key组合发送ASCII控制代码特别容易。只需连接并:
以下是我拼凑在一起尝试使用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: %s\n",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*\n123456789\n#";
my_serial_stream.read(next_char,100);
cout<<"Result: "<<next_char<<"\n";
my_serial_stream.Close();
return 0;
}
我也试过两条注释掉的线,但都没有用。设备在另一端没有收到正确的字符。'
我确定这是非常基本的,也许是抓住中间的控制角色?如果有人对更好的方法有任何想法,我会非常感激。具体来说,我可能需要发送一个值为1到40之间的字节,具体取决于我希望发送给打印机的数据长度。
我不清楚道歉,如果我需要进一步打破这一点,请告诉我。
非常感谢,
汤姆
答案 0 :(得分:0)
您发送的行不包含您在字符序列中提到的#。
您是否使用gtkterm / cutecom等检查了串口通讯是否适用于/ dev / ttyS0?
要测试您的界面,您可以回读串口。如果您有第二个端口或计算机,则可以通过空调制解调器连接到另一个端口来实现。否则,您可以缩短串行端口的引脚2和3,并检查是否收到了发送的字符。
您可能需要检查要对串行库进行的调用的返回值,以查看是否返回任何错误。
也许打印机有定时要求,您可能需要等待发送一些字符。
我编译了代码并使用gtkterm检查了另一个串口的输出,它确实收到了你期望的字符串:
45 58 45 58 2A 0A 31 32 - 33 34 35 36 37 38 39 0A EXEX * .12 3456789。
它不会影响代码的发送部分,但接收看起来很可疑。如果read()成员函数与系统调用类似,并且如果next_char是字符数组,那么它将不会null终止字符串。相反,您必须查看返回值以获取大小,然后如果要将其用作以null结尾的C字符串,则返回null。