串行通信问题 C#
本文关键字:问题 通信 | 更新日期: 2023-09-27 18:31:19
我的控制台应用程序遇到了一些问题。我正在尝试从条形码扫描仪的串行连接中检索数据。
问题是:- 初读是完美的;- 第二次读取结果不正确,除非我等待大约一分钟。
这是代码:
using System;
using System.IO.Ports;
class PortDataReceived
{
public static void Main()
{
SerialPort mySerialPort = new SerialPort("COM10");
mySerialPort.BaudRate = 9600;
mySerialPort.Parity = Parity.None;
mySerialPort.StopBits = StopBits.One;
mySerialPort.DataBits = 8;
mySerialPort.Handshake = Handshake.RequestToSend;
mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
mySerialPort.Open();
Console.WriteLine("Press any key to continue...");
Console.WriteLine();
Console.ReadKey();
mySerialPort.Close();
}
private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
Console.WriteLine("Data Received:");
Console.WriteLine(indata);
}
}
这是对同一条形码进行 2 次读取的结果,从第一次读取到第二次读取没有等待足够的时间:
Press any key to continue...
Data Received:
229000400718
Data Received:
2
Data Received:
2
Data Received:
9
Data Received:
0
Data Received:
0
Data Received:
0
Data Received:
4
Data Received:
0
Data Received:
0
Data Received:
7
Data Received:
1
Data Received:
8
有什么建议吗?
提前感谢!
似乎第二次读取的数据以字符为单位,因此我将使用 StringBuilder b 并附加传入数据,直到收到有效的条形码并包含在 b 中(即根据数据库检查有效性)
我建议这样:
private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
StringBuilder b = new StringBuilder();
while(!IsValidBarcode(b.ToString()))
{
b.Append(sp.ReadExisting());
}
Console.WriteLine("Data Received:");
Console.WriteLine(b.ToString());
}
private static Boolean IsValidBarcode(String s)
{
if (String.IsNullOrEmpty(s)) return false;
// (1) Query a database for expected barcodes ...
// (2) Check s for Start-Stop-Characters ...
// (3) Query the device for completed barcode ...
throw new NotImplementedException();
}
或者这个
private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
StringBuilder b = new StringBuilder();
Thread.Sleep(1000); // 1 second delay for testing purposes
b.Append(sp.ReadExisting());
Console.WriteLine("Data Received:");
Console.WriteLine(b.ToString());
}
您需要某种计时器来检查正在读取的多个字符是单个读取的一部分,还是它们是 2 个不同的扫描。 第二次扫描触发事件之间的时间可能很短,只需设置一个计时器在事件触发后启动,如果它在下一个事件之前过期,那么它是条形码的结束,如果没有将读取附加到前一个(使用某种缓冲区)。
您需要有一个结束字符才能知道消息何时完成。大多数人使用'r'n (13,10)
并从串行端口读取到行尾(即''r')。
你得到了每个角色的一个事件,但阅读速度太快了。
Luca Pillin,我刚刚包含了 thread.sleep 3 秒钟,它解决了这个问题
using System;
using System.Threading;
using System.IO.Ports;
class PortDataReceived
{
public static void Main()
{
SerialPort mySerialPort = new SerialPort("COM2");
mySerialPort.BaudRate = 9600;
mySerialPort.Parity = Parity.None;
mySerialPort.StopBits = StopBits.One;
mySerialPort.DataBits = 8;
mySerialPort.Handshake = Handshake.RequestToSend;
mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
mySerialPort.Open();
Console.WriteLine("Press any key to continue...");
Console.WriteLine();
Console.ReadKey();
mySerialPort.Close();
}
private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
//
string indata = string.Empty;
SerialPort sp = (SerialPort)sender;
**Thread.Sleep(3000);**
indata = sp.ReadExisting();
Console.WriteLine("Data Received:");
Console.WriteLine(indata);
}
}