计算机控制工程复习题一、填空题1.根据计算机在控制中的典型应用,可将计算机控制系统划分为操作指导控制系统、直接数字控制系统、监督控制系统、分布式控制系统和现场总线控制系统。
2.计算机控制系统由硬件和软件两部分组成。
3.假设比特率为B bps,一次谐波频率为B/8 Hz,普通语音级线路截至频率为3000Hz,则允许通过最高谐波次数为24000/B 。
4.数字通信系统主要技术指标为传输速率、出错率、信道容量。
5.实现数据交换方法主要有电路交换、报文交换及分组交换。
6.RS232串口标准传输方式为单端收发,RS485标准传输方式为平衡传输方式。
7.常用的软件调试方式有强行排错法、回溯排错法、归纳排错法及演绎排错法。
8.MSComm控件传输数据类型可分为纯文本数据和二进制数据。
9.使用WinAPI编写串口通信程序读写操作有同步和异步两种方式。
10.基于WinAPI串口通信程序数据接受主要有查询和事件驱动两种方式。
11.Windows多线程编程方式主要有Win32API、标准C库以及MFC类库三种方式。
12.在Windows多线程编程方式中,线程之间主要采用全局变量和自定义消息两种方式进行通信。
13.Win32API提供临界区、互斥对象、信号量及事件对象实现线程之间的同步。
14.控制网络和信息网络集成主要采用网络互联、动态数据交换及数据库技术。
15.软件体系结构主要包括B/S、C/S及单机三种模式。
二、简单题1、试阐述网络体系结构、层次模型及协议之间的关系。
参考答案:层次模型决定是网络模型的分层数及每层的功能定义;协议描述对等层之间的数据传输方式;网络体系结构包括层次模型及协议两个方面。
2、试阐述协议、服务、接口之间的关系;参考答案:服务即功能;接口即调用方式;协议则是服务的实现方式。
三者是紧密相关的。
3、在计算机和单片机通信过程中,考虑下位机(单片机)程序为测试程序,上位机(PC)程序为被测试程序,试举例说明二者正常数据采集(通信)过程。
参考答案:4、试说明MSComm控件RThreshold属性含义。
参考答案:该属性是一个阈值。
当接受缓冲区中字符数达到阈值时,MSComm 控件产生OnComm事件,并且CommEvent属性会设置为ComEvReceive,即接受事件。
若设置为0时,则不论接受缓冲区中有多少字符,都不会产生OnComm 事件。
5、试说明MSComm控件SThreshold属性含义。
参考答案:该属性是一个阈值。
当发送缓冲区中的字符数达到阈值时,MSComm 控件将产生OnComm事件,并且CommEvent属性被设置为CommEvSend值。
6、假设串口采用半双工方式,使用一问一答方式通信协议,接受数据长度存在10字节、15字节和20字节三种可能性的情况下,简要说明接受数据的实际处理方法。
参考答案:置RThreshold为10,在OnComm事件中预读10个字节,判断是否完整帧。
若是完整帧,则设置InputLen为0或10,然后使用GetInput()读取即可。
否则设置InputLen为5,然后GetInput()读取,与前10个字节合并一帧,判断是否完整。
如是非完整帧则设置InputLen为5,然后GetInput()读取。
7、假设串口采用半双工方式,使用一问一答方式通信协议,接受数据长度长度不确定的情况下,简要说明接受数据实际处理方法:参考答案:数据通常包含有特定格式的数据头,可以通过数据头计算出整个数据帧的长度。
假定这些特定格式的数据头长度为10字节。
按照下述步骤处理:设置RThreshold=10,在OnComm事件中首先设置InputLen=10,使用GetInput()函数读取缓冲区,并根据读取数据判断整个数据帧长度。
然后读取InBufferSize 属性值,并判断该值是否为整个数据帧长度与10之差;若不是,则反复读取,直至该值为整个数据帧长度与10之差。
此时设置InputLen=0或InBufferSize值,并使用GetInput( )函数读取缓冲区,将读取数据与前10个数据合并成一个完整的数据帧。
8、简要说明采用MSComm控件进行串口数据采集程序设计步骤。
参考答案:加载控件;初始化及打开串口;事件处理;关闭串口;通信协议约定。
9、简要说明在基于对话框程序中使用MSComm控件的操作步骤。
参考答案:拖放控件图标至窗口,创建控件ID;在对话框头文件申明CMSComm 类变量及引用控件类头文件;创建CMSComm实例;建立控件事件响应代码框架。
10、简要说明WinAPI串口通信同步查询编程方式操作步骤。
参考答案:CreateFile (非重叠方式);初始化串口句柄;WriteFile(发送数据);ReadFile (读取数据);CloseFile (关闭串口)。
11、简要说明WinAPI串口通信异步重叠I/O查询编程方式操作步骤。
参考答案:定义全局变量;创建串口;发出读写操作;读写线程函数的建立;关闭串口;12、简要说明Windows编程中HANDLE(句柄)的概念。
参考答案:指针包含的是引用对象的内存地址,而句柄则是由系统所管理的引用标识,该标识可以被系统重新定位到一个内存地址上。
这种间接访问对象的模式增强了系统对引用对象的控制。
13、简要说明Windows多线程编程概念。
参考答案:每个正在系统上运行的程序都是一个进程。
每个进程包含一到多个线程。
进程也可能是整个程序或者是部分程序的动态执行。
线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。
也可以把它理解为代码运行的上下文。
所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。
通常由操作系统负责多个线程的调度和执行。
线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程。
线程和进程的区别在于子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文.多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定。
线程的运行中需要使用计算机的内存资源和CPU。
13、简要说明Windows中线程和进程的关系。
参考答案:进程:进程是一个程序实例;进程占据4GB地址空间,在该空间存放应用程序执行所需要的各种资源;Win32进程没有活力,是静态的。
线程:线程是CPU调度计算任务的最小单位;Win32进程创建时,会自动创建一个主线程;主线程可以创建其它线程(辅助线程)。
14、简要说明Windows中终止线程的方法。
参考答案:终止线程有三种方法:线程函数自然退出;内部使用退出函数AfxEndThread\ExitThread\_endthread;外部使用TerminateThread函数。
15、如何在MFC类库中使用自定义消息实现线程之间通信?参考答案:(1) 声明自定义消息:在头文件顶部加入消息名称声明:const WM_THREADMSG = WM_USER+100;(2) 声明消息响应函数:在头文件//}}AFX_MSG和“DECLARE_MESSAGE_MAP()”之间声明消息响应函数:Afx_msg LONG OnThreadMsg(WPARAM wParam,LPARAM, lParam)(3). 建立消息连接:在实现文件//}}AFX_MSG_MAP和“END_MESSAGE_MAP()”之间:ON_MESSAGE(WM_THREADMSG, OnThreadMsg)(4). 编写消息响应函数:在实现文件中,添加消息函数函数的实现体:LONG CMyClass::OnThreadMsg(WPARAM wParam,LPARAM lParam) {// 加入响应函数的具体处理代码}(5). 寄送自定义消息:BOOL PostMessage( HWND hWnd, UINT Msg,WPARAM wParam, LPARAM lParam);16、简要说明OSI/RM模型中物理层定义。
参考答案:利用物理传输介质为数据链路层提供物理连接,以透明地传送比特流。
物理层实际上是设备之间的物理接口,它规定了机械特性、电气特性、功能特性及过程特性。
17、简要说明OSI/RM模型中数据链路层的主要功能。
参考答案:提供可靠的比特流传输服务。
18、简要说明TCP/IP层次模型。
参考答案:应用层、传输层(TCP/UDP)、互联网层、主机至网络层。
19、简要说明局域网参考模型中MAC子层的主要功能。
参考答案:决定广播信道中信道分配协议的子层。
三、程序题及设计题1、MSComm控件输入和读出数据均为V ARIANT数据类型,考虑传输数据为纯文本,试编程实现从接受缓冲区中读取字符(给出C++代码片段)。
参考答案:V ARIANT input;char charInput[100];int counts = m_COMM.GetInBufferCount(); //m_COMM为MSComm控件对象If (counts>0) {input = m_COMM.GetInput( );}ASSERT(input.vt == VT_BSTR);CString strInput(input.bstrVal)strcpy(charInput, strInput);2、MSComm控件输入和读出数据均为V ARIANT数据类型,考虑传输数据为二进制,试编程实现从接受缓冲区中读取二进制数据(给出C++代码片段)。
参考答案:V ARIANT input;BYTE rxdata[2048];COleSafeArray safeArray;input = m_COMM.GetInput( ); // 其中m_COMM为MSComm控件对象safeArray = input;long len = safeArray.GetOneDimSize( );for(long k=0; k<len; k++) {safeArray.GetElement(&k, rxdata+k);}3.基于多线程技术、事件驱动方式实现串口双机数据通信程序,该程序即可作为发送方使用也可作为接受方使用。
其中传输数据小于64M;请求包、普通数据包、结束包及响应包帧格式表示如下。
请求包:普通数据包:结束包:响应包:请设计事件处理函数和消息响应函数的流程图。
参考答案:事件处理函数处理流程图消息响应函数处理流程图:其中发送状态1态:发送操作已经开始,请求包已经发出;2态:第一个普通数据包已经发出,等待接受方响应;3态:结束数据包已发送,等待接受方响应;接受0态:等待发送方请求包;1态:等待接受普通或结束数据包。
四、程序阅读题1、HANDLE hCOM;hCOM = CreateFile (“COM2”,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);if ( hCOM != INV ALID_HANDLE_V ALUE) {SetupComm(hCOM, 1024, 1024);DCB myDCB;GetCommState(hCOM, &myDCB);myDCB.BaudRate = CBR_19200;myDCB.fBinary = TRUE;myDCB.fParity = TRUE;myDCB.ByteSize = 8;myDCB.Parity = ODDPARITY;myDCB.StopBit = ONESTOPBIT;SetCommState(hCOM, &myDCB);}Else {AfxMessageBox(“创建串口失败!”);}参考答案:HANDLE hCOM; // 申明句柄;hCOM = CreateFile (“COM2”, // 使用串口2;GENERIC_READ|GENERIC_WRITE, // 读写方式,可以接受及发送;0,// 不允许共享;NULL,// 默认安全属性;OPEN_EXISTING, // 打开已有端口,不能创建);FILE_ATTRIBUTE_NORMAL, // 非重叠操作;NULL); // 无模板文件if ( hCOM != INV ALID_HANDLE_V ALUE) { // 成功创建SetupComm(hCOM, 1024, 1024); // 设置输入输出缓冲区大小DCB myDCB; // 声明DCB数据结构GetCommState(hCOM, &myDCB); // 获取默认DCB设置myDCB.BaudRate = CBR_19200; // 波特率为19200myDCB.fBinary = TRUE; // 二进制通信方式myDCB.fParity = TRUE; // 允许奇偶校验myDCB.ByteSize = 8; // 数据位为8myDCB.Parity = ODDPARITY; // 奇校验myDCB.StopBit = ONESTOPBIT; // 使用1位停止位SetCommState(hCOM, &myDCB);} // 设置通信参数。