读取串口相应速度过慢,请高手帮忙看下代码,不胜感激,该怎么解决

读取串口相应速度过慢,请高手帮忙看下代码,不胜感激
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,设备会返回串口一个数据,然后我去读取到来的数据,加以校验,截取一个数据后通过引用返回,不过发现这个做起来效率很慢,执行时候很卡的样子,是不是要加入线程之类,请高人指点,不胜感激

------解决方案--------------------
你是在哪里执行这段代码?主线程?执行的策略是什么?你把这段代码的执行时间可以打印出来看看。另外,这段代码的写法还是得改进。不过这个也只能靠慢慢的修练了。
------解决方案--------------------
开线程吧
------解决方案--------------------
主线程执行应也没问题,关键是你调用这个函数是否频繁,如果频繁,开线程吧。我也不知道你何时要读取串口,这里举个例子,如果你在一个列表里显示你要从串口读取的数据,你可以这样,开一个线程依次读取列表里的要读的数值,放在内存,界面去内存取值刷新显示。

InitializeCriticalSection(&gref_cs); 这段似乎没有必要,你的gref_cs看起来不是这个函数里的局部变量。
------解决方案--------------------
你所说的卡 是因为你使用了Sleep(100)语句 确实解决这个问题要另创建个线程
//初始化
DWORD Proc(LPVOID);
AfxBeginThread((AFX_THREADPROC)Proc,NULL,THREAD_PRIORITY_NORMAL);

//执行
DWORD Proc(LPVOID)
{

while(1)
{
if ( bStopFlag )
{
return 0 ;
}
你的代码 ......
Sleep(55);
}
return 0;
}
------解决方案--------------------
所有的解析和接受数据的过程全部放到另外一个线程里面去做,这样就好多了。CreateThread

------解决方案--------------------
线程可以用CThread类,这个不错。