MSR206 磁条串口通信
MSR206 Magstripe serial port communication
我正在将遗留应用程序从 vb6 移植到 c#,使用与 MSR206 Magstripe 的串行端口通信 reader/writer。我可以在两个应用程序中成功重置、连接、闪光、读写设备,并使用 MSR206 附带的 EZWriter 软件验证数据 read/written。
但是,我在协调程序员手册与通过串行端口接收的数据时遇到了问题。
遗留应用程序将字节值/ASCII 代码 94 ^ 的任何响应视为 ACK。但是,用户手册并未提及此为有效的响应代码。另外,我认为 ASCII 码 6 是一个 ACK。无论哪种方式,如果我将此字符视为 "Success",一切正常。
当我尝试执行一个操作时,比如初始化,我只收到这个字符作为响应,而不是手册上说的输出。
例如
"8.1 MSR 206 INITIALIZATION
Command code: < ESC > a (Reset)
Command code: < ESC > e (Serial port test)
Response : Command test ACK: < ESC >y
Command code: < ESC > a (Reset)"
当 运行 初始化时,我期望 byte[2] {27, 121}
(< ESC >, y) 作为响应。相反,我得到:
发送:byte[2] {27, 97}
(,a)
接收:byte[1] {94}
(^)
发送:byte[2] {27, 101}
(< ESC >, e)
接收:byte[1] {94}
(^)
发送:byte[2] {27, 97}
(,a)
接收:byte[1] {94}
(^)
如果我尝试 return 固件版本:
- Command: Get firmware version
Command code: < ESC > v
Response: < ESC > [version]
Description: This command can get the firmware version of MSR206.
* [version] is a 5 bytes version number, format is “ REV?X.XX “
MSR206? = 0 MSR206HC? = H MSR206HL? = U
我只收到^和?。
发送: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);
}
}
我一定是遗漏了一些简单的东西,因为我可以对卡片进行编码和解码,但我无法理解发生了什么/为什么输出与手册不符?
这是一个设备年龄问题,看起来这个型号的固件不支持这些命令。我使用了一个新的磁条,它的功能与手册一致。
我已联系制造商获取与此修订版固件匹配的设备手册。
我正在将遗留应用程序从 vb6 移植到 c#,使用与 MSR206 Magstripe 的串行端口通信 reader/writer。我可以在两个应用程序中成功重置、连接、闪光、读写设备,并使用 MSR206 附带的 EZWriter 软件验证数据 read/written。
但是,我在协调程序员手册与通过串行端口接收的数据时遇到了问题。
遗留应用程序将字节值/ASCII 代码 94 ^ 的任何响应视为 ACK。但是,用户手册并未提及此为有效的响应代码。另外,我认为 ASCII 码 6 是一个 ACK。无论哪种方式,如果我将此字符视为 "Success",一切正常。
当我尝试执行一个操作时,比如初始化,我只收到这个字符作为响应,而不是手册上说的输出。
例如
"8.1 MSR 206 INITIALIZATION
Command code: < ESC > a (Reset)
Command code: < ESC > e (Serial port test)
Response : Command test ACK: < ESC >y
Command code: < ESC > a (Reset)"
当 运行 初始化时,我期望 byte[2] {27, 121}
(< ESC >, y) 作为响应。相反,我得到:
发送:byte[2] {27, 97}
(
接收:byte[1] {94}
(^)
发送:byte[2] {27, 101}
(< ESC >, e)
接收:byte[1] {94}
(^)
发送:byte[2] {27, 97}
(
接收:byte[1] {94}
(^)
如果我尝试 return 固件版本:
- Command: Get firmware version
Command code: < ESC > v
Response: < ESC > [version]
Description: This command can get the firmware version of MSR206.
* [version] is a 5 bytes version number, format is “ REV?X.XX “MSR206? = 0 MSR206HC? = H MSR206HL? = U
我只收到^和?。
发送: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);
}
}
我一定是遗漏了一些简单的东西,因为我可以对卡片进行编码和解码,但我无法理解发生了什么/为什么输出与手册不符?
这是一个设备年龄问题,看起来这个型号的固件不支持这些命令。我使用了一个新的磁条,它的功能与手册一致。 我已联系制造商获取与此修订版固件匹配的设备手册。