簡體   English   中英

MSR206 Magstripe串行端口通信

[英]MSR206 Magstripe serial port communication

我正在使用與MSR206 Magstripe讀/寫器的串行端口通信將舊版應用程序從vb6移植到c#。 我可以在兩個應用程序中成功重置,連接,閃光燈,對設備進行成功的讀寫,並驗證MSR206隨附的EZWriter軟件正在讀取/寫入的數據。

但是,我在將程序員手冊與通過串行端口接收的數據相協調時遇到了問題。

舊版應用程序將字節值/ 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的固件版本。
* [version]是5字節的版本號,格式為“ 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); 
    }
}

我必須缺少一些簡單的東西,因為我可以對卡進行編碼和解碼,所以我對發生的事情不了解/為什么輸出與手冊不匹配?

這是設備壽命的問題,看起來該型號的固件不支持這些命令。 我使用了一個新的磁條,其功能與手冊相同。 我已與制造商聯系,以獲取與此版本固件匹配的設備手冊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM