我正在尝试从正在嗅探标准收据打印机的 COM 端口读取数据。我正在使用 MSDN 中关于
docs中找到的
SerialPort.DataReceived
事件的示例。
我正在获取数据,但它是乱码。如何将其转换为可读文本?它是编码的二进制还是什么?
我在互联网上搜索过,试图找出如何使其可读的文本,但我遗漏了 A 和 B 之间的一些概念。
我在某处读过,可能是协议不匹配。有办法检测到吗?
更新1
我正在尝试从我在 Stack Overflow 上发现的线程中尝试一些新内容(我使用了更新 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();
}
首先你需要知道协议,但是如果你想“读取”它,你必须转换它,而不是使用ToString,你需要使用:
Convert.ToBase64String(bytes)
收据打印机不太可能需要字节来表达大多数收据上打印的有限字符集。一些货币符号、字母、数字和一些标点符号以及一些控制信息意味着它们可以很容易地适合 ASCII(7 位)。
您确实需要访问制造商网站(如果他们有)并下载技术手册或协议指南(如果他们有)。这通常非常棘手,因为并非所有制造商都可以在线获取此信息。您可能需要直接联系他们并让他们传真或邮寄给您一份协议规范的副本。
数据中有重复字符块,这些数据很可能告诉打印机正在发送另一个信息块或需要换行。这些可能发生在数据行的开头或结尾。例如,它们可能是指示打印机将打印头移回打印行开头并滚动纸张的指令,从而对设备执行 CR/LF 指令。
这种类型的事情取决于设备,设备规范会告诉您更多信息。您可能会认为这不是您要求打印的信息。
如果您无法获得协议文件,那么您只能依靠老式的侦探工作。
我可以告诉您,iTherm 使用字节中 ESC 字符 (27) 后面的一个或多个 ASCII 字符来执行各种操作。 更多信息可以在程序员指南中找到,网址为从第 62 页开始的 URL。
http://www.transact-tech.com/tsg/downloads/28-04430%20Rev%20K%20-%20Insert-M280%20POS%20Programmers%20Guide.pdf
您应该做的是匹配您要求打印的内容(假设您有纸张输出)和发送的字节。您知道应该得到什么作为打印输出。您知道它生成的字节,您可以消除那些不属于您的信息的重复内容。然后你必须制定出从你剩下的到你期望的输出的规则。它将帮助您了解主机正在发送什么以及打印机正在做什么响应
按顺序排列的前几个字节似乎是:
(06, *) = Printer sends ACK (ID) after host send ENQ (id) to printer
(05, n) = Inquire Printer Status return codes
...