日期:2014-05-17  浏览次数:20897 次

请教 C# 串口通讯问题
大家好 请教一下有关c# 串口通讯的一些问题,
 这是我接受串口的一个事件  
  
  private void sComm_DataReceived(object sender, SerialDataReceivedEventArgs e)
  {
  try
  {
  //读入收到的数据。
  int Len = sComm.BytesToRead;
  if (Len < 1)
  {
  IsReceving = false; //***接收完成状态指示。
  return;
  }
  byte[] data = new byte[Len];
  sComm.Read(data, 0, Len);

  //使用委托跨线程读取数据。
  rtbRecStr.Invoke(interfaceUpdataHandle,data );//Resolve(byte [] data);解析方法
  }
  catch (Exception Err)
  {
  MessageBox.Show(Err.Message, "串口调试助手");
  }
  }

  现在有这样一个问题 , 比如我要从串口读取数据 由于串口发送过来的数据不是一次发送过来的 可能分多次发送 间隔时间可能就毫秒级。 而且我要的数据长度也不是固定的 。 这样就有一个问题 Resolve() 方法是 只要串口接受到数据就去执行 传过来的数据又完整,所以要怎么处理才好。 求解! 

 比如我和电能表通讯 发送过来的帧命令可能是 68FFFFFFFF000068010A000100000000000000BEBE5416 但是从串口接受数据是他不是一次返回过来, 而是可能分多次。 所以我想知道 我要怎么去判断 接收的数据是一组命令 然后调用Resolve()去解析。 (很麻烦 想了很久实在是不知道有什么方法 希望大家能帮帮我 谢谢)

------解决方案--------------------
我记得串口返回的数据都有一个 /0或者什么的结束符吧??
------解决方案--------------------
解决办法:
1。当你知道什么时候需要接受数据时,你可以等待一段时间再进行接收。此办法比较笨,因为你不知道何时数据已完整接收。
2。不断检测接收的数据,看接收数据是否已接收完整。

数据格式你自己应该知道。所以第二种方法是比较不错滴。
------解决方案--------------------
数据一般是连续传输的,1秒时间有30%都是空闲的,我们假设最高效情况,那也应该有至少3%时间是连续空闲的。
所以你可以这样尝试
C# code

public void sComm_DataReceived(...)
{
    List<byte> buf = new List<byte>();
    int n = sComm.BytesToRead;
    while(n>0)
    {
        byte[] tmp = new byte[n];
        sComm.Read(tmp,0,n);
        buf.AddRange(tmp);
        Threading.Thread.Sleep(30);
        n = sComm.BytesToRead;
    }
    Resolve(buf.ToArray());
}