首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MSR206磁条串口通信

MSR206磁条串口通信
EN

Stack Overflow用户
提问于 2018-05-26 22:33:47
回答 1查看 400关注 0票数 0

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

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

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

当我尝试执行这样的初始化操作时,我只接收到这一个字符作为响应,而不是手动显示的输出。

例如:

"8.1 MSR 206初始化 命令代码:< ESC >a(重置) 命令代码:< ESC >e(串口测试) 响应:命令测试ACK:< 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)

接收:byte[1] {94} (^)

发送:byte[2] {27, 97} (< ESC >,a)

接收:byte[1] {94} (^)

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

  1. 命令:获取固件版本

命令代码:< ESC >v

答复:< ESC >版本

描述:这个命令可以获得MSR206的固件版本。

*版本为5字节版本号,格式为“REV?X.XX”

MSR206 =0 MSR206HC?=H MSR206HL?=U

我只收到^,和?

发送:byte[2] {27, 118} (< ESC >,v)

接收:byte[2] {94, 161} (^,?)

样本代码:

代码语言:javascript
运行
复制
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); 
    }
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-29 08:57:09

这是一个设备年龄问题,看起来这个模型上的固件不支持这些命令。我使用了一个新的磁条,它的功能按照手册。我已经接触到制造商的设备手册,以配合这个修订固件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50547531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档