智能卡读卡器出现问题。 Reader通过Usb-to-serial转换器连接到pc。无法从读者那里读到任何东西。
...
static void Main(string[] args)
{
byte[] data = new byte[256];
byte[] recived = new byte[256];
data[0] = 0x00;
data[1] = 0xA4;
data[2] = 0x04;
data[3] = 0x00;
data[4] = 0x00;
data[5] = 0x00;
data[6] = 0x00;
System.IO.Ports.SerialPort sp = new System.IO.Ports.SerialPort("COM4", 38400, System.IO.Ports.Parity.None, 8, System.IO.Ports.StopBits.One);
sp.WriteTimeout = 300;
sp.ReadTimeout = 300;
sp.DataReceived += Sp_DataReceived;
sp.ErrorReceived += Sp_ErrorReceived;
if (sp.IsOpen)
{sp.Close();}
sp.Open();
try {
sp.Write(data, 0, 7);
int bt = sp.ReceivedBytesThreshold;
sp.Read(recived, 0, bt);
if (bt != 0)
{ Console.WriteLine(bt.ToString());
Console.ReadKey();}
} catch (Exception ex){
Console.WriteLine(ex.Message);
Console.ReadKey();}
}
private static void Sp_ErrorReceived(object sender, System.IO.Ports.SerialErrorReceivedEventArgs e)
{Console.ReadKey();}
private static void Sp_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{Console.ReadKey();}
}
}
代码不执行任何操作,就好像系统中没有读卡器一样。
答案 0 :(得分:0)
好吧,首先,在向读者发送内容后,您将附加事件处理程序。这不好。我建议完全初始化SerialPort
实例(设置,附加事件等)和之后,打开连接并进行通信。
您的应用程序也不会等待。如果使用异步通信(通过定义DataReceived
事件),则需要确保应用程序实际循环并等待。
您的控制台应用程序不会这样做。它将某些内容写入串行端口,然后在退出Main
方法时退出。如果您希望得到答案,您需要决定:
请:不要把两者混在一起!我看到很多代码,DataReceived
中的人写了一个循环,因为他们不能一次性获取所有信息。不要那样做。而是构建一个缓冲区并检查它是否完整传输。 Read
中没有DataReceived
!
以下代码可能有效。它不会实现异步变体,而是阻塞,同步方法:
static void Main(string[] args)
{
byte[] data = new byte[256];
byte[] recived = new byte[256];
data[0] = 0x00;
data[1] = 0xA4;
data[2] = 0x04;
data[3] = 0x00;
data[4] = 0x00;
data[5] = 0x00;
data[6] = 0x00;
using (System.IO.Ports.SerialPort sp = new System.IO.Ports.SerialPort("COM4", 38400, System.IO.Ports.Parity.None, 8, System.IO.Ports.StopBits.One))
{
try
{
sp.Open();
sp.Write(data, 0, 7);
int bytesRead = sp.Read(recived, 0, received.Length);
if (bytesRead != 0)
{
string s = Encoding.ASCII.GetString(received, 0, bytesRead);
Console.WriteLine(s);
Console.ReadKey();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.ReadKey();
}
}
}
如果 在控制台上没有显示任何结果,则可能有多种错误原因,包括: