您好,欢迎访问天氏库力官网!


首页 > 技术支持 > 技术文库 >

试验机的两种实时串口通信方法详解

返回列表来源:天氏库力 发布日期 2018-12-25 浏览:

计算机被越来越广泛地使用在从外部机器或设济上获取数据,并在对数据进行加工处理后进步去控制外部机器或设备的应用中。在此过程中,计算机与外部电路采用什么接口就显得尤为重要。PC机中的异步串行通信口因具有接口简单,容易实现等优点,己被广泛的使用,成为一种常用接口。
 
在Windows中,异步串行通信口驱动程序充当了通信程序的角色,它对Windows程序设计人员隐藏了串口通信的底层操作,通过Windows的API函数为用户提供了更简单的访问接口-与文件的操作常相似的接口。
 
1.两种实时串口通信方法
当串口的通信电路收到一个数据后,会向CPU发出个中断请求,通过响应这个中断可以非常及时±也对数据进行处理,可以说这是实时串口通信的最好不能进行像响应断这样低级的报作,只能通过编写设备驱动程序来实现。而编写设备驱动程序比编写普迎的应用程序要复杂得多。且如果设备驱动程序有问题将有可能造成整个windows崩溃。所以,除非是在对实时性要求非常苛刻的应用中,否则建议不要采用上述方法。下面将介绍两种能够在windows中实现串口通信的简单易行的方法。
 
1.1利用定时器
 
定时器是一种特殊的资源,它能够被赋予一个时间值,此后每隔这个时间,定时器便会向指定窗口发送一条定时器消息或调用一个指定的回调函数。因此利用定时器,我们便可以在一定程度上实现实时串口通信,设置定时器,进入消息循环,然后在收到一条定时器消息时便去接收传到串口中的数据,并对数据进行相应的处理;然后继续消息循环,等待下条定时器消息。这种通信方式有两个需要澄清:
 
a.在等待定时器消息到达期间,可能有不止一个数据传到串口中,这样会造成数据丢失吗?
因为windows本身对串口提供了一个数据缓冲区,每当收到一个数据后,windows会首先将该数据保存到该缓冲区中,因此只要在等待定时器消息到来期间传到串口的数据不超过windows的串缓冲区的大小,便不会造成数据丢失。
 
b.如何确定定时器的时间值
定时器的时间值的确定要根据实际应用环境中对系统的实时性要求及接收的数据试来确定。如果应用环境对实时性要求不高、接收到的数据不多则可以将时间值设得大些;相反,在对实时性要求相对较高的数据很多时,则应将时间值设得小些。
 
另外,windows对实时器的最小时间值有个限制。就是最小时间值为55ms,如果定时器被赋予比这个时间值更小的值,系统都认为是55,也就是说,利用定时器进行实时串口通信,最大的延迟可能为55ms。如果应用环境要求实时处理的延迟低于55ms,或在55ms内所接收到的数据大于windows串缓冲区的人小则不能使用这个实时通信方法
 
1.2利用多线程技术
在利用定时器产生的定时器消息可以每间隔一段时间去进行一个串口通信处理,那么为什么非要间隔一段才去处理而不是一直等待,一旦发现串口接收数据立即处理呢?这需要从windows消息循环机制说起。对于每个拥有窗口用户界面的应用程序,windows都要求它有个消息循环来处理各种消息(如键盘按键。鼠标移动窗口绘制等),一旦消息循环中止。该应用程序的窗口将不再响应任何消息。从用户的角度来看,这个窗口就意味着己经停止响应,是个死窗口。所以,在一般的单线程应用程序中,如果一直等待串口接收到数据,就将造成程序的窗口界面不可访问。
 
要解决这一问题可以采用多线程程序设计技术。当系统创建一个进程时,都会同时为该进程创建一个线程称之为主线程。普通的应用程序只有这一个线程。消息循环依赖于它,所以它绝不应该在消息循环之外停下来等待某事件发生。
 
一个线程不行,考虑能否使用多个线程。即在程序启动后,人为的再创建一个线程称之为辅助线程,这样包括系统创建进程时创建的线程就有两个线程了。让主线程执行消息循环,而辅助线程则专门负责进行串口通信。这样一来便可以让辅助线程停下来,专门等待传到串口中的数据。一旦收到数据就立即执行。对数据进行处理。可见,通过多创建一个辅助线程使得串口通信的实时性比利用定时器要高得多,比直接响应中断的方式相差不了多少了。
 
2.试验机应用中的比较
对弹簧试验机和材料试验机测试系统中有关上下位通信问的解决法,分别采用了上述两种方法,下面将从几个不同的方面对这两种方法的优缺点进行比较。
 
①实现的难易程度上看
利用定时器来实现实时串行通信的方法可以说是很简单的,只需要设置一个定时器,然后在响应windows的定时器消息时进行一次串行通信。由于这种方法只需要一个线程因此也不存在线程同步的问题。
 
利用多线程来实现实时串行通信相对而言就比较复杂了,首先,要额外创建一个线程并要对该线程进行管理,其次,两个线程之间如果需耍进行数据交换则还需要考虑到线程同步的问题。
 
②CPU资源占用率上看。
对于第一种方法。由于每隔一段时间就要查询一次是否有数据到达。而且随着应用环境对实时性要求的提高,这个时间间隔越短,如果不是很频繁地接收到数据,那么这些查询势必会减小CPU的利用率。
 
对于第二种方法则CPU的利用率较高,因为如果没数据到达,则串口通信的辅助线程处于等待状态,只有串口接收到数据后该线程才会被激活重新进的就绪状态。因此它不会消费CPU资源。
 
③实时性程度的角度上看
第一种方法的实时性程度是可变的,与设置的定时器的时间间隔有关,但最小间隔是55ms,因此这种方法所能达到的实时性程度并不是很高。而这55ms是被系统所制约的,无法通过提高计算机性能或提高算法效率等方法来缩小这一限制。
 
第二种方法则不同,只要一接收到数据,程序便可以立即处理,因此实时性比第一种方法要高得多,且制约实时性的唯一因素就是处理数据的那段代码所消耗的时间,这一时间可以通过提高计算机性能、提高算法效率或改变线程优先级等手段来缩短。从而进一步提高实时性程度。
 
由此看出,在实际应用中应该根据具体的应用环境来选择不同的方法:如果应用环境对实时性要求不高时,则可利用定时器,这将便于程序的调试也不会碰到因线程同步不好而造成系统出错或死锁的问题;如果应用环境对实时性要求较高,用定时器无法实时或只能勉强实现时,则应考虑采用多线程技术。此时应注意线程同步问题及对辅助线程的管理。
 
3.结束语
本文介绍的两种方法可以较好地实现windows下的实时串口通信,且己经能够满足大部分的应用需求,这两种实时串口通信的方法都分别在弹簧试验机和材料试验机测试系统有成功的应用,并取得了令人满意的效果。然而我们应该知道,如果通过对windows对串口进于操作。由于windows在发送数据之前或接收数据之都要进行很多额外的处理,这些都将消耗一定的CPU资源从而降低了处理实时性程度,因此如果应用环境对实时要求相当苛刻则这两种方法都将不再适用,这时则应考虑采用编写设备驱动程序的方法了。

推荐阅读

【本文标签】:试验机实时串口通信方法

【责任编辑】:天氏库力 版权所有:http://www.tinius-kuli.com/转载请注明出处

最新资讯

1拉力试验机校准的注意事项

225种常见的材料试验性能的介绍

3液压拉力材料试验机测控系统研究

4拉力试验机单向静拉伸载荷下的力学性能测试方

5购买卧式拉力试验机需注意的事项

6拉力试验机如何测试胶水的粘合强度

7一次性口罩垫片可以防病毒吗?

8实验原始记录如何保持“原始”?

9《儿童口罩技术规范》国家标准有关最新进展

10通气阻力及气体交换压力差测试仪试验方法

全国服务热线134-0513-1752