我正在将旧的应用程序从vb6移植到c_,使用与MSR206磁条读写器的串行端口通信。我可以在两个应用程序中成功地重置、连接、闪光灯、读取和写入设备,以及验证使用MSR206附带的ezwriter软件读取/写入的数据。
但是,我在协调程序员手册和通过串行端口接收的数据时遇到问题。
遗留应用程序将字节值/ASCII代码94 ^的任何响应视为ACK。但是,用户手册没有将此作为有效的响应代码。另外,我认为ASCII代码6是一个ACK。不管怎样,如果我把这个角色视为“成功”,一切都会成功。
当我尝试执行这样的初始化操作时,我只收到一个字符作为响应,而不是手册输出的内容。
例如
“8.1 MSR 206初始化
命令代码:<Esc>A(重置)
命令代码:<esc>e(串行端口测试)
响应:命令测试确认:<Esc>Y
命令代码:<Esc>A(重置)“
当运行初始化时,我希望
byte[2] {27, 121}
(<esc>,y)作为响应。相反,我得到:
发送:
byte[2] {27, 97}
(<Esc>,A)
接收:
byte[1] {94}
(^)
发送:
byte[2] {27, 101}
(<Esc>、E)
接收:
字节[1]94
(^)
发送:
字节[2]27,97
(<Esc>,A)
接收:
字节[1]94
(^)
如果我尝试返回固件版本:
-
命令:获取固件版本
命令代码:<esc>v
响应:<Esc>[版本]
描述:此命令可以获取MSR206的固件版本。
*[版本]是5字节版本号,格式是__rev?X.XX__
MSR206?=0 msr206hc?=H MSR206HL?= U
我只收到^,和A?.
发送:
byte[2] {27, 118}
(<Esc>,v)
接收:
byte[2] {94, 161}
(^,?)
样本代码:
using System;
using System.IO.Ports;
using System.Text;
using System.Threading;
public class MSR206Test
{
static bool _continue;
static SerialPort _serialPort;
public static void Main()
{
string message;
StringComparer stringComparer = StringComparer.OrdinalIgnoreCase;
_serialPort = new SerialPort("COM7", 9600, Parity.None, 8, StopBits.One);
_serialPort.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
_serialPort.Open();
_continue = true;
Console.WriteLine("Type Command 1 to 6 or QUIT to exit");
while (_continue)
{
message = Console.ReadLine();
if (stringComparer.Equals("quit", message))
{
_continue = false;
}
else
{
switch (message)
{
case "1":
Console.WriteLine("Send ESC > reset");
_serialPort.Write(new byte[] { 27, 97 }, 0, 2);
break;
case "2":
Console.WriteLine("2 Sending ESC > firmware version)");
_serialPort.Write(new byte[] { 27, 118 }, 0, 2);
break;
case "3":
Console.WriteLine("3 Sending ESC > Serial port test)");
_serialPort.Write(new byte[] { 27, 101 }, 0, 2);
break;
case "4":
Console.WriteLine("4 Sending ESC > ram test)");
_serialPort.Write(new byte[] { 27, 87 }, 0, 2);
break;
case "5":
Console.WriteLine("5 Sending ESC > del)");
_serialPort.Write(new byte[] { 27, 127 }, 0, 2);
break;
case "6":
Console.WriteLine("6 ESC > flash)");
_serialPort.Write(new byte[] { 27, 40 }, 0, 2);
break;
}
}
}
_serialPort.Close();
}
public static void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
var bytes = _serialPort.BytesToRead;
var buffer = new byte[bytes];
_serialPort.Read(buffer, 0, _serialPort.BytesToRead);
for(var i = 0; i < buffer.Length; i++)
{
Console.WriteLine($"Response index ({i}) : " + buffer[i]);
}
var data = Encoding.ASCII.GetString(buffer);
Console.WriteLine($"Response ({buffer.Length}) : " + data);
}
}