搜索
bottom↓
回复: 8

c#串口接收数据问题

[复制链接]

出0入0汤圆

发表于 2010-3-12 10:41:54 | 显示全部楼层 |阅读模式
用vs自带的serialport控件,事件触发,用默认的每收到一个字节就触发

delegate void mydelegate(byte receiveByte);
byte[] rBuffer = new byte[1024];   //接收缓冲区
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[rIndex++] = temp;
      ...
}

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

(原文件名:未命1.jpg)

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2010-3-12 11:12:43 | 显示全部楼层
顶顶。。。。。

出0入0汤圆

发表于 2010-3-12 11:20:57 | 显示全部楼层
收数据之前要判断缓冲区中有多少字节要收取。参考SerialPort.BytesToRead();

出0入0汤圆

 楼主| 发表于 2010-3-12 11:37:39 | 显示全部楼层
那个缓冲区数组究竟要在哪里定义的?怎样定义才能像C语言的全局变量?像我上面的定义是有异常的,说跨线程操作

出0入0汤圆

发表于 2010-3-12 11:49:13 | 显示全部楼层
可以将串口当作流来对待,
有一个basestream属性,可以得到一个基础流...
然后用binaryReader来对流进行操作, 用binaryreader.PeekChar来判断流里面是否还有可读数据

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

出0入0汤圆

发表于 2010-3-12 11:51:34 | 显示全部楼层
回复【3楼】lenyuye  冷雨夜
那个缓冲区数组究竟要在哪里定义的?怎样定义才能像C语言的全局变量?像我上面的定义是有异常的,说跨线程操作
-----------------------------------------------------------------------

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

出0入0汤圆

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

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

出0入0汤圆

发表于 2010-3-12 12:15:09 | 显示全部楼层
我自己用的很简单。

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

出0入0汤圆

 楼主| 发表于 2010-3-12 12:39:52 | 显示全部楼层
如果我用“(”和“)”来判断数据的开头和结尾,由于不是一位一位这样接收的,那我就要在数组里找,又不知道什么时候接收完,如果丢了一个开头和结尾的话,那是不是又要设置等一段时间才清掉缓冲区呢,谁能给一个完整的思路
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 06:34

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表