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 固件版本:

  1. 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); 
    }
}

我一定是遗漏了一些简单的东西,因为我可以对卡片进行编码和解码,但我无法理解发生了什么/为什么输出与手册不符?

这是一个设备年龄问题,看起来这个型号的固件不支持这些命令。我使用了一个新的磁条,它的功能与手册一致。 我已联系制造商获取与此修订版固件匹配的设备手册。