Я портирую устаревшее приложение с 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);
}
}
Я, должно быть, упускаю что-то простое, так как я могу кодировать и декодировать карты, я просто не могу понять, что происходит / почему вывод не 'не соответствует инструкции?