chap6- 多线程编程技术.ppt
文本预览下载声明
计算机控制工程 第五节 多线程两台计算机串口通信程序 以串口程序设计为例说明: 使用WinAPI编写串口程序时,为实现事件驱动方式,可以考虑单独建立一个线程,在该线程中循环检测串口事件,当串口发生感兴趣事件时,就发送消息,通知其它线程到串口读取数据。 当使用多个串口时,使用多线程为每个串口开辟一个线程,处理各个串口的数据接收。当有接受数据时,通过某种方式传输给主线程进行显示和处理。 计算机控制工程 多线程应用框架 一 以两台计算机间通信的程序为例多线程编程的具体方法。 … …. ON_MESSAGE(WM_MYMSG, OnReceiveEvent) … … … …. hThreadEvent=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProcEvent, dwParam, 0, dwThreadID); … … DWORD ThreadProEvent(LPVOID pParam) { //… //满足某种条件时; ::PostMessage(hWnd, WM_MYMSG, 0, (LPARAM)EV_RXCHAR); ……. } LONG CPC2PCView::OnReceiveEvent(…) { …… //读取串口操作 …… } 第五节 多线程两台计算机串口通信程序 计算机控制工程 两台计算机之间通信方式 二 第五节 多线程两台计算机串口通信程序 1. 通过网线传输 2. 通过USB线传输 3. 通过并口传输(SPP、ECP) 4. 通过串口传输(2RxD、3TxD号线对调) 计算机控制工程 第五节 多线程两台计算机串口通信程序 通信协议 三 1. 通信流程 通信采用发送/应答半双工方式。通信过程分为: 发送请求和发送文件 两个过程。 发送请求: 发送方首先发出请求包,并等待应答方响应。 若收到应答方ACK( 6)响应,发送数据包; 若收到应答方NAK(21)响应,重发请求包; 若收到应答方CAN(24)响应,取消本次发送请求; 计算机控制工程 第五节 多线程两台计算机串口通信程序 发送文件: 发送方将待发送的文件以1024字节为单位拆分成N个数据片段,最后一个数据片段长度不定。每次使用普通数据包发送一个数据片段,若接受方接受正确,会发送一个ACK响应,发送方在收到正确的响应后,继续发送含有下一个数据片段的普通数据包;若发送方收到NAK响应,则重发上一次发送的普通数据包。这个发送过程需要循环N-1次。 当发送方发送到第N个数据片段时,使用结束包格式进行发送,若接受方正确响应ACK,则通信正常结束;若接受方响应NAK,则发送方重发含有第N个数据片段的接受包 计算机控制工程 第五节 多线程两台计算机串口通信程序 重要说明: 发送方对于同一个数据包的重发操作,设定最多进行3次。3次后,发送方若仍接受不到ACK响应,则中断文件传输操作,并提示通信错误。 思考: 如用4个字节表示文件长度;则文件最大长度是多少? 给定合法长度文件,如何填装4个字节; 计算机控制工程 第五节 多线程两台计算机串口通信程序 数据包格式 四 1. 请求包 长度由文件名长度决定 从ENG开始到其前面所有字节的异或运算和 2. 普通数据包 计算机控制工程 3. 结束包 第五节 多线程两台计算机串口通信程序 4. 响应包:长度固定为1个字节。 计算机控制工程 第五节 多线程两台计算机串口通信程序 通信实现思路 五 通信程序使用Windows API事件驱动方式、多线程技术。 在程序中,为通信的事件检测设立一个单独的事件线程,该线程负责监视串口事件。当串口收到字符或发生读超时时,该线程便发送相应消息。通信消息响应函数捕获事件线程发送的消息,并根据消息类型进行处理。 所有消息公用一个消息响应函数,故设置3个反映当前通信状态的变量,进入消息响应函数后,通过对这些通信状态变量值的不同采取不同的操作。 计算机控制工程 第五节 多线程两台计算机串口通信程序 1. 功能描述 双机通信程序。既可作为发送方使,也可作为接受方使用。程序运行后,自动进入接受态。 2. 事件线程函数 为处理通信事件,专门建立一个事件线程。在该事件线程函数中,监视串口事件的当前消息,包括是否收到新字符和是否发送超时。当收到新字符或发生超时,便发送Windows消息。 计算机控制工程 第五节 多线程两台计算机串口通信程序 事件线程函数处理流程图 计算机控制工程 3. 消息响应函数 第五节 多线程两台计算机串口通信程序 既可作为发送又可作为接受程序: 1: 发送状态; 10:接受状态 0态:表示发送操作尚未开始,程序处于接受状态。程序初次启
显示全部