2

我正在尝试从嗅探标准收据打印机的 COM 端口读取数据。我正在使用 MSDN 中有关在docsSerialPort.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();
   }
4

2 回答 2

2

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

首先你需要知道协议,但是如果你想“读取”它,你必须转换它,而不是使用 ToString,你需要使用:

 Convert.ToBase64String(bytes)
于 2012-08-09T13:16:57.033 回答
0

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

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

如果他们有,您确实需要访问制造商网站,如果他们有可用的,请下载技术手册或协议指南。这通常非常棘手,因为并非所有制造商都可以在线获取此信息。您可能必须直接与他们联系并让他们通过传真或邮寄给您一份协议规范的副本。

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

这种类型的东西取决于设备,设备规范会告诉你更多。您可能会假设这不是您要求打印的信息。

如果您无法获得协议文件,那么您只能依靠老式的侦探工作。

我可以告诉您,iTherm 在您的字节中使用一个或多个 ESC 字符 (27) 之后的 ASCII 字符来执行各种操作。更多信息可以在程序员指南中找到,网址从第 62 页开始。 http://www.transact-tech.com/tsg/downloads/28-04430%20Rev%20K%20-%20Insert-M280%20POS% 20程序员%20Guide.pdf

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

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

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

(06, *)  = Printer sends ACK (ID) after host send ENQ (id) to printer
(05, n)  = Inquire Printer Status return codes 
...
于 2012-08-12T09:36:19.923 回答