打算写一个串口通讯的,其实是两台PC之间用串口进行数据传送,这应该比较简单些的吧。 上位PC连接着一台仪器,仪器的数据先通过串口传递到上位PC,上位PC处理生,再通过串口传递到本机。上位PC数据传递的格式无法修改。上位机一次传送的数据量从几个字节到一两兆左右都有可能;另外,也可能两次数据传递的间隔非常短。由于无法修改上位PC传递数据的格式(主要是数据传递没有起始结束的标志,也没有传递数据的长度) 研究了一下SerialPort类,由于现在没有仪器,难测试串口的,所以心中的几个问题只能上论坛来问大虾们了,不然老闷在心里。假设我的SerialPort设置为收到>1字节就激发DataRecive事件,数据接收一概采用DataRecive事件来接收
1. 如果我缓冲区设置的足够大,如10兆,则上位PC一次发送的数据(可能是2兆),是不是只会激发一次DataRevice事件?
2. 如果发送的数据过大,如12兆,缓冲区设置为10兆,是不是会连续激发两次DataReceive事件? (这点我应该可能肯定,是这样的,不过不放心,还请大虾确认一下)
3. 有没有可能出现这种情况,当DataRecive事件被激发时,其实2兆数据还未传递完毕,我在DataRecive事件中的接收操作,只接受到了部分数据。如果有这种情况的话,是不是只能用延时来解决?
4. 如果上位PC以间隔很短的时间,连续发送两次数据,这两次数据会不会只激发一次DataReceive事件,也就是说,我在一次DataReceive事件中,会把两次发送的数据一次性从缓冲区中读出。(记得当时VB编写Socket程序时,自带的WinSock控件就是这样)
1. 如果我缓冲区设置的足够大,如10兆,则上位PC一次发送的数据(可能是2兆),是不是只会激发一次DataRevice事件?
2. 如果发送的数据过大,如12兆,缓冲区设置为10兆,是不是会连续激发两次DataReceive事件? (这点我应该可能肯定,是这样的,不过不放心,还请大虾确认一下)
3. 有没有可能出现这种情况,当DataRecive事件被激发时,其实2兆数据还未传递完毕,我在DataRecive事件中的接收操作,只接受到了部分数据。如果有这种情况的话,是不是只能用延时来解决?
4. 如果上位PC以间隔很短的时间,连续发送两次数据,这两次数据会不会只激发一次DataReceive事件,也就是说,我在一次DataReceive事件中,会把两次发送的数据一次性从缓冲区中读出。(记得当时VB编写Socket程序时,自带的WinSock控件就是这样)
解决方案 »
- C#和java是什么关系?为什么那么像呢?
- Height属性问题
- C# 如何将16进制的字节数组中的数据写入TXT中,并以16进制形式显示
- javascript实现当按"回车"时,相当于调用页面上的button按扭的Onclick事件如何写?
- 如保获取ListView显示数据的行数??
- 问个ftp的问题
- 廣州用C#一般寫什麼類型的程序,工資多少
- 如何在Winform的DataGridView添加合计行,“合计”显示在索引这一列的最后一行(注:不使用第三方控件,不使用SQL实现)
- 急,初学者的问题,大家帮忙。
- 有点挑战性的问题,内详!
- 大家发表一下在公司经常用的.net技术和一些面试题(也可以自己出题测试新人)
- VS2005怎么给C#程序加个盾牌?不知道怎么加manifest
2. 如果发送的数据过大,如12兆,缓冲区设置为10兆,是不是会连续激发两次DataReceive事件? (这点我应该可能肯定,是这样的,不过不放心,还请大虾确认一下)缓冲区的设置个人认为不要设置过大。还是通过读取频率来控制。不然可能真的如楼上所说的不确定。3. 有没有可能出现这种情况,当DataRecive事件被激发时,其实2兆数据还未传递完毕,我在DataRecive事件中的接收操作,只接受到了部分数据。如果有这种情况的话,是不是只能用延时来解决? 并发的多线程操作。不过望楼主还是能过第2点读取频率方式来解决,也就是设置ReceivedBytesThreshold属性。 4. 如果上位PC以间隔很短的时间,连续发送两次数据,这两次数据会不会只激发一次DataReceive事件,也就是说,我在一次DataReceive事件中,会把两次发送的数据一次性从缓冲区中读出。(记得当时VB编写Socket程序时,自带的WinSock控件就是这样)如果你的ReceivedBytesThreshold属性设置为2M那么,如果上位机在发送数据时,第一次发送1.8M,第二次发送1.2M那么DataRecive确定会读取所有缓冲区的数据,因为第一次发下来的数据并没有触发DataRecive事件,当第二次发送后缓冲区里的数据大于ReceivedBytesThreshold属性设置的大小,但是你可以在读取的时候以你所发数据的标识来做判断是一次读取还是分次读取。(建议一次读取后暂存再做处理)
兄弟你可能理解错了,我的意思是ReceivedBytesThreshold=1,在我问题中有说明的--“假设我的SerialPort设置为收到>1字节就激发DataRecive事件”。我说的缓冲区大小是指ReadBufferSize属性。因为上位PC有可能只发几个字节过来,所以ReceivedBytesThreshold只能设置为等于1,不然的话,上位PC发数据过来,却不激发DataReveive事件就搞笑了。