当前位置:首页 > 述职报告 > python多线程串口通信 多线程技术在串口通信中的应用
 

python多线程串口通信 多线程技术在串口通信中的应用

发布时间:2019-02-21 04:11:56 影响了:

  [摘 要]Windows支持多线程技术,在串口通信程序中应用多线程技术,可以提高资源利用率。   [关键词]多线程 串口通信   [中图分类号]TP[文献标识码]A[文章编号]1007-9416(2010)02-0074-01
  
  The Application of Multi Thread in Serial Communication
  [Abstract]Windows system can create multi thread.The application of mutli thread in serial communiction can promote the efficiency of the resource.
  [Key words]Multi Thread;Serial Communication
  
  串口应用是一种常见的应用技术,无论是在工业控制领域,还是其它行业,其应用屡见不鲜。做为计算机与外部串行设备之间常用的数据传输通道,在很多工业控制系统中,通常要求系统具有实时计算能力,串口能够满足高效中断处理、多任务和通信的需要。在作者参与设计的项目“保健监测系统”中,将多线程技术应用于串口通信中,在收发数据的同时执行海量数据的存储、图形绘制等任务,提高了资源的利用率。
  1 多线程技术
  Windows是一种抢占式多任务操作系统。在Win32中,进程可以占据4GB的地址空间。但进程是没有活力的,为了让进程完成一些工作,进程至少占有一个线程。线程只有一个内核对象和一个堆栈,需要很少的内存。
  所谓多线程,即在同一程序中可以同时执行多个任务。根据需要,用户可以在应用程序中创建多个线程。对于单CPU的计算机,操作系统为每个线程安排一些CPU时间片(约20微秒),同一时间片,只有一个线程运行,由于时间片很小,仿佛线程同时工作。
  对于那些比较耗时的操作,都可以单独开辟一个线程。在主线程中执行这些操作时会让用户感觉程序反应迟钝。一些循环的检测操作都可以放到单独的线程中执行,然后这些线程在与主线程进行通信。
  多线程系统一般包括线程创建、线程同步与通信、线程终止,其中关键是线程同步与通信。线程通信即线程间交换数据的方法通常使用全局变量和消息。线程同步即解决多线程对共享资源访问冲突的方法通常使用临界区、互斥对象、信号量和事件。
  2 串口通信中多线程技术的应用
  编制串口通信程序的一般步骤为:打开串口、配置串口、开启事件线程、数据读写、关闭事件线程、关闭串口。
  CreateFile函数为打开串口函数,它还可以操作文件、命名管道和油槽等。为避免可能出现的I/O操作长时间占用CPU时间,影响其它任务处理,串口通过重叠机制打开,具备异步I/O功能,因此需要使用SetCommTimeouts函数对串口进行超时设置,同时须定义OVERLAPPED结构,其中hEvent必须自己建立。使用SetupComm函数设置输入和输出缓冲区大小,SetCommState函数通过定义DCB结构来定义串口配置。
  串口配置好后使用AfxBeginThread函数来开启线程,在线程中监视串口事件。在线程函数中用到很多Windows API函数,WaitCommEvent函数监视通信事件时,如果异步操作不能立即完成,则函数返回FALSE。如果使用GetLastError函数返回ERROR_IO_PENDING表明该操作正在后台执行。
  在读取数据过程中,本程序中每次从缓冲区中读出一个字符。主要原因在于,如果当第一个字符到达缓冲区时,引发WaitForMultipleObjects函数,当函数返回时,将异步(重叠)I/O操作事件句柄m_OverlappedStruct.hEvent变量复位,即设置为未标识状态。如果在复位操作后到调用ReadFile函数之间有其它字符到达,m_OverlappedStruct.hEvent会被重新置位,即设置为已标识状态。这时调用ReadFile函数如果从缓冲区中读出所有数据,那么由于m_OverlappedStuct.hEve已标识,可是却没有数据可以读,GetOverlappedResults函数将阻塞线程,线程对关闭线程事件和写事件处于已标识状态将不响应。因此本程序每次只读一个字符。
  本程序中使用等待函数WaitForMultipleObjects直到有相应事件发生,当事件到来时,使用GetCommMask可以获得什么事件被设置为有信号状态,从而做出相应处理。在读处理消息响应函数中使用ReadFile来读取数据。通过设置写事件为有信号状态来通知辅助线程有数据需要发送,应用WriteFile函数发送数据。设置线程关闭事件为有信号状态从而使线程关闭进而关闭串口。
  3 数据接收过程中临界区和事件对象的使用
  事件对象是线程同步的最基本方法之一。一个事件对象可以处于已标识和未标识两种状态,如果将事件对象设置为已标识状态,表示可以执行同步操作,事件对象处于未标识状态,则表示需要等待事件对象变为已标识状态才可以进行同步操作。使用CreateEvent函数创建事件对象,如果成功,将返回事件对象句柄,失败则返回0值。在本程序中创建了三个事件对象,用于实现线程的同步。使用WaitForMultipleObjects函数来等待相应事件的发生。
  临界区是进行线程同步的另一种方法,它能够阻止两个或多个不同线程在同一时间内访问同一个代码区域。通过调用EnterCriticalSection函数来指出已经进入代码的临界区,如果另一线程也调用了EnterCriticalSection函数,并且其参数都指向同一临界区对象,那么另一线程将阻塞,直至第一个线程调用了LeaveCriticalSection函数离开临界区为止。临界区能够保护代码的多个线性区域,只要这些代码区域都使用同一个临界区对象。利用临界区对象进行同步的一个缺点是,它只能同步同一进程中的线程。本程序中,在接收数据时使用临界区,可以保证在同一时间内只有一个线程有操作本串口资源的权限。
  4 结语
  以上概述了多线程技术在串口通信中的应用,在作者参与的项目“保健监测系统”中,表现出良好的性能。在接收数据同时,同时进行实时曲线的绘制,取得很好的效果。
  
  [参考文献]
  [1] 葛子昂.Windows 核心编程[M].北京:清华大学出版社,2008.
  [2] 龚建伟.Visual C++/Torbo C串口通信编程实践[M].北京:电子工业出版社,2008.
  [3] 张筠利,刘书智.Visual C++实践与提高―串口通信工程应用篇.北京:中国铁道出版社,2006.
  [基金项目]
  与哈尔滨工业大学合作项目。

猜你想看
相关文章

Copyright © 2008 - 2022 版权所有 职场范文网

工业和信息化部 备案号:沪ICP备18009755号-3