首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

请问 C# 串口通讯有关问题

2012-11-21 
请教 C# 串口通讯问题大家好 请教一下有关c# 串口通讯的一些问题,这是我接受串口的一个事件private void s

请教 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());} 

热点排行