我正在尝试从正在嗅探标准收据打印机的COM端口读取数据。我正在使用MSDN中有关docs中找到的SerialPort.DataReceived
事件的示例。
我正在获取数据,但它是乱码。如何将其转换为可读文本?它是二进制编码还是什么?能否请您提供有关此类串口编程的见解?
我在互联网上搜索了几个小时,试图弄清楚如何使它成为可读文本,但我在A和B之间的某处缺少一些概念。
我在某个地方看过它可能是不匹配的协议。有没有办法检测到这个?
更新1
我正在尝试使用StackOverflow中的thread I found处的新内容(我使用的是Update 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();
}
答案 0 :(得分:2)
是的,你得到了很多字节,如果你注意你得到ascii数字。 5 0,6 5等是数据的标题。
首先你需要知道协议,但是如果你想要“读”那个,你必须转换它,而不是使用ToString,你需要使用:
Convert.ToBase64String(bytes)
答案 1 :(得分: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%20Programmers%20Guide.pdf
您应该做的是匹配您要求打印的内容(假设您有纸张输出)和发送的字节。你知道你应该得到什么作为打印输出。你知道它生成的字节,你消除了不能为你提供信息的重复内容。然后,您必须制定从剩下的内容到预期输出的规则。
它可以帮助您了解主机发送的内容以及打印机正在做的响应
顺序中的前几个字节似乎是:
(06, *) = Printer sends ACK (ID) after host send ENQ (id) to printer
(05, n) = Inquire Printer Status return codes
...