lenyuye 发表于 2010-3-12 10:41:54

c#串口接收数据问题

用vs自带的serialport控件,事件触发,用默认的每收到一个字节就触发

delegate void mydelegate(byte receiveByte);
byte[] rBuffer = new byte;   //接收缓冲区
int rIndex = 0;                  

//事件处理函数
private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)   
{
      byte temp=0;
      
      mydelegate MyDelegate = new mydelegate(UpdateTextBox);
      temp = (byte)serialPort.ReadByte();   //读取一个字节
      this.Invoke(MyDelegate, temp);         
}

//数据处理并显示到textbox函数
public void UpdateTextBox(byte temp)
{
      rBuffer = temp;
      ...
}

我现在要收的数据为(02/0184018301810197016100083801530000000000/0083/016/8)这样的格式,我上面这样处理合不合理呢?C#还有没有更好的方法?现在收数据时有这样一个异常,搞不明哪里越界了,在this.Invoke(MyDelegate, temp); 出错:
http://cache.amobbs.com/bbs_upload782111/files_27/ourdev_537938.jpg
(原文件名:未命1.jpg)

对串口接收事件还有些疑问,望高手解答一下:
1、接收事件可以设置接收缓冲区收到多少个字节才触发一次事件,例如我现在设置收到5个字节才触发一次事件,但我现在如果收到的字节数为8个,前5个触发一次事件时取走了,但后面三个还在缓冲区内,是否要等到下一次有数据来凑够5次才触发?那前面8个数据就不完整了,我在程序设了一下,又可以收到8个,不知控件这个是怎样搞的。
2、我设置每收到一个字节就触发一次事件,是否就像单片机中断一样,收多少个字节就会有多少次事件发生?

lenyuye 发表于 2010-3-12 11:12:43

顶顶。。。。。

chenqiyue 发表于 2010-3-12 11:20:57

收数据之前要判断缓冲区中有多少字节要收取。参考SerialPort.BytesToRead();

lenyuye 发表于 2010-3-12 11:37:39

那个缓冲区数组究竟要在哪里定义的?怎样定义才能像C语言的全局变量?像我上面的定义是有异常的,说跨线程操作

yajira 发表于 2010-3-12 11:49:13

可以将串口当作流来对待,
有一个basestream属性,可以得到一个基础流...
然后用binaryReader来对流进行操作, 用binaryreader.PeekChar来判断流里面是否还有可读数据

你的索引大小溢出是否是rIndex的溢出,因为没看到你有判断 rIndex的合法性

yajira 发表于 2010-3-12 11:51:34

回复【3楼】lenyuye冷雨夜
那个缓冲区数组究竟要在哪里定义的?怎样定义才能像C语言的全局变量?像我上面的定义是有异常的,说跨线程操作
-----------------------------------------------------------------------

你的串口也是在一个类中声明的啦,那个自己定义的缓冲区放在同等级的类声明就可以用了

lenyuye 发表于 2010-3-12 11:58:08

回复【5楼】yajira
回复【3楼】lenyuye冷雨夜
那个缓冲区数组究竟要在哪里定义的?怎样定义才能像C语言的全局变量?像我上面的定义是有异常的,说跨线程操作
-----------------------------------------------------------------------
你的串口也是在一个类中声明的啦,那个自己定义的缓冲区放在同等级的类声明就可以用了
-----------------------------------------------------------------------

我现在程序就只有一个FORM的类,放在这个类里面不行,不知要放哪里

lollipop 发表于 2010-3-12 12:15:09

我自己用的很简单。

用一个timer,定时去查询串口缓冲区有没有数据,有,读,没有,继续,:)

lenyuye 发表于 2010-3-12 12:39:52

如果我用“(”和“)”来判断数据的开头和结尾,由于不是一位一位这样接收的,那我就要在数组里找,又不知道什么时候接收完,如果丢了一个开头和结尾的话,那是不是又要设置等一段时间才清掉缓冲区呢,谁能给一个完整的思路
页: [1]
查看完整版本: c#串口接收数据问题