C# MSR206磁条串行端口通信

C# MSR206磁条串行端口通信,c#,serial-port,magnetic-cards,C#,Serial Port,Magnetic Cards,我正在使用与MSR206磁条读写器的串行端口通信,将一个遗留应用程序从vb6移植到c#。我可以在两种应用程序中成功重置、连接、闪烁指示灯、读取和写入设备,并使用MSR206附带的EZWriter软件验证正在读取/写入的数据 但是,我在协调程序员手册和通过串行端口接收的数据时遇到了问题 遗留应用程序将任何带有字节值/ASCII码94^的响应视为ACK。但是,用户手册没有提到这是一个有效的响应代码。另外,我认为ASCII码6是一个ACK。不管怎样,如果我把这个角色视为“成功”,一切都会成功 当我尝试

我正在使用与MSR206磁条读写器的串行端口通信,将一个遗留应用程序从vb6移植到c#。我可以在两种应用程序中成功重置、连接、闪烁指示灯、读取和写入设备,并使用MSR206附带的EZWriter软件验证正在读取/写入的数据

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

遗留应用程序将任何带有字节值/ASCII码94^的响应视为ACK。但是,用户手册没有提到这是一个有效的响应代码。另外,我认为ASCII码6是一个ACK。不管怎样,如果我把这个角色视为“成功”,一切都会成功

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

e、 g

“8.1 MSR 206初始化

命令代码:a(重置)

命令代码:e(串行端口测试)

响应:命令测试确认:y

命令代码:a(重置)”

当运行初始化时,我希望
字节[2]{27221}
,y)作为响应。相反,我得到:

发送:
字节[2]{27,97}
,a)
接收:
字节[1]{94}
(^)

发送:
字节[2]{27101}
,e)
接收:
字节[1]{94}
(^)

发送:
字节[2]{27,97}
,a)
接收:
字节[1]{94}
(^)

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

  • 命令:获取固件版本
  • 命令代码:v

    答复:[版本]

    描述:此命令可获取MSR206的固件版本。
    *[版本]是一个5字节的版本号,格式为“REV?X.XX”

    MSR206?=0 MSR206HC?=H MSR206HL?=U

    我只收到^和a

    发送:
    字节[2]{27118}
    ,v)
    接收:
    字节[2]{94161}
    (^,?)

    示例代码:

    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); 
        }
    }
    
    使用系统;
    使用System.IO.Ports;
    使用系统文本;
    使用系统线程;
    公共类MSR206测试
    {
    静态布尔继续;
    静态串行端口_SerialPort;
    公共静态void Main()
    {
    字符串消息;
    StringComparer StringComparer=StringComparer.OrdinalIgnoreCase;
    _serialPort=新的串行端口(“COM7”,9600,奇偶校验。无,8,停止位。1);
    _serialPort.DataReceived+=新的SerialDataReceivedEventHandler(端口\ DataReceived);
    _serialPort.Open();
    _继续=真;
    Console.WriteLine(“键入命令1到6或退出退出”);
    while(_continue)
    {
    message=Console.ReadLine();
    if(stringComparer.Equals(“退出”,消息))
    {
    _continue=false;
    }
    其他的
    {
    开关(信息)
    {
    案例“1”:
    控制台写入线(“发送ESC>重置”);
    _写入(新字节[]{27,97},0,2);
    打破
    案例“2”:
    Console.WriteLine(“2发送ESC>固件版本)”;
    _写入(新字节[]{27,118},0,2);
    打破
    案例“3”:
    控制台写入线(“3发送ESC>串口测试”);
    _写入(新字节[]{27,101},0,2);
    打破
    案例“4”:
    控制台写入线(“4发送ESC>ram测试”);
    _写入(新字节[]{27,87},0,2);
    打破
    案例“5”:
    控制台写入线(“5发送ESC>del)”;
    _写入(新字节[]{27,127},0,2);
    打破
    案例“6”:
    控制台写入线(“6 ESC>闪存)”;
    _写入(新字节[]{27,40},0,2);
    打破
    }
    }
    }
    _serialPort.Close();
    }
    公共静态无效端口\u DataReceived(对象发送方,SerialDataReceivedEventArgs e)
    {
    var bytes=_serialPort.BytesToRead;
    var buffer=新字节[字节];
    _读取(缓冲区,0,_serialPort.BytesToRead);
    for(var i=0;i

    我一定错过了一些简单的东西,因为我可以对卡进行编码和解码,我无法理解发生了什么/为什么输出与手册不匹配?

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