关于SerialPort类使用的几个问题。

hwyqy 2009-05-30 11:27:06
打算写一个串口通讯的,其实是两台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控件就是这样)
...全文
215 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
oodmboo 2011-11-01
  • 打赏
  • 举报
回复
想看呢!
dai78 2009-05-31
  • 打赏
  • 举报
回复
串口一次发送上兆的数据啊,太多了吧!偶从来没有遇到过。你那没有通讯协议吗?
gxj760998 2009-05-31
  • 打赏
  • 举报
回复
还是自己组包解包吧。不要指望一次接收就能搞定!
memoCKH 2009-05-31
  • 打赏
  • 举报
回复
还是用多线程吧,数据肯定有数据侦格式,才能保证数据的接收完整,正确的撒。
hwyqy 2009-05-31
  • 打赏
  • 举报
回复
有通讯协议,普遍是用astm,但有的仪器并没有使用协议,所以就是这点特殊
hwyqy 2009-05-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 51Crack 的回复:]
不固定
[/Quote]

带星星的大虾,你也别太省笔墨了哇,能不能一个问题一个问题地帮我回答一下哇。不胜感谢
51Crack 2009-05-30
  • 打赏
  • 举报
回复
不固定
redleafe 2009-05-30
  • 打赏
  • 举报
回复
关注中。。。。。。
在VS2008下还没有用过串口。
ai_li7758521 2009-05-30
  • 打赏
  • 举报
回复
关注
hwyqy 2009-05-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 libinguest 的回复:]
1. 如果我缓冲区设置的足够大,如10兆,则上位PC一次发送的数据(可能是2兆),是不是只会激发一次DataRevice事件?

首先回答你第一个问题。楼主可以ReceivedBytesThreshold属性来确定是否要激发DataRevice事件。


2. 如果发送的数据过大,如12兆,缓冲区设置为10兆,是不是会连续激发两次DataReceive事件? (这点我应该可能肯定,是这样的,不过不放心,还请大虾确认一下)

缓冲区的设置个人认为不要设置过大。还…
[/Quote]

兄弟你可能理解错了,我的意思是ReceivedBytesThreshold=1,在我问题中有说明的--“假设我的SerialPort设置为收到>1字节就激发DataRecive事件”。我说的缓冲区大小是指ReadBufferSize属性。因为上位PC有可能只发几个字节过来,所以ReceivedBytesThreshold只能设置为等于1,不然的话,上位PC发数据过来,却不激发DataReveive事件就搞笑了。
风之影子 2009-05-30
  • 打赏
  • 举报
回复
http://libinguest.blog.163.com/blog/static/4534208200811252208704/
风之影子 2009-05-30
  • 打赏
  • 举报
回复
1. 如果我缓冲区设置的足够大,如10兆,则上位PC一次发送的数据(可能是2兆),是不是只会激发一次DataRevice事件?

首先回答你第一个问题。楼主可以ReceivedBytesThreshold属性来确定是否要激发DataRevice事件。


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属性设置的大小,但是你可以在读取的时候以你所发数据的标识来做判断是一次读取还是分次读取。(建议一次读取后暂存再做处理)
bbb332 2009-05-30
  • 打赏
  • 举报
回复
友情帮顶

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧