求救串口通讯问题:

freshleaf 2001-06-13 04:48:00
我用API做的串口操作,
采用上下位机操作,上位机发一命令,下位机动作并且返回值
但每个命令的返回值数据包长度不一致,
如用READFILE()指定一个定长的要读的字节ByteRead,(此字节我指定为超过
返回值的最大长度)那么当下位机返回一个少于ByteRead的数据包,
READFILE()此时是否一直等待知直到ByteRead个数的字节收满?
还是设置一个超时值,超时后就不接收了?
求教高手?
...全文
109 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhang_qxian 2001-06-13
  • 打赏
  • 举报
回复
bluestar的方法应该是一个可行的方法!
bluestar 2001-06-13
  • 打赏
  • 举报
回复
我是一个一个接,接到头定义后,就有长度,然后根据长度一直收,收到尾来一个校验。
freshleaf 2001-06-13
  • 打赏
  • 举报
回复
TO :bluestar(蓝色星星)
在协议中是包括了数据长度,但是串口操作中写的读数据函数
是通用的,怎么把个体数据区别开?还是用一个N来解决好一点?
请教你是怎么做的?
freshleaf 2001-06-13
  • 打赏
  • 举报
回复
freshleaf 2001-06-13
  • 打赏
  • 举报
回复
TO:Lachine(笨小孩) 
你的意思是不用COMMTIMEOUTS?
freshleaf 2001-06-13
  • 打赏
  • 举报
回复
bluestar 2001-06-13
  • 打赏
  • 举报
回复
协议在头信息中包含数据长度

程序中有超时机制。
Lachine 2001-06-13
  • 打赏
  • 举报
回复
应该设置超时,例如下文:if(!ReadFile(hComm2,inbuff,N,&nBytesRead,&o)) {
//GetOverlappedResult(hComm2,&o,&nBytesRead,TRUE);
//MessageBox("Over!");
nBytesRead=0;
if((Irc=GetLastError())==ERROR_IO_PENDING) {
//MessageBox("into Irc");
endtime=GetTickCount()+1000;
while(!GetOverlappedResult(hComm2,&o,&nBytesRead,FALSE)) {
if(GetTickCount()>endtime)
break;
}
//
if(nBytesRead){
m_ReceiveMsg.SetSel(0,-1);
m_ReceiveMsg.ReplaceSel(inbuff);
//bReading=0;
}
bReading=0;
}
}
else {
if (nBytesRead)
{ //MessageBox("read OK!");
m_ReceiveMsg.SetSel(0,-1);
m_ReceiveMsg.ReplaceSel(inbuff);
bReading=0;
}
}//locProcessBytes(outbuff,nBytesRead)
leky2000 2001-06-13
  • 打赏
  • 举报
回复
应该设置超时值,超时后不接受,
最好有一个标志来确定发送数据结束

16,551

社区成员

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

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

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