做串口通信时,如何实现程序的等待延时。。

MackedNice 2003-10-22 08:55:22
单片机与PC通信时
PC发送一条命令给单片机,必须等待单片机的回应才能继续发送命令。那么这等待回应的动作怎么实现呢。。。
1。
延时函数
1) Sleep();//程序不能响应别的消息。
2) DelayTime()

void __fastcall TMainForm::DelayTime(DWORD DT)
{
long tt;
tt = GetTickCount();
while (GetTickCount()-tt<DT)
{
Application->ProcessMessages();
if ((GetTickCount()-tt)<=0)
tt = GetTickCount();
}
}
CPU的使用率100%
2查询某个标志的变量Com(此变量用来标志缓冲区是否受到单片机返回数据的结尾符)
void __fastcall TMainForm::WaitCom()
{
long tt;
tt = GetTickCount();
while(1)
{
if(Com == 1)//receive the end of character
{
Err = 0; // no error
break;
}
if(GetTickCount() - tt > 10000)
{
Err = 1;// out time error
break;
}
}
}
但这样CPU的占有率在WaitCom()还是很高。。


各位高手。。。。有没有更好的方法啊。。。。。。
CSDN 有没有大虾能解决。。。。
...全文
689 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
baffling 2003-11-25
  • 打赏
  • 举报
回复
gz
路人丁 2003-11-13
  • 打赏
  • 举报
回复
HANDLE __fastcall TForm1::initcom(String com)//串口初始化函数
{
HANDLE hCommDevice=CreateFile(com.c_str(),GENERIC_READ|GENERIC_WRITE,
0,NULL,OPEN_EXISTING,0,NULL);
if(hCommDevice==INVALID_HANDLE_VALUE)
{
ShowMessage("Windows通信端口冲突!"); // 不能打开串口"+com+"
return(0);
}
if(!SetCommMask(hCommDevice,EV_RXCHAR)) return(0);
if(!PurgeComm(hCommDevice,PURGE_TXABORT|PURGE_RXABORT|PURGE_RXCLEAR|PURGE_TXCLEAR))
return(0);
DCB Dcb;
GetCommState(hCommDevice,&Dcb);
Dcb.BaudRate=9600;//
Dcb.ByteSize=8;
Dcb.Parity=NOPARITY;
Dcb.StopBits=ONESTOPBIT;
Dcb.fDtrControl=0;
SetCommState(hCommDevice,&Dcb); COMMTIMEOUTS Timeouts;
GetCommTimeouts(hCommDevice,&Timeouts);
Timeouts.ReadIntervalTimeout=500;//数据间隔时间
Timeouts.ReadTotalTimeoutMultiplier=0;
Timeouts.ReadTotalTimeoutConstant=0;
SetCommTimeouts(hCommDevice,&Timeouts);
EscapeCommFunction(hCommDevice,SETDTR|SETRTS);
ComOn=True;
return(hCommDevice);
}

__fastcall TReadThread::TReadThread(HANDLE CommFile):TThread(True)
{
FreeOnTerminate=TRUE;
Priority=tpHigher;
hCommDevice=CommFile;
EscapeCommFunction(hCommDevice,SETDTR|SETRTS);
Resume();
}
void __fastcall TReadThread::Execute(void)
{
DWORD dwEvent,byteRead;
int iCN;
//int i_Linbz;
int iTemp=Form1->iComCount;
EscapeCommFunction(hCommDevice,SETDTR|SETRTS);
while(!Terminated)
{

strnset(Buffer,'\0',sizeof(Buffer));
WaitCommEvent(hCommDevice,&dwEvent,NULL);
ReadFile(hCommDevice,Buffer,BUFSIZE,&byteRead,&oOverlap);
save(Buffer);//save函数内解析Buffer数组的数据协议判断数据的合法性并进一步处理。
}
}


Form1->hCom1=Form1->initcom("com1");//串口初始化的调用
ReadThread1=new TReadThread(Form1->hCom1);//线程启动调用

//注意win32 DCB结构的使用可以看API帮助
//以上程序只是基础你要自己好好看这里只有接收线程发送我是做在主线程中的因为我的发送数据量很小只是命令而已! 我建议你使用Moxa的pcomm!这套函数库是API封装的函数非常灵活帮助清晰,有例子
路人丁 2003-11-13
  • 打赏
  • 举报
回复
最近不能上网!这么多人要!我把它贴出来吧。不是很完善!最近比较忙。我先找找随后发出!
wenyongjie 2003-11-08
  • 打赏
  • 举报
回复
学习
yjy1001 2003-11-06
  • 打赏
  • 举报
回复
老婆是按需分配的。。。。。。
你们要多少,有多少,要多水,有多水,,,,,,,,,,,,,

那么老公呢?!
美女呢?!
金钱呢?
地盘呢?!

我想要地球。。。。
appletreestudio 2003-11-05
  • 打赏
  • 举报
回复
WaitForSingleObject()
路人丁 2003-11-05
  • 打赏
  • 举报
回复
我的QQ:16880668 我在北京
MackedNice 2003-10-25
  • 打赏
  • 举报
回复
我把我的分也给你啦。。。。。。。。。。
你在那里啊。。。。。。
MackedNice 2003-10-25
  • 打赏
  • 举报
回复
to dingzhenhhy(君莫舞、君不见玉环飞燕皆尘土!—快疯了)
太谢谢您了。。。
我收到了,回去研究研究。
您真是太好了。。。。
我们交个朋友吧。。。。
我的QQ :47420206
我现在在青岛,有机会到青岛玩,我请客。。。。。。。。。
woainihaha 2003-10-25
  • 打赏
  • 举报
回复
无论你采用什么方式实现,最终都需要等待下位机的响应,等待的时间由以下方式估算:
1。下位机的响应速度,通常都在几十毫秒以内。
2。通讯的数据长度和每字节下位机的通讯间隔,通常应该每字节间隔不能长于5毫秒,否则设备可能会有一定问题。
最终等待时间应该为 响应时间 + 通讯字节间隔 * 最大数据长度 。

另外等待的应该采用多线程方式和WaitFor... 并使用消息通知主程序或采用函数列表形式(这中方式可以不用分析接到的消息并能自己处理随时到达的数据)。做这种程序要设计好,通讯在其次,可以使用第三方组件通讯。
路人丁 2003-10-24
  • 打赏
  • 举报
回复
我给你找找看!好长时间不用了,最近公司搬家……
路人丁 2003-10-24
  • 打赏
  • 举报
回复
看看邮箱!
星光伴月 2003-10-23
  • 打赏
  • 举报
回复
使用控件呀!网上有,下一个就成了:http://www.cppfans.com/。你要的功能它全都可以实现。
MackedNice 2003-10-23
  • 打赏
  • 举报
回复
To dingzhenhhy(君莫舞、君不见玉环飞燕皆尘土!—快疯了)
不好意思,我理解错了你的意思了,,,,,,,,,
但我想用API和多线程解决,,,,,你有没有代码,
发一个给我,EMAIL :pingduozpk@yahoo.com.cn

MackedNice 2003-10-23
  • 打赏
  • 举报
回复
To dingzhenhhy(君莫舞、君不见玉环飞燕皆尘土!—快疯了)
下位机回应上位机的数据报有时长有时短,设定一个固定的时间间隔,为了数据包的完整,只能
设定最长的时间间隔,这样,数据包短时岂不是浪费时间。
你说:
用多线程解决这个问题很easy,
你告送我,好么,,,,

EMAIL :pingduozpk@yahoo.com.cn
fatwave 2003-10-22
  • 打赏
  • 举报
回复
TO:dingzhenhhy(君莫舞、君不见玉环飞燕皆尘土!—快疯了)

说的很好,回去做个测试看看!!

我现在的方法就是楼主说的:
查询某个标志的变量Com(此变量用来标志缓冲区是否受到单片机返回数据的结尾符)

我的MSN:jx_wbo@hotmail.com大家一起交流一下!!
wang_j_p 2003-10-22
  • 打赏
  • 举报
回复
void __fastcall TMainForm::DelayTime(DWORD DT)
{
long tt;
tt = GetTickCount();
while (GetTickCount()-tt<DT)
{
Application->ProcessMessages();
Sleep(5); //加延时
if ((GetTickCount()-tt)<=0)
tt = GetTickCount();
}
}
路人丁 2003-10-22
  • 打赏
  • 举报
回复
线程解决,如果你的读穿口函数写在线程中
while (!Terminated)
{
。。。。。。
WaitCommEvent(hCommDevice,&dwEvent,NULL);
ReadFile(hCommDevice,Buffer,BUFSIZE,&byteRead,&oOverlap);
//判断Buffer中的数据是不是弹片机返回的命令
}
hatumei 2003-10-22
  • 打赏
  • 举报
回复
做个定时器,把定时周期设短点,定时监测串口输入,有回应信息再处理。
用SetTimer
zz997788 2003-10-22
  • 打赏
  • 举报
回复
可以用中断呀。当下位机给上位机发了信号后,就可以触发响应。在中断处理程序中分析下位机发来的信息,然后再做相关的处理。
加载更多回复(4)

13,873

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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