首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

线程解决方法

2012-08-02 
线程我想请教下 之前我都是用timer发送命令的组建是mscomm但是数据一多 就麻烦用线程做可以实现吗?有什么

线程
我想请教下 之前我都是用timer发送命令的 组建是mscomm 但是数据一多 就麻烦 用线程做可以实现吗?有什么思路呢?
比如命令
byte Command1[6]={0x4B,0x54,0x50,0x52,0x4f,0x47};
byte Command2[8]={0x44,0x42,0x47,0x84,0x02,0xff,0xff,0xff};
byte Command3[3]={0x55,0xaa,0x01};
byte Command4[6]={0x4B,0x54,0x50,0x52,0x4f,0x47};
byte Command5[6]={0xaa,0x55,0x52,0x00,0x50,0x10};
byte Command6[3]={0x55,0xaa,0x02};
。。。

[解决办法]
timer也不错
[解决办法]
当然比较麻烦,当你的OnComm事件触发的时候,OnTimer没有触发,等到OnTimer触发的时候,可能下位机都发2次数据了,而且如果下位机第一次没反应,等了快触发OnTimer的时候2次串口数据一起到,接收到1.5个字符串怎么办?你不可能做那么多预测和处理,所以最好放在线程里,实例代码如下:

int TKernel::WaitForRecFinish(int TimeoutTime)
{
HANDLE MainWaits[2] = { _KillThread, RecEvent };

ResetEvent(RecEvent) ;

while(_ThreadRun) {
DWORD iSingled = WaitForMultipleObjects(2, MainWaits, false, TimeoutTime); ;

// 程序中断
if((!_ThreadRun) || (iSingled==WAIT_OBJECT_0)) return 0;

// 接收到数据,重置,继续等待,直到超时信号出现
if (iSingled==WAIT_OBJECT_0+1) ResetEvent(RecEvent) ;

// 数据直接超时,没有数据继续来,退出
if (iSingled==WAIT_TIMEOUT) return 1 ;
}

return -1 ;
}

这是一个比较可靠的笨办法,就是发送指令后,等到串口接收后继续等到超时(可以使单片机最长字符串间隔),那就必然不会出现问题,然后处理接收到的指令就能保持完整和可靠。

这是一个设备的处理方式,将所有设备都类似处理,不会出现数据交叉和利用率较低的情况。

热点排行