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

时间:2017-09-12 08:26:24

标签: c# serial-port duplex

我正在使用我的应用程序,当我突然意识到我可以通过串口获得错误时,我将在读取一个字符时传输一个字节。我开始测试并在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);

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

1 个答案:

答案 0 :(得分:0)

我终于解决了我的大部分问题。我用了几个小时的谷歌搜索,但我已经找到了如何使用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)
            {