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

解决方案 »

  1.   

    hnb98075:你好,
    我的这个只是一个主线程里头去执行的,如果要修改,刚开始写代码,也不知道在什么地方加线程,具体一点来说应该是什么样子呢?
      

  2.   

    主线程执行应也没问题,关键是你调用这个函数是否频繁,如果频繁,开线程吧。我也不知道你何时要读取串口,这里举个例子,如果你在一个列表里显示你要从串口读取的数据,你可以这样,开一个线程依次读取列表里的要读的数值,放在内存,界面去内存取值刷新显示。InitializeCriticalSection(&gref_cs); 这段似乎没有必要,你的gref_cs看起来不是这个函数里的局部变量。
      

  3.   

    这个借口调用很频繁,大约一秒钟就要刷新一次,看来是应该分成几个线程去执行,谢谢hnb98075
      

  4.   

    你所说的卡 是因为你使用了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;
    }
      

  5.   

    所有的解析和接受数据的过程全部放到另外一个线程里面去做,这样就好多了。CreateThread
      

  6.   

    线程可以用CThread类,这个不错。
      

  7.   

    OVERLAPPED struct_overlap={0};
    定义成异步读取,可是总是报这样的错,
    Run-Time Check Failure #2 - Stack around the variable 'struct_overlap' was corrupted.
    这个错误是什么原因,期待答案