C#串口读写冲突

在线程中通过阻塞方式读串口数据

  void SerialReadBinaryProc()
  {
    
    
    while (IsOpen)
    {
    
    
      int r = -1;
      try
      {
    
    
        r = _serial.ReadByte();
      }
      catch (System.TimeoutException E)
      {
    
    
        Debug.Log("READ BINARY PROC WARNING: [" + portName + "]" + E.Message);
      }
      catch (Exception E)
      {
    
    
        Close();
        Debug.Log("READ BINARY PROC ERROR: [" + portName + "]" + E.Message);
        break;
      }
      // print(string.Format("{0:X2}", r));
      if (-1 != r)
      {
    
    
        // ...
      }
    }
  }

当在主线程或者其他线程向串口写入数据时,会导致_serial.ReadByte()得到一个System.TimeoutException异常,正常逻辑进入下一次循环,调用_serial.ReadByte(),但是,异常超时以后的ReadByte函数总会丢失1子节**(不论延迟多长时间,第一个发送给上位机的数据,ReadByte总会丢失)**。
这个问题暂时不知道是什么问题造成的,目前的解决方案是给串口增加读超时,让串口在没有数据抵达时自然超时,,写入数据时不会导致TimeoutException异常,则不会导致丢失数据数据

_serial.ReadTimeout = 10;

更保险的改进方案是将读写合并到一个线程,保证在写数据时串口不会调用读函数。

  void SerialReadWriteBinaryProc()
  {
    
    
    while (IsOpen)
    {
    
    
      int r = -1;
      try
      {
    
    
        r = _serial.ReadByte();
      }
      catch (System.TimeoutException E)
      {
    
    
        Debug.Log("READ BINARY PROC WARNING: [" + portName + "]" + E.Message);
      }
      catch (Exception E)
      {
    
    
        Close();
        Debug.Log("READ BINARY PROC ERROR: [" + portName + "]" + E.Message);
        break;
      }
      // print(string.Format("{0:X2}", r));
      if (-1 != r)
      {
    
    
        // ...
      }

      // write
      byte[] bincmd = null;
      lock (this)
      {
    
    
        if (writeCommands.Count > 0)
        {
    
    
          bincmd = writeCommands[0];
          writeCommands.RemoveAt(0);
        }
      }
      if (null != bincmd)
      {
    
    
        try
        {
    
    
          _serial.Write(bincmd, 0, bincmd.Length);
        }
        catch (System.Exception e)
        {
    
    
          Debug.Log(e.Message);
        }
        Thread.Sleep((int)(writeInterval * 1000.0f));
      }
    }
  }

猜你喜欢

转载自blog.csdn.net/qq_31042143/article/details/108672717