C#同时接收和发送串行字节bug

C# Receive and transmit serial bytes at the same time bug

我正在使用我的应用程序时突然意识到,如果我在读取一个字节时传输一个字节,我可能会遇到串行端口错误。我开始测试并在 5 秒内完成,宾果游戏.我没有错过接收到的字节。但是我的程序会停止正常工作。我们使用某种协议,当它接收到奇怪的字节时,它可能会卡住。类似的事情发生了。

为了发送字节,我使用按钮,按钮事件调用发送字节的函数。

serial.Write(toSend, 0, 1)

为了读入,我使用调用处理数据的后台工作程序的串行事件。

private void serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        lock (_lock)
        {
            rxBuffer += serial.ReadExisting();
        }
             try { backgroundWorker1.RunWorkerAsync(); } catch { } 
    }

控制台输出

Bullseye set at (0,1)
9:44:52  << 0x80
9:44:52  << 0x3
9:44:52  << 0xA
Bullseye set at (1,1)
9:44:52  << 0x80
9:44:52  << 0x3
9:44:52  << 0xB
Bullseye set at (2,1)
9:44:52  << 0x80
9:44:52  0x95 >>
9:44:52  << 0x3
9:44:52  << 0xC   <-- bullseye didn't get set
9:44:53  << 0x80

后台也使用锁功能

private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
        {
            //private void serialReceived(object s, EventArgs e)
            //{     
            while (rxBuffer.Length > 0)
            {
                lock (_lock)
                {
                    // textBox1.Text += rxBuffer[0];
                    byte b = Convert.ToByte(rxBuffer[0]);
                    string hexValue = b.ToString("X");

                    rxBuffer = rxBuffer.Remove(0, 1);

我不知道为什么按钮事件会干扰后台工作程序。我确实看到我收到了所有字节

我终于解决了大部分问题。我花了很多时间在谷歌上搜索,但我找到了如何使用 beginInvoke()。与常规 Invoke 不同,beginInvoke 似乎没有那么慢。然而,当机器向我的目标设备发送太多字节时,它仍然会死机

所以现在我摆脱了后台工作人员并使用它。但我仍然更喜欢使用后台工作者,因为它对我来说似乎更快。但是我不能,我不知道怎么办。

 private void serial_DataReceived(object sender, SerialDataReceivedEventArgs e) // the Main serial receiving event.
    {
         lock (_lock)
         {
            rxBuffer += serial.ReadExisting();
         }
        serialReceived(rxBuffer);
    }

    private void serialReceived(string value)
    {
        if (this.InvokeRequired)
        {
            this.BeginInvoke(new serialReceivedDelegate(serialReceived), new object[] { value });
        }
        else
        {
            lock (_lock)
            {