0

我正在将旧版应用程序从 vb6 移植到 c#,使用与 MSR206 Magstripe 读/写器的串行端口通信。我可以在两个应用程序中成功地重置、连接、闪光、读取和写入设备,并使用 MSR206 附带的 EZWriter 软件验证正在读取/写入的数据。

但是,我在协调程序员手册与通过串行端口接收的数据时遇到了问题。

遗留应用程序将任何具有字节值/ASCII 代码 94 ^ 的响应视为 ACK。但是,用户手册并未将其作为有效的响应代码提及。另外,我认为 ASCII 代码 6 是一个 ACK​​。无论哪种方式,如果我将此角色视为“成功”,那么一切正常。

当我尝试执行一项操作时,例如初始化,我只收到这个字符作为响应,而不是手册所说的输出。

例如

"8.1 MSR 206 初始化

命令码:<ESC>a(复位)

命令码:<ESC>e(串口测试)

响应:命令测试 ACK:< ESC >y

命令代码:< ESC > a (Reset)"

运行初始化时,我希望byte[2] {27, 121} (< ESC >, y) 作为响应。相反,我得到:

发送: byte[2] {27, 97}(< ESC >, a)
接收: byte[1] {94} (^)

发送: byte[2] {27, 101}(< ESC >, e)
接收: byte[1] {94} (^)

发送: byte[2] {27, 97}(< ESC >, a)
接收: byte[1] {94} (^)

如果我尝试返回固件版本:

  1. 命令:获取固件版本

命令代码:<ESC> v

响应:<ESC> [版本]

说明:该命令可以获取MSR206的固件版本。
* [version]为5字节的版本号,格式为“REV?X.XX”</p>

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

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

4

1 回答 1

0

这是设备老化问题,此型号上的固件似乎不支持这些命令。我使用了一个新的磁条,它按照手册运行。我已联系制造商以获取与此版本固件匹配的设备手册。

于 2018-05-29T08:57:09.063 回答