工作中串口读写同步方式下的效率优化记录事件
来源:互联网 发布:天津软件行业协会 编辑:程序博客网 时间: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毫秒的间隔再读操作(之前不等待就会出错,时间越短,出错概率越大),现在直接不需等待时间,就直接读操作还几乎没有出错的情况观察到,那真是很大的提高效率。
- 工作中串口读写同步方式下的效率优化记录事件
- 工作中客户端返回结果处理方式的记录
- windows下线程同步方式(事件)
- Linux下读写UART串口的代码
- Linux下读写UART串口的代码 .
- Linux下读写UART串口的代码
- Linux下读写UART串口的代码
- 线程同步的方式-互斥锁/读写锁
- win32串口读写多线程同步
- .NET中对串口(COM)读写操作方式汇总
- WinCE下读写串口
- mini2440下串口读写
- 记录工作中可能用到的——点击时间短一种事件,时间长一种事件
- 工作中需要的各种能力,记录下
- 多线程同步工作的两种方式
- 工作中效率有待提高的点
- 工作中提升效率的工具
- C# API方式串口读写
- iOS 性能调优,成为一名合格 iOS 程序员必须掌握
- easyui combobox设置默认值 获取text
- [置顶] phpstorm 2016.2 的最新破解方法(截止2016-8-1)
- 机器人操作系统ROS Indigo 入门学习(6)——理解ROS Nodes
- CAFFE +ubuntu14.04
- 工作中串口读写同步方式下的效率优化记录事件
- javascript正则表达式
- 小项目-鼠标移入改变图片透明度
- HTTP协议状态码详解
- Android自动在线升级完整版,服务器为Tomcat
- 机器人操作系统ROS Indigo 入门学习(7)——理解ROS Topic
- AS clean 出现的问题
- String 类
- linux下nginx服务应用总结(2)--突破10万高并发的nginx性能优化经验(含内核参数优化)