Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 收据打印机嗅探器_C#_Printing_Serial Port - Fatal编程技术网

C# 收据打印机嗅探器

C# 收据打印机嗅探器,c#,printing,serial-port,C#,Printing,Serial Port,我正在尝试从一个COM端口读取数据,该端口正在嗅探标准收据打印机。我使用的是MSDN中关于在中找到的SerialPort.DataReceived事件的示例 我得到了数据,但都是乱码。如何将其转换为可读文本?它是二进制编码还是什么?你能提供这种串口编程的见解吗 我在互联网上搜索了几个小时,试图找出如何使它成为可读的文本,但我在A和B之间遗漏了一些概念 我在某个地方读到,可能是协议不匹配。有没有办法检测到这一点 更新1 我正在StackOverflow尝试一些新的东西(我使用了更新1),我不确定

我正在尝试从一个COM端口读取数据,该端口正在嗅探标准收据打印机。我使用的是MSDN中关于在中找到的
SerialPort.DataReceived
事件的示例

我得到了数据,但都是乱码。如何将其转换为可读文本?它是二进制编码还是什么?你能提供这种串口编程的见解吗

我在互联网上搜索了几个小时,试图找出如何使它成为可读的文本,但我在A和B之间遗漏了一些概念

我在某个地方读到,可能是协议不匹配。有没有办法检测到这一点

更新1

我正在StackOverflow尝试一些新的东西(我使用了更新1),我不确定我现在看到的是什么,但我没有看到更多奇怪的字符:

那么如何从这里获取可读文本呢

更新2

我还是有点困惑

  private static void port_OnReceiveDatazz(object sender,
                              SerialDataReceivedEventArgs e)
   {
       SerialPort spL = (SerialPort)sender;
       byte[] buf = new byte[spL.BytesToRead];
       Console.WriteLine("DATA RECEIVED!");
       spL.Read(buf, 0, buf.Length);
       Console.WriteLine(Convert.ToBase64String(buf));
       foreach (Byte b in buf)
       {
           //Console.Write(b.ToString());
       }
       Console.WriteLine();
   }


是的,你会得到很多字节,如果你注意的话,你会得到ascii码。5 0、6 5等是数据的标题

首先,您需要了解协议,但如果您想“读取”该协议,则必须将其转换,而不是使用ToString,您需要使用:

 Convert.ToBase64String(bytes)

不确定是否存在“标准”收据打印机,因为即使对于同一制造商,这些设备在不同型号之间的功能也会有所不同,它们在制造商之间肯定会有所不同

收据打印机不太可能需要字节来表示大多数收据上打印的有限字符集。一些货币符号、字母、数字和一些标点符号以及一些控制信息意味着这些可以很好地融入ASCII(7位)

如果制造商有网站,您确实需要访问他们的网站,如果他们有,请下载技术手册或协议指南。这通常是相当棘手的,因为并非所有制造商都能在线获得这些信息。您可能需要直接联系他们,让他们传真或邮寄协议规范的副本

数据中有重复字符块,这些字符很可能是告诉打印机正在发送另一个信息块或需要新行的数据。这些可能发生在数据行的开始或结束处。例如,它们可能是指示打印机将打印头移回打印行的开头并滚动纸张的指令,实际上是设备的CR/LF指令

这类事情取决于设备,设备规范将告诉您更多信息。您可能会认为这不是您要求打印的信息

如果你不能得到一份协议文件,那么好的老式侦探工作是你唯一可以依靠的

我可以告诉您,iTherm在字节中的ESC字符(27)后面使用一个或多个ASCII字符来执行各种操作。更多信息可以在程序员指南中找到,网址从第62页开始。

您应该做的是匹配您要求打印的内容(假设您有纸张输出)和发送的字节。你知道你应该得到什么作为打印输出。你知道它产生了什么,你消除了重复的东西,这些东西不可能是你的信息。然后,您必须制定规则,从您剩余的内容到您期望的输出

它将帮助您了解主机正在发送什么以及打印机正在做什么响应

按顺序排列的前几个字节似乎是:

(06, *)  = Printer sends ACK (ID) after host send ENQ (id) to printer
(05, n)  = Inquire Printer Status return codes 
...

我会参考打印机上的文档。它应该解释发送的数据。串口类只是读取数据,不管数据是什么,它都不会为您进行任何转换。此外,请检查您的数据速率、位数、奇偶校验和停止位是否与打印机使用的数据匹配。如果其中任何一个不匹配,您将看到垃圾数据。如果不了解打印机协议,您将无法轻松理解数据。它是什么型号的打印机?我想你可以从开始。看起来像“普通垃圾”-每一个都以“黑桃俱乐部空间箭头”(这是我的名字)开始,以钻石结束。看起来像是protcol分隔符。我会用十六进制将分隔符之间的所有内容转储,看看你是否能找出什么。这似乎是一个特定的协议,你有关于这方面的手册吗?当然06是ACK等,是ascii表。在某些文件上一定有一些关于这方面的信息。如果你有,请发布一个链接。或者请与我联系,提供我的个人资料详细信息,我很乐意帮助你,我在这种通信方面做了很多工作。顺便说一句,试着转换每个字节,而不是缓冲区