api方式操作串口通信

ncucf 2006-03-26 06:45:26
头都想痛了,没找出什么原因来!

有一个硬件设备(示波器),需要通过rs232来进行通信,它是命令响应式的,就是发一个命令,就回一个数据包,我用readfile的方式读回来,如果连续两次发送命令过去的话,就会导致第二次发送的命令没响应,必须中间加一个messagebox之类的东西弹出来才能让第二个命令正常回报信息!
原因大概是那个读写串口的线程借此机会可以处理第二个命令,我用sleep多少秒都没用,一定要messagebox这种中断性质的方式才行! 我试图提高那个读写串口的优先级或者挂起主界面线程,都无济于事!

如果用mscomm控件来做的话,一点问题都没有,但我还是想用api的方式来完成,希望有这方面经验的高手帮我分析一下原因!不胜感谢!
...全文
140 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
一条晚起的虫 2006-03-31
  • 打赏
  • 举报
回复
既然是命令响应式的,你连发两个命令干吗?
WriteFile后,等待,ReadFile,再WriteFile,等待,ReadFile
星光伴月 2006-03-27
  • 打赏
  • 举报
回复
Sleep函数执行过程中不会处理Windows消息,请自编一个延时函数试一下,如果不行再想别的路子:
void Sleep(long lms)
{
long lstart=GetTickCount();
while(GetTickCount()-lstart<lms)
{
while(PeekMessage(&msg,NULL,0,0,1))
{
//处理消息以使外部程序可以响应事件
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
ncucf 2006-03-27
  • 打赏
  • 举报
回复
readfile之前都肯定是有数据的,因为没有数据的话,会继续等待!
我的方式就是
SendCmd();
Read232();
Sleep
SendCmd();
Read232();
第二次的 发送指令根本得不到响应,一直等,等几十秒都没用,说明不是时间的问题!
但是如果把sleep换成MessageBox,就可以了,第二次发送的命令可以得到正确响应!

我觉得问题的关键是这里,为什么sleep和Messagebox会有这种差别,有什么其它的方法完成它吗?我总不可能在测试的过程中,总是让用户点那个MessageBox的确定!
Atomictry 2006-03-27
  • 打赏
  • 举报
回复
更正, http://www.vckbase.com/code/listcode.asp?mclsid=9&sclsid=907
Atomictry 2006-03-27
  • 打赏
  • 举报
回复
网上关于api的例子很多,事件方式的、重叠方式的都有。
http://www.vckbase.com/code/findcode.asp
ma100 2006-03-26
  • 打赏
  • 举报
回复
SendCmd();
Read232();
Sleep
SendCmd();
Read232();
试试
DentistryDoctor 2006-03-26
  • 打赏
  • 举报
回复
ReadFile前需要WaitCommEvent,只有在有数据需要读入时才调用ReadFile.

16,472

社区成员

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

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

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