C# MSR206磁条串行端口通信
我正在使用与MSR206磁条读写器的串行端口通信,将一个遗留应用程序从vb6移植到c#。我可以在两种应用程序中成功重置、连接、闪烁指示灯、读取和写入设备,并使用MSR206附带的EZWriter软件验证正在读取/写入的数据 但是,我在协调程序员手册和通过串行端口接收的数据时遇到了问题 遗留应用程序将任何带有字节值/ASCII码94^的响应视为ACK。但是,用户手册没有提到这是一个有效的响应代码。另外,我认为ASCII码6是一个ACK。不管怎样,如果我把这个角色视为“成功”,一切都会成功 当我尝试执行一个操作时,比如初始化,我只收到这一个字符作为响应,而不是手册上所说的输出 e、 g “8.1 MSR 206初始化 命令代码:C# MSR206磁条串行端口通信,c#,serial-port,magnetic-cards,C#,Serial Port,Magnetic Cards,我正在使用与MSR206磁条读写器的串行端口通信,将一个遗留应用程序从vb6移植到c#。我可以在两种应用程序中成功重置、连接、闪烁指示灯、读取和写入设备,并使用MSR206附带的EZWriter软件验证正在读取/写入的数据 但是,我在协调程序员手册和通过串行端口接收的数据时遇到了问题 遗留应用程序将任何带有字节值/ASCII码94^的响应视为ACK。但是,用户手册没有提到这是一个有效的响应代码。另外,我认为ASCII码6是一个ACK。不管怎样,如果我把这个角色视为“成功”,一切都会成功 当我尝试
字节[2]{27221}
(字节[2]{27,97}
(接收:
字节[1]{94}
(^)
发送:字节[2]{27101}
(接收:
字节[1]{94}
(^)
发送:字节[2]{27,97}
(接收:
字节[1]{94}
(^)
如果我尝试返回固件版本:
*[版本]是一个5字节的版本号,格式为“REV?X.XX” MSR206?=0 MSR206HC?=H MSR206HL?=U 我只收到^和a 发送:
字节[2]{27118}
(接收:
字节[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
我一定错过了一些简单的东西,因为我可以对卡进行编码和解码,我无法理解发生了什么/为什么输出与手册不匹配?这是一个设备时代的问题,它看起来不像这个型号的固件支持这些命令。我使用了一个新的磁条,它的功能与手册一致。 我已经联系了制造商,以获取与此版本固件匹配的设备手册