MSR206 Magstripe последовательный порт связи - PullRequest
0 голосов
/ 27 мая 2018

Я портирую устаревшее приложение с vb6 на c #, используя связь через последовательный порт с устройством чтения / записи MSR206 Magstripe.Я могу выполнить сброс, подключиться, мигать, прочитать и записать на устройство успешно в обоих приложениях и проверить данные, считываемые / записываемые с помощью программного обеспечения EZWriter, поставляемого с MSR206.

Однако у меняпроблемы при согласовании руководства программиста с данными, полученными через последовательный порт.

Устаревшее приложение обрабатывает любой ответ со значением байта / кодом ASCII 94 ^ как ACK.Однако в руководстве пользователя это не упоминается как действительный код ответа.Кроме того, я думал, что код 6 ASCII - это ACK.В любом случае, если я рассматриваю этот символ как «Успех», все работает.

Когда я пытаюсь выполнить операцию, такую ​​инициализацию, я получаю только этот один символ в качестве ответа, а не то, что выводит руководствоговорит.

например,

"8.1 ИНИЦИАЛИЗАЦИЯ MSR 206

Код команды: a (Сброс)

Код команды: e (Тест последовательного порта)

Ответ: Командный тест ACK: y

Код команды: a (Сброс) "

Когдапри инициализации я бы ожидал byte[2] {27, 121} (, y) в качестве ответа.Вместо этого я получаю:

Отправка: byte[2] {27, 97} (, a)
Получение: byte[1] {94} (^)

Отправка: byte[2] {27, 101} (,e)
Получите: byte[1] {94} (^)

Отправьте: byte[2] {27, 97} (, a)
Получите: byte[1] {94} (^)

Если япопробуйте вернуть версию прошивки:

Команда: Получить версию прошивки

Код команды: v

Ответ: [версия]

Описание: Эта команда может получитьверсия прошивки MSR206.
* [версия] - это 5-байтовый номер версии, формат «REV? X.XX»

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

Я получаю только ^ и a?.

Отправка: byte[2] {27, 118} (, 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 Ответ

0 голосов
/ 29 мая 2018

Это проблема возраста устройства, не похоже, что прошивка на этой модели поддерживает эти команды.Я использовал новую магнитную полосу, и она работает в соответствии с руководством.Я обратился к производителю за руководством по устройству, которое соответствует этой версии прошивки.

...