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,设备会返回串口一个数据,然后我去读取到来的数据,加以校验,截取一个数据后通过引用返回,不过发现这个做起来效率很慢,执行时候很卡的样子,是不是要加入线程之类,请高人指点,不胜感激
{
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,设备会返回串口一个数据,然后我去读取到来的数据,加以校验,截取一个数据后通过引用返回,不过发现这个做起来效率很慢,执行时候很卡的样子,是不是要加入线程之类,请高人指点,不胜感激
我的这个只是一个主线程里头去执行的,如果要修改,刚开始写代码,也不知道在什么地方加线程,具体一点来说应该是什么样子呢?
//初始化
DWORD Proc(LPVOID);
AfxBeginThread((AFX_THREADPROC)Proc,NULL,THREAD_PRIORITY_NORMAL);//执行
DWORD Proc(LPVOID)
{ while(1)
{
if ( bStopFlag )
{
return 0 ;
}
你的代码 ......
Sleep(55);
}
return 0;
}
定义成异步读取,可是总是报这样的错,
Run-Time Check Failure #2 - Stack around the variable 'struct_overlap' was corrupted.
这个错误是什么原因,期待答案