日期:2014-05-18  浏览次数:21104 次

串口通信接收问题
我刚刚接触C#,今天想弄个串口,弄了一天,接收数据始终出不来,发送时没问题的,我用串口调试助手能收到数据,但是我自己的接收区域上就没东西,不知道哪里出了问题,请大侠们帮忙,万分感谢!下面是我接收数据的代码
[code=C#][/code]
void com_DataReceived(object sender, SerialDataReceivedEventArgs e)
  {
  try
  {
  int n = com.BytesToRead;
  byte[] buf = new byte[com.ReadBufferSize];
   
  com.Read(buf,0,n);
   
  builder.Clear();
  this.Invoke((EventHandler)(delegate
  {

  foreach (byte b in buf) //依次的拼接出16进制字符串  
  {
  builder.Append(b.ToString("X2") + " ");
  }
  this.richTextBox1.Text += builder.ToString();
   
  this.richTextBox1.AppendText(builder.ToString());
   

  }));
  }
  catch
  { 
   
  }

------解决方案--------------------
com.Read(buf,0,n);这个方法带有返回值,返回的是读取的字节数,你要判断读取了多少,然后显示多少,不能全部都显示,否则将把一堆空白显示出来。
------解决方案--------------------
我刚做串口通信的时候也遇到过发送数据没有问题,读取的时候读不到,或者读取的不正确。解决办法是:发完数据以后要等30毫秒,再读就没有问题了,不知道对你有没有帮助。
------解决方案--------------------
思路:

在C#中串口接收数据时,触发com_DataReceived事件的次数非常不稳定。什么意思呢?比如说电脑A通过串口向电脑B发送一字符串“abcdefghij”,你在电脑B中用C#编程实现串口数据的接收。调试时你会发现一个奇怪的现象:虽然A一次性发送这个字符串,但是在B中com_DataReceived事件触发的次数可能非常“不稳定”。例如:你第一次发送这个字符串到B,触发com_DataReceived的次数可能是一次,就是一次性就把abcdefghij接收完了;但是你第二次发送这个同样的字符串到B,电脑B触发com_DataReceived的次数可能是3次:分别接收abc,defghi,j;如果你第三次发送,可能触发2次,等等。。。。。。。。。。反正在C#中情况就是这么复杂------我遇到的情况。

那么怎么解决呢?
这时你就要定义一个全局的字符串变量,长度要足够长,以满足存储完整这个字符串。
在com_DataReceived事件中,每触发这样一次事件,就把接收到的字符串添加到全局字符串变量的后面,这样不断往全局变量的后门加入数据,最后接收到的就是一条完整的信息。

最后你要显示的,或者要处理的,或者要解析的信息,就从那个全局字符串变量中提取。


呵呵,我工作也很多处理串口通信的编程,我遇到的问题和解决的手段大抵如此,不知道有没有说清楚,不知道有没有说对,欢迎高手们指正,鄙人也是菜鸟一枚,不停的学习中。

如果对楼主有用,呵呵,加分时给我一点,嘿嘿黑,我的分也太少了。毕竟这么多我也是辛苦敲出来的啊。哈哈
------解决方案--------------------
我也是定义全局变量来接受串口数据的,然后不断地累加字符串。需要定时清空。
------解决方案--------------------
但如果要实时处理的话,怎么判断信息什么时候发完整了呢

===>>
要看你的仪表数据格式,按照说明文档上的格式判断是否存在一条完整的记录。其实数据格式的处理时很麻烦的,接收数据倒挺简单。主要是因为数据是不断变化的。。 上次我弄一个二次表的数据显示,按照他的格式,数据全部是倒着显示,要找到一条完整的数据,判断是正数还是负数,再倒过来。。