高分求解决串口通讯中接收数据的问题! 急!急!急!

最后一步 2006-05-09 10:14:23
我用MSCOMM控件做 串口通讯,现在需要向单片机发送256个命令,每发一个命令单片机就会相应的向串口发送256个Byte的数据(1个page)。现在我的方法是利用一个for循环不断的发送命令,每发一个命令就delay 100ms,同时有一个定时器的事件,每50ms访问MSCOMM的接收缓冲区,如果有了256个byte就从缓冲区中取出。这时的问题是:每次只接收到了前16个page(每个page 256byte)的内容,后面的全部没有接收到!请高手遇到或没遇到这类的问题的帮我解决!谢谢!
...全文
451 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
pnyxx 2006-08-02
  • 打赏
  • 举报
回复
因为比较简单,所以没写出代码,如果楼主需要的话可提供简单的程序代码给你!

pnyxx 2006-08-02
  • 打赏
  • 举报
回复
MSCOMM控件当串口有数据时会自动触发事件的,建议搂主采取下面的方式进行
1、发送第一次命令,设置接收到的数据长度为len=0;

2、等待MSCOMM控件数据接收事件的触发;

3、接收串口的数据,长度为len1,len += len1,判断len是否等于256,如果不等继续第二步等待接收;

4、len=256时,第一次指令应答成功,发送第二次命令,设置len=0,重新进入第二步等待;

5、发送完256个命令之后,操作成功。

备注:这样做的目的是确保每次指令发送以及应答接收都能顺利完成,上一次指令处理完成之后再进行下一次指令处理,估计你遇到的情况是由于连续,某一条指令在100ms内单片机或者PC没法处理完成!
wanglovec 2006-08-01
  • 打赏
  • 举报
回复
偶 用 MSCOMM 没有遇到这方面的问题, 应该是你的代码有问题, 贴出来 大家帮你分析.)
YJS050320001 2006-07-29
  • 打赏
  • 举报
回复
你也可以当有数据时就取出不要等到50ms再取
我可以给你一点提示:
void __fastcall TMainForm::MSComm1Comm(TObject *Sender)
{
AnsiString str; //声明一个AnsiString类型的变量
OleVariant s; //声明一个用于接收数据的OleVariant变量。
if(MSComm1->CommEvent==comEvReceive)
// 接收缓冲区中是否收到Rthreshold个字符。
{
if(MSComm1->InBufferCount) // 是否有字符驻留在接收缓冲区等待被取出
{
s=MSComm1->Input; //接收数据
str=s.AsType(varString); //把接收到的OleVariant变量转换AnsiString类型
}
}
}
你直接这样就可以一有数据就读出来
「已注销」 2006-07-28
  • 打赏
  • 举报
回复
for循环,同时接收后清楚串口接收缓冲区
jiangshx 2006-05-10
  • 打赏
  • 举报
回复
楼上说得有理,很可能是没有清空接收缓冲区。
我没用过MSCOMM,用第三方控件Apro的ApdComPort
它可判断发送接收缓存区是否有数据,
设一循环等待,当接收缓存区达到你指定的数量时,接收即可
海嵌 2006-05-10
  • 打赏
  • 举报
回复
每从接收缓冲区取出一次数据后,清理一下接收缓冲区数据
cczlp 2006-05-10
  • 打赏
  • 举报
回复
不要用MSCOMM,用其他如TMS.Async32, 有数据时会触发OnRxChar事件,不需要定时器。
huaqglxy2004 2006-05-10
  • 打赏
  • 举报
回复
我用过MSCOM,但是没有遇到你这样的情况,是不是没有清空接收缓冲区?

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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