首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux下利用libserial向串行设备发送ASCII控制字符

Linux下利用libserial向串行设备发送ASCII控制字符
EN

Stack Overflow用户
提问于 2014-02-21 03:36:18
回答 1查看 2.6K关注 0票数 2

我有一个非常基本的设备,我正试图通过Linux上的串行连接与其进行交互。我在这里学习曲线的陡峭部分,仍然,所以请温柔!

其中一个功能涉及将数据发送到附加的打印机。您向设备发送命令,然后设备将输入的数据中继到附加到设备的打印机上。该命令如下所示:

  • 发送"EXEX*“。设备回显"EXEX“(”*“尚未回显)
  • 发送一个字节,表示要发送的数据的长度,包括末尾的LF。
  • 发送数据(设备现在将回显*)。
  • 发"#“。设备现在将准备好接受另一个命令。

我有一个小型的C++程序来与设备通信,我可以成功地发送单个字符等,但是当我尝试发送这个命令时,我没有得到预期的结果。

在Windows中使用超级终端,特别容易,使用alt键组合发送ASCII控制代码.只需连接并:

  • 输入"EXEX*“
  • 键入Alt+010以发送LF字符,指示要向打印机发送10个字节(9个字符和一个LF)。
  • 输入您希望发送的数据:"123456789“(长度为9个字节)。
  • 再次键入Alt+010将最终的LF字符发送到打印机。
  • 键入"#“以完成。

下面是我拼凑起来在C++中尝试的内容:

代码语言:javascript
复制
#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之间的字节,这取决于我希望发送到打印机的数据的长度。

我很抱歉我不清楚,如果我需要更多的话,请告诉我。

非常感谢,

汤姆

EN

回答 1

Stack Overflow用户

发布于 2014-02-21 04:57:48

您发送的行不包括您在字符序列中提到的#。

您是否检查过/dev/ttyS0上的串行通信,使用gtkterm / cutecom等?

要测试您的接口,您可以读取串口。如果您有第二个端口或计算机,则可以通过空调制解调器连接到另一个端口。否则,您可以缩短您的串口的引脚2和3,并检查您正在接收回您发送的字符。

您可能需要检查要对串行库进行的调用的返回值,以查看是否返回了任何错误。

也许打印机上有计时要求,您可能需要在发送一些字符之间等待。

我编译了代码并使用gtkterm检查了另一个串行端口上的输出,它确实收到了您期望的字符串:

45 58 45 58 2A 0A 31 32 - 33 34 35 36 37 38 38 39 0 A EXEX*.12 3456789

它不会影响代码的发送部分,但是接收看起来很可疑。如果read()成员函数类似于系统调用,如果next_char是一个字符数组,那么它将不为空终止字符串。相反,您必须查看返回值才能获得大小,如果要将其用作以空结尾的C字符串,则必须使用空终止。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21924798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档