请问,串口mscomm接收数据,缓冲问题

flyskytoday 2010-06-09 09:53:02
串口原理不懂~~~
发送端只发一次数据为:909090906801
在人家软件sscom32上测试是正确的
不知为什么,我的程序在接收数据时,分几次接收

有时分两次接收,显示为:
9090906801
90

有时分三次接收
01
90909068
90

我想一次接收909090906801,请问问题出在哪呀?
PS: SetInBufferSize设置了好象没有用
...全文
106 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
maojian2011 2010-06-09
  • 打赏
  • 举报
回复
而不是只读ab
maojian2011 2010-06-09
  • 打赏
  • 举报
回复
用的是MSComm控件吧,在串口初始化时SetInBufferSize不写确实也能接收数据。可能出在你的接收程序上了吧,最好把你的接收程序代码发上来。
关于RThreshold(value)这个函数,MSDN中是这么说的"Setting RThreshold to 1, for example, causes the MSComm control to generate the OnComm event every time a single character is placed in the receive buffer."
我在使用时是这么理解的,假设外设向串口发送abcd,如果参数设置2,就是接收到前两个字符ab就产生ONCOMM事件,我们用GetInput读取数据,在读取的时候cd也到串口缓冲了,所以能把abcd都读出来,而不是只读a,GetInput读完以后,接收缓冲的数据就没有了,等待下一次触发ONCOMM
zhou1xp 2010-06-09
  • 打赏
  • 举报
回复
你不是监听线程么,如果是监听线程循环接收就没什么问题啊
洗洗睡去 2010-06-09
  • 打赏
  • 举报
回复
Threshold 可以设大点
不过最简单的方法 就是 Threshold 为1 然后里面sleep几十ms
flyskytoday 2010-06-09
  • 打赏
  • 举报
回复
看了以前人家的一个帖子,讲了很有用
这个很正常
串口传送数据速度较慢
所以当第一个字节到达串口并触发oncomm事件时,
后面的字节往往还没有能够全部到达串口并被存入缓冲区。
所以你需要在程序中自己设置一个缓冲区vector<BYTE> __Buffer
每次响应oncomm事件时首先把所有能够从串口读出的数据写入该缓冲区的尾部
从而将零散的数据拼成完整的字节数组
然后再针对该缓冲区做数据的处理
flyskytoday 2010-06-09
  • 打赏
  • 举报
回复
感谢感谢,,,现在设置大一点好了[Quote=引用 2 楼 finder_zhang 的回复:]
接收门坎设得低,也会这样.我之前不太懂,R Threshold 设成1,就一收到字符,马上执行消息响应.后来我设大一些,就会全收到再响应了.我用的是MSCOMM
[/Quote]
zhou1xp 2010-06-09
  • 打赏
  • 举报
回复
程序贴出来看看
finder_zhang 2010-06-09
  • 打赏
  • 举报
回复
接收门坎设得低,也会这样.我之前不太懂,R Threshold 设成1,就一收到字符,马上执行消息响应.后来我设大一些,就会全收到再响应了.我用的是MSCOMM
soswaidao 2010-06-09
  • 打赏
  • 举报
回复
16位还是32位的
原先的程序数据缓冲区采用String类型,因此无法发送H00,现将数据缓冲区修改为BLOB类型,可以发送任意数据。 在原先程序的基础上,增加了两个对象:pfc_n_cst_numerical,uo_bit_operator Email: leio88@126.com 以下是原作者的话---------------------------------- 本程序通过调用WINDOWS API函数,实现了类似MSCOMM控件的功能。使PB可以很方便地访问串口。由于所有功能都是PB代码实现的,因此比使用OCX控件访问串口的方式更稳定。 为了方便使用已将所有功能都封装在uo_comm._control用户对象中。使用时只需在窗口中像放置普通对象(如:按钮)一样放置一个uo_comm_control对象即可对串口进行访问。 访问串口时先调用of_setcommport(string commport)和of_setcommsettings(string commsettings)来设置要访问的端口及端口初始化参数,然后调用of_open()初始化端口。或直接使用of_open(string comport,string commsettings)带参数初始化端口。端口初始化成功后即可使用of_send(string sendstring)向串口发送数据,或使用of_read()读取串口数据。当串口有数据到达时,触发ue_received事件,该事件提供给用户用来存放读取串口数据的代码(值得注意的是,当数据到达接收端时,由于发送的数据很长或通讯速率较低,会多次触发ue_receieved事件,并且在ue_received事件中使用of_read()得到的数据仅只是整个发送数据的一部分,需要将多次接收到的数据连接起来才是完整的接收数据)。若对串口所有操作结束不再需要对串口进行操作,则调用of_close()将端口关闭。 Email: blazingstar@sina.com

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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