串行通信问题 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

有什么建议吗?

提前感谢!

串行通信问题 C#

似乎第二次读取的数据以字符为单位,因此我将使用 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);
    }
}