以下是网学网为您推荐的电气工程与自动化类别-嵌入式系统在多点温度控制中的应用,希望本篇文章对您学习有所帮助。
客服咨询,网学网竭诚为您服务,本站永久域名:myeducs.cn |
第五章 PC侧程序的设计 根据第四章的论述,为了实现对系统的监控和在线升级,需要在PC机侧完成相应的功能,同时也可以把系统的相关信息发送给PC机加以存储,以备以后分析利用。把测的温度值存储起来,在PC机上加以分析,有利于获得系统的特点,总结经验,更好的调节PID参数,完成对系统更有效快速的控制。 PC机侧程序的设计主要由两部分组成:通讯部分和ISP功能部分。根据它们的具体情况在实现时使用不同的协议。通信部分,要完成对系统的实时监控,既要发送控制命令,调节系统的运行状态和参数,也要读取相关信息,加以分析。由于信息类型较多,实现起来较复杂。相对而言ISP功能部分简单,除了对系统在线编程时要发送大量的数据信息外,其它的命令如片擦除、页擦除和保护功能,仅发送相关的命令即可完成。 在整个实际开发过程中,使用了如下开发条件: 开发环境:Windows 2000 Server 开发工具:Microsoft Visual C++ 6.0 在设计中使用了多线程技术。在Windows的一个进程内,通常包含一个或多个线程,线程是指进程的一条执行路径,它包含独立的堆栈和CPU寄存器状态,每个线程共享所有的进程资源,包括打开的文件、信号标识及动态分配的内存等等。一个进程内的所有线程使用同一个32位地址空间,而这些线程的执行由系统调度程序控制,调度程序决定哪个线程可执行和什么时候执行线程,线程有优先级别,优先权较低的线程必须等到优先权较高的线程执行完任务后再执行。在多处理器的机器上,调度程序可以把多个线程放到不同的处理器上运行,这样可以使处理器的任务平衡,也提高系统的运行效率。 5.1 PC机侧串行通信程序的设计 使用MFC开发是较普遍的VC++编程方法。在VC++6.0下,MFC应用程序的线程由CWinThread对象表示。VC++把线程分为两种:用户界面线程和工作者线程。用户界面线程能够提供界面和用户交互,通常用于处理用户输入并响应各种事件和消息;而工作者线程主要用来处理程序的后台任务,程序一般不需要直接创建CWinThread对象,通过调用AfxBeginThread()函数就会自动创建一个CWinThread对象,从而开始一个进程。创建上述的两种线程都利用这个函数。 线程的终止取决于下列事件之一:线程函数返回;线程调用ExitThread()退出;异常情况下用线程的句柄调用TerminateThread()退出;线程所属的进程被终止。 5.1.1程序设计的关键技术 多线程编程在串口通信中的应用中要考虑的问题: 1).串口通信对线程同步的要求 因为同一进程的所有线程共享进程的虚拟地址空间,而在Windows 9X/NT/2000系统下线程是汇编级中断,所以有可能多个线程同时访问同一个对象。这些对象可能是全局变量,MFC的对象,MFC的API等。 串口通信中,对于每个串口对象,只有一个缓冲区,发送和接收都要用到,必须建立起同步机制,使得在一个时候只能进行一种操作,否则通信就会出错。进行串口通信处理的不同线程之间需要协调运行。如果一个线程必须等待另一个线程结束才能运行,则应该挂起该线程以减少对CPU资源的占用,通过另一进程完成后发出的信号(线程间通信)来激活。 串口通信的几个特点决定了必须采用措施来同步线程的执行。为此,VC++提供了同步对象来协调多线程的并行,常用的有以下几种: CSemaphore:信号灯对象,允许一定数目的线程访问某个共享资源,常用来控制访问共享资源的线程数量。 Cmutex:互斥量对象,一个时刻至多只允许一个线程访问某资源,未被占用时处于有信号状态,可以实现对共享资源的互斥访问。 CEvent:事件对象,用于使一个线程通知其他线程某一事件的发生,所以也可以用来封锁对某一资源的访问,直到线程释放资源使其成为有信号状态。适用于某一线程等待某事件发生才能执行的场合。 CCriticalSection:临界区对象,将一段代码置入临界区,只允许最多一个线程进入执行这段代码。一个临界区仅在创建它的进程中有效。 5.1.2.1 主要函数介绍 1).串口设备初始化 初始化函数首先获得串口设备句柄,然后对其进行通信参数设置,包抱设置输入/输出缓冲区大小、超时控制和事件监视等。其中用到的函数有: ² 打开串口函数: HANDLE CreateFile( LPCTSTR lpFileName,//被打开的串口名,如“COM1”、“COM2”等 DWORD dwDesiredAccess,//访问模式(读写模式) DWORD dwSharedMode,//共享模式 DWORD LPSECURITY_ATTRIBUTES lpSecurityAttributes,//安全描述符地址 DWORD dwCreationDistribute,//如何打开文件 DWORD dwFlagsAndAttributes,//文件属性, HANDLE hTemplateFile//模板文件句柄 ); 如果函数调用成功,则返回一个打开的串口句柄,否则返回INVALID_HANDLE_VALUE。 ² 设置串口状态函数 先调用函数BOOL GetCommState(HANDLE hFile,LPDCB lpDCB)获得上面返回的串口句柄的确省dcb结构,修改相关参数后在调用 BOOL SetCommState(HANDLE hFile,LPDCB lpDCB) 函数完成对串口状态的设置。 其中,lpDCB是指向DCB结构的指针。DCB结构的参数项很多,主要包括波特率、数据位数、奇偶检验、停止位的设置等。如果函数调用成功则返回值为TRUE,否则返回值为FALSE。 ² 缓冲区设置函数 可以调用下面的函数重新分配发送和接收缓冲区的大小。 BOOL SetupComm(HANDLE hFile,DWORD dwInQueue,DWORD dwOutQueue); ² 清除缓冲区函数 BOOL PurgeComm(HANDLE hFile,DWORD dwFlags) 如清除发送缓冲区,则参数dwFlags设置位PURGE_TX_CLEAR;如清除接收缓冲区,则参数dwFlags设为PURGE_RX_CLEAR。 ² 创建监视事件函数 HANDLE CreateEvent(LPSECURITY_ATRRIBUTES lpEventAttributes,//事件的安全属性指针,为NULL时,不能被继承 BOOL bManualReset,//手工重置事件 BOOL bInitialState,//初始化状态, LPCTSTR lpName);//事件对象的指针 在程序中,创建了三个人工重置、没发信号的事件 ² 线程创建函数 利用函数CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL )来创建线程函数。参数pfnThreadProc为全局函数名,pParam为传递给全局函数的参数,与其保持一致。其他使用默认值。 |
本站发布的计算机毕业设计均是完整无错的全套作品,包含开题报告+程序+论文+源代码+翻译+答辩稿PPT |
本文选自计算机毕业设计http://myeducs.cn |