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

juniorli 2010-01-21 10:18:49
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,设备会返回串口一个数据,然后我去读取到来的数据,加以校验,截取一个数据后通过引用返回,不过发现这个做起来效率很慢,执行时候很卡的样子,是不是要加入线程之类,请高人指点,不胜感激
...全文
418 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
juniorli 2010-01-22
  • 打赏
  • 举报
回复
OVERLAPPED struct_overlap={0};
定义成异步读取,可是总是报这样的错,
Run-Time Check Failure #2 - Stack around the variable 'struct_overlap' was corrupted.
这个错误是什么原因,期待答案
悟迟 2010-01-21
  • 打赏
  • 举报
回复
开线程吧
hnb98075 2010-01-21
  • 打赏
  • 举报
回复
你是在哪里执行这段代码?主线程?执行的策略是什么?你把这段代码的执行时间可以打印出来看看。另外,这段代码的写法还是得改进。不过这个也只能靠慢慢的修练了。
hnb98075 2010-01-21
  • 打赏
  • 举报
回复
线程可以用CThread类,这个不错。
ccpaishi 2010-01-21
  • 打赏
  • 举报
回复
所有的解析和接受数据的过程全部放到另外一个线程里面去做,这样就好多了。CreateThread
long999999999 2010-01-21
  • 打赏
  • 举报
回复
你所说的卡 是因为你使用了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;
}
juniorli 2010-01-21
  • 打赏
  • 举报
回复
这个借口调用很频繁,大约一秒钟就要刷新一次,看来是应该分成几个线程去执行,谢谢hnb98075
hnb98075 2010-01-21
  • 打赏
  • 举报
回复
主线程执行应也没问题,关键是你调用这个函数是否频繁,如果频繁,开线程吧。我也不知道你何时要读取串口,这里举个例子,如果你在一个列表里显示你要从串口读取的数据,你可以这样,开一个线程依次读取列表里的要读的数值,放在内存,界面去内存取值刷新显示。

InitializeCriticalSection(&gref_cs); 这段似乎没有必要,你的gref_cs看起来不是这个函数里的局部变量。
juniorli 2010-01-21
  • 打赏
  • 举报
回复
hnb98075:你好,
我的这个只是一个主线程里头去执行的,如果要修改,刚开始写代码,也不知道在什么地方加线程,具体一点来说应该是什么样子呢?

2,643

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧