代码之家  ›  专栏  ›  技术社区  ›  Jack

MSR206磁条串行端口通信

  •  0
  • Jack  · 技术社区  · 8 年前

    我正在将旧的应用程序从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 (^)

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

    1. 命令:获取固件版本

    命令代码:<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); 
        }
    }
    

    1 回复  |  直到 8 年前
        1
  •  0
  •   Jack    8 年前

    这是一个设备老化问题,看起来这个型号的固件不支持这些命令。我使用了一种新的磁条,它的功能与手册一致。 我已经联系了制造商,要求他们提供与此版本固件匹配的设备手册。