读取串口相应速度过慢,请高手帮忙看下代码,不胜感激
int SingleOrder( Uint16_t addr, Uint16_t com_no, unsigned char *sdata, Uint16_t &target)
{
int monitor = 0;
unsigned char rdata[10];
Uint16_t recvCRC;
DWORD dwReadCount = 0;
InitializeCriticalSection(&gref_cs);
int sendfailtimer = 0;
for(int i=0; i<ORDER_RETRY_TIME; i++)
{
EnterCriticalSection(&gref_cs);
//将sdata中数据发送到COM
int sendok = sendCom(com_no, sdata, ORDER_LEN);
if (sendok)
break;
else
{
sendfailtimer++;
LeaveCriticalSection(&gref_cs);
}
}
if(sendfailtimer == ORDER_RETRY_TIME)
return SENDFAIL;
//设备处理返回时间100ms;
Sleep(100);
for(int time=0; time<ORDER_RETRY_TIME; time++)
{
if (receiveCom(com_no, rdata, SINGLE_ORDER_BACK_LEN,dwReadCount) == 1) //收到响应设备存在
{
goto RECEIVE;
break;
}
}
//设备无响应
LeaveCriticalSection(&gref_cs);
return RECEIVEFAIL;
RECEIVE:
//对这里的数字进行定义
if( rdata[0] == addr && rdata[1] == ORDER_CODE_READ_HOLDINGREG && rdata[2] == 2)
{
recvCRC = rdata[5];
recvCRC = (recvCRC<<8) + (rdata[6]);
//对前len-2个字节循环校验,并判断是否有错
if(recvCRC != CalCRC(rdata, 5))
{
monitor = 3;
//若接收包帧出错,return 3;
LeaveCriticalSection(&gref_cs);
return PACKETERR;
}
//解析包中数据
memcpy(rdata, rdata+3, rdata[2]);
for(int i=0; i<1; i++)
{
rdata[i] = SWITCH_ENDIAN(rdata[i]);
}
LeaveCriticalSection(&gref_cs);
//取数据成功,返回1
target = rdata[0];
target =( target<<8) + rdata[1];
monitor = 4;
return ORDEROK;
}
return PACKETERR;
}
这里的接口作用是向指定串口中发送SDATA,设备会返回串口一个数据,然后我去读取到来的数据,加以校验,截取一个数据后通过引用返回,不过发现这个做起来效率很慢,执行时候很卡的样子,是不是要加入线程之类,请高人指点,不胜感激