工作中串口读写同步方式下的效率优化记录事件

来源:互联网 发布:天津软件行业协会 编辑:程序博客网 时间:2024/06/16 06:44

工作中的项目使用串口的数据提供样机是同步方式的,以前主要用了异步方式的编码;对同步方式的编码没有自己的研究,只是先让可以工作。

但是在实际工作中发现读取的效率有问题:于是自己研究了这部分代码发现找的别人的例子代码是有大问题的。

暂时记录一下:

bool CDJCom::ComRead(LPBYTE buf, int &len)
{
DWORD ReadSize = 0;
BOOL rtn = FALSE;
//设置读取1个字节数据,当缓存中有数据到达时则会立即返回,否则直到超时
if (m_hCom==INVALID_HANDLE_VALUE)
{
return false;
}
rtn = ReadFile(m_hCom, buf, 1, &ReadSize, NULL);
//如果是超时rtn=true但是ReadSize=0,如果有数据到达,会读取一个字节ReadSize=1
if (rtn == TRUE && 1 == ReadSize)
{
DWORD Error;
COMSTAT cs = {0};
int ReadLen = 0;
//查询剩余多少字节未读取,存储于cs.cbInQue中
ClearCommError(m_hCom, &Error, &cs);
ReadLen = (cs.cbInQue > len) ? cs.cbInQue:len;
if (ReadLen > 0)
{
//由于之前等待时以读取一个字节,所欲buf+1
rtn = ReadFile(m_hCom, buf+1, ReadLen, &ReadSize, NULL);
len = 0;
if (rtn)
{
len = ReadLen + 1;
}
}
}
PurgeComm(m_hCom, PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR|PURGE_TXABORT);
return rtn != FALSE;
}

实际上同步操作com口,读写交叉进行就可以了。这个上面的读取方法,先是试读一个字节,如果读取到就使用ClearCommError(m_hCom, &Error, &cs);ReadLen = (cs.cbInQue > len) ? cs.cbInQue:len;查询剩余多少字节未读取,得到这个未读取的剩余字节后,再按照这字节数进行读取;这之后测试读取成功后,还要和之前读取的数据挨着顺序存放读取。

明显这里面的操作就降低了速度。

在读取com数据的时候,一种是读取到获取的数据量方法返回,另一种是读取不到要读取的数量而超时返回;

所以,在需要对串口读取的时候,直接去读就可以了。

在优化代码之后,直接用读取特定数量(由于工作中的协议返回的是固定长度,我在代码中直接使用要读取的固定长度)立即返回,大大提高了读取速度。


这个读取com的效率问题:其实不应该存在的,同步的操作读写本来就很简单。而我因为两年后,再使用串口操作,就直接用了别人现成的同步读取,在使用过程中发现有这个效率问题,所以就有了这个记录。

同步读取的具体的效率还需要添加代码进行详细的统计,但是相比之前的操作:写了数据后,需要等待14-50毫秒的间隔再读操作(之前不等待就会出错,时间越短,出错概率越大),现在直接不需等待时间,就直接读操作还几乎没有出错的情况观察到,那真是很大的提高效率。

0 0
原创粉丝点击