MFC串口编程点滴以及加锁保护数据

客户用VC编程,串口操作485设备,需求很简单,发一条指令下去,然后接受设备返回的数据,解析后显示到界面上,他使用VC定时器来发送指令,定时50ms,想着20次发送一次指令,这样数据就可以1S更新一次数据了,结果完全不是他想象的那样1S发送一次,经常几秒甚至几十秒才能够发送一次,我看了他的代码,在定时器时间里面做了很多的工作。我判断他在定时器里面的操作远远不止50ms,所以决定帮他修改一下串口部分的代码,单独建立一个线程来发送与接收数据。

大体思路就是打开串口,设置好参数后建立一个线程,在里面使用ReadFile函数来读取数据,如果读回了数据,则将接收到的数据存到字节数组中。如果超时,就发送要数指令。本想用COMMTIMEOUTS结构中的ReadIntervalTimeout和ReadTotalTimeoutMultiplier组合来设置延时,按理说下面的设置应该延时1S才对:
ReadIntervalTimeout = 100
ReadTotalTimeoutMultiplier = 10
ReadTotalTimeoutConstant = 0
可实际却会延时5S之多,最后设置成下面的样子,才能相对准确的延时1S
ReadIntervalTimeout = 0
ReadTotalTimeoutMultiplier = 0
ReadTotalTimeoutConstant = 1000
随之而来又有一个匪夷所思的问题,就是在线程里面延时1S后,会让用户界面响应变慢。最后只好把ReadTotalTimeoutConstant 设置成100,然后在线程中读取超时时间,来保证1S要一次数据。

由于用到了多线程,所以需要加一个锁,使用临界区和工具函数来实现:

//声明
CCriticalSection readLock;
//在需要保护的数据前面
CSingleLock lock(&readLock);

还可以使用互斥量(CMutex),但是互斥量效率低一些,互斥量和临界区的区别如下(转自https://blog.csdn.net/weixin_42067304/article/details/115076080):
1、临界区只能用于对象在同一进程里线程间的互斥访问;互斥体可以用于对象进程间或线程间的互斥访问。
2、临界区是非内核对象,只在用户态进行锁操作,速度快;互斥体是内核对象,在核心态进行锁操作,速度慢。
3、临界区和互斥体在Windows平台都下可用;Linux下只有互斥体可用

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值