📄 chap12_4.htm
字号:
<html>
<head>
<title>12.4 一个通信演示程序</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
</head>
<body link="#3973DE" alink="#3973DE">
<font SIZE="5"><b><div align="center"><center>
<table border="0" width="615" cellspacing="0" cellpadding="0">
<tr>
</b><td><div align="center"><center><table border="0" width="615" cellpadding="0" cellspacing="0" height="20">
<tr>
<td width="377" bgcolor="#15397D" height="20"></td>
<td width="238" bgcolor="#000000" height="20"><p align="right"></font><span style="text-decoration: none"><a href="../../index.htm"><font color="#FFFFFF">电脑报Visual
C++网络教程</font></a></span></td>
</tr>
</table>
</center></div><font FACE="Times New Roman" SIZE="3"><b><p ALIGN="CENTER"></b></font><font color="#3973DE" FACE="Times New Roman" SIZE="3">12. 4 </font><font SIZE="3" color="#3973DE">一个通信演示程序</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">为了使读者更好地掌握本章的概念,这里举一个具体实例来说明问题。如图</font><font FACE="Times New Roman" SIZE="3">12.1</font><font SIZE="3">所示,例子程序名为</font><font FACE="Times New Roman" SIZE="3">Terminal</font><font SIZE="3">,是一个简单的</font><font FACE="Times New Roman" SIZE="3">TTY</font><font SIZE="3">终端仿真程序。读者可以用该程序打开一个串行口,该程序会把用户的键盘输入发送给串行口,并把从串口接收到的字符显示在视图中。用户通过选择</font><font FACE="Times New Roman" SIZE="3">File->Connect</font><font SIZE="3">命令来打开串行口,选择</font><font FACE="Times New Roman" SIZE="3">File->Disconnect</font><font SIZE="3">命令则关闭串行口。</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="center"></font><font SIZE="3"><img src="T12_1.gif" alt="T12_1.tif (174388 bytes)" WIDTH="452" HEIGHT="322"></font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="center"></font><font SIZE="3">图</font><font FACE="Times New Roman" SIZE="3">12.1
Terminal</font><font SIZE="3">终端仿真程序</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">当用户选择</font><font FACE="Times New Roman" SIZE="3">File->Settings...</font><font SIZE="3">命令时,会弹出一个</font><font FACE="Times New Roman" SIZE="3">Communication settings</font><font SIZE="3">对话框,如图</font><font FACE="Times New Roman" SIZE="3">12.2</font><font SIZE="3">所示。该对话框主要用来设置串行口,包括端口、波特率、每字节位数、校验、停止位数和流控制。</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="center"></font><font SIZE="3"><img src="T12_2.gif" alt="T12_2.tif (92960 bytes)" WIDTH="339" HEIGHT="244"></font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="center"></font><font SIZE="3">图</font><font FACE="Times New Roman" SIZE="3">12.2
Communication settings</font><font SIZE="3">对话框</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">通过该对话框也可以设置</font><font FACE="Times New Roman" SIZE="3">TTY</font><font SIZE="3">终端仿真的属性,如果选择</font><font FACE="Times New Roman" SIZE="3">New Line</font><font SIZE="3">(自动换行),那么每当从串口读到回车符</font><font FACE="Times New Roman" SIZE="3">(</font><font SIZE="3">‘</font><font FACE="Times New Roman" SIZE="3">\r</font><font SIZE="3">’</font><font FACE="Times New Roman" SIZE="3">)</font><font SIZE="3">时,视图中的正文就会换行,否则,只有在读到换行符</font><font FACE="Times New Roman" SIZE="3">(</font><font SIZE="3">‘</font><font FACE="Times New Roman" SIZE="3">\n</font><font SIZE="3">’</font><font FACE="Times New Roman" SIZE="3">)</font><font SIZE="3">时才会换行。如果选择</font><font FACE="Times New Roman" SIZE="3">Local echo</font><font SIZE="3">(本地回显),那么发送的字符会在视图中显示出来。</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">终端仿真程序的特点是数据的传输没有规律。因为键盘输入速度有限,所以发送的数据量较小,但接收的数据源是不确定的,所以有可能会有大量数据高速涌入的情况发生。根据</font><font FACE="Times New Roman" SIZE="3">Terminal</font><font SIZE="3">的这些特性,我们在程序中创建了一个辅助工作者线程专门来监视串行口的输入。由于写入串行口的数据量不大,不会太费时,所以在主线程中完成写端口的任务是可以的,不必另外创建线程。</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">现在就让我们开始工作。请读者按下面几步进行:</p>
<blockquote>
<blockquote>
<p ALIGN="JUSTIFY">用</font><font FACE="Times New Roman" SIZE="3">AppWizard</font><font SIZE="3">建立一个名为</font><font FACE="Times New Roman" SIZE="3">Terminal</font><font SIZE="3">的</font><font FACE="Times New Roman" SIZE="3">MFC</font><font SIZE="3">应用程序。在</font><font FACE="Times New Roman" SIZE="3">MFC AppWizard</font><font SIZE="3">对话框的第</font><font FACE="Times New Roman" SIZE="3">1</font><font SIZE="3">步选择</font><font FACE="Times New Roman" SIZE="3">Single document</font><font SIZE="3">,在第</font><font FACE="Times New Roman" SIZE="3">4</font><font SIZE="3">步去掉</font><font FACE="Times New Roman" SIZE="3">Docking toolbar</font><font SIZE="3">的选择,在第</font><font FACE="Times New Roman" SIZE="3">6</font><font SIZE="3">步把</font><font FACE="Times New Roman" SIZE="3">CTerminalView</font><font SIZE="3">的基类改为</font><font FACE="Times New Roman" SIZE="3">CEditView</font><font SIZE="3">。</p>
<p ALIGN="JUSTIFY">在</font><font FACE="Times New Roman" SIZE="3">Terminal</font><font SIZE="3">工程的资源视图中打开</font><font FACE="Times New Roman" SIZE="3">IDR_MAINFRAME</font><font SIZE="3">菜单资源。去掉</font><font FACE="Times New Roman" SIZE="3">Edit</font><font SIZE="3">菜单和</font><font FACE="Times New Roman" SIZE="3">View</font><font SIZE="3">菜单,并去掉</font><font FACE="Times New Roman" SIZE="3">File</font><font SIZE="3">菜单中除</font><font FACE="Times New Roman" SIZE="3">Exit</font><font SIZE="3">以外的所有菜单项。然后在</font><font FACE="Times New Roman" SIZE="3">File</font><font SIZE="3">菜单中加入三个菜单项,如表</font><font FACE="Times New Roman" SIZE="3">12.5</font><font SIZE="3">所示。</p>
</font>
</blockquote>
</blockquote>
<p><b><font SIZE="3"> </p>
<p ALIGN="CENTER">表</font><font FACE="Times New Roman" SIZE="3">12.5 </font><font SIZE="3">新菜单项</font></b></p>
<table BORDER="1" CELLSPACING="1" CELLPADDING="1" WIDTH="579">
<tr>
<td WIDTH="50%"><font SIZE="3"><b><p ALIGN="JUSTIFY">标题</b></font></td>
<td WIDTH="50%"><font FACE="Times New Roman" SIZE="3"><b><p ALIGN="JUSTIFY">ID</b></font></td>
</tr>
<tr>
<td WIDTH="50%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">Settings...</font></td>
<td WIDTH="50%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">ID_FILE_SETTINGS</font></td>
</tr>
<tr>
<td WIDTH="50%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">Connect</font></td>
<td WIDTH="50%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">ID_FILE_CONNECT</font></td>
</tr>
<tr>
<td WIDTH="50%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">Disconnect</font></td>
<td WIDTH="50%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">ID_FILE_DISCONNECT</font></td>
</tr>
</table>
<p><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<blockquote>
<blockquote>
</font><font SIZE="3"><p ALIGN="JUSTIFY">用</font><font FACE="Times New Roman" SIZE="3">ClassWizard</font><font SIZE="3">为</font><font FACE="Times New Roman" SIZE="3">CTerminalDoc</font><font SIZE="3">类创建三个与上表菜单消息对应的命令处理函数,使用缺省的函数名。为</font><font FACE="Times New Roman" SIZE="3">ID_FILE_CONNECT</font><font SIZE="3">和</font><font FACE="Times New Roman" SIZE="3">ID_FILE_DISCONNECT</font><font SIZE="3">命令创建命令更新处理函数。另外,用</font><font FACE="Times New Roman" SIZE="3">ClassWizard</font><font SIZE="3">为该类加入</font><font FACE="Times New Roman" SIZE="3">CanCloseFrame</font><font SIZE="3">成员函数。</p>
<p ALIGN="JUSTIFY">用</font><font FACE="Times New Roman" SIZE="3">ClassWizard</font><font SIZE="3">为</font><font FACE="Times New Roman" SIZE="3">CTerminalView</font><font SIZE="3">类创建</font><font FACE="Times New Roman" SIZE="3">OnChar</font><font SIZE="3">函数,该函数用来把用户键入的字符向串行口输出。</p>
<p ALIGN="JUSTIFY">新建一个对话框模板资源,令其</font><font FACE="Times New Roman" SIZE="3">ID</font><font SIZE="3">为</font><font FACE="Times New Roman" SIZE="3">IDD_COMSETTINGS</font><font SIZE="3">。请按图</font><font FACE="Times New Roman" SIZE="3">12.2</font><font SIZE="3">和表</font><font FACE="Times New Roman" SIZE="3">12.6</font><font SIZE="3">设计对话框模板。</p>
</font>
</blockquote>
</blockquote>
<p><b><font SIZE="3"> </p>
<p ALIGN="CENTER">表</font><font FACE="Times New Roman" SIZE="3">12.6 </font><font SIZE="3">通信设置对话框中的主要控件</font></b></p>
<table BORDER="1" CELLSPACING="1" CELLPADDING="1" WIDTH="526">
<tr>
<td WIDTH="29%"><font SIZE="3"><b><p ALIGN="JUSTIFY">控件</b></font></td>
<td WIDTH="26%"><font FACE="Times New Roman" SIZE="3"><b><p ALIGN="JUSTIFY">ID</b></font></td>
<td WIDTH="44%"><font SIZE="3"><b><p ALIGN="JUSTIFY">属性设置</b></font></td>
</tr>
<tr>
<td WIDTH="29%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">Base options</font><font SIZE="3">组框</font></td>
<td WIDTH="26%"><font SIZE="3"><p ALIGN="JUSTIFY">缺省</font></td>
<td WIDTH="44%"><font SIZE="3"><p ALIGN="JUSTIFY">标题为</font><font FACE="Times New Roman" SIZE="3">Base options</font></td>
</tr>
<tr>
<td WIDTH="29%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">Port</font><font SIZE="3">组合框</font></td>
<td WIDTH="26%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">IDC_PORT</font></td>
<td WIDTH="44%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">Drop List</font><font SIZE="3">,不选</font><font FACE="Times New Roman" SIZE="3">Sort</font><font SIZE="3">,初始列表为</font><font FACE="Times New Roman" SIZE="3">COM1</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">COM2</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">COM3</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">COM4</font></td>
</tr>
<tr>
<td WIDTH="29%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">Baud rate</font><font SIZE="3">组合框</font></td>
<td WIDTH="26%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">IDC_BAUD</font></td>
<td WIDTH="44%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">Drop List</font><font SIZE="3">,不选</font><font FACE="Times New Roman" SIZE="3">Sort</font><font SIZE="3">,初始列表为</font><font FACE="Times New Roman" SIZE="3">300</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">600</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">1200</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">2400</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">9600</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">14400</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">19200</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">38400</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">57600</font></td>
</tr>
<tr>
<td WIDTH="29%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">Data bits</font><font SIZE="3">组合框</font></td>
<td WIDTH="26%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">IDC_DATABITS</font></td>
<td WIDTH="44%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">Drop List</font><font SIZE="3">,不选</font><font FACE="Times New Roman" SIZE="3">Sort</font><font SIZE="3">,初列表为</font><font FACE="Times New Roman" SIZE="3">5</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">6</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">7</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">8</font></td>
</tr>
<tr>
<td WIDTH="29%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">Parity</font><font SIZE="3">组合框</font></td>
<td WIDTH="26%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">IDC_PARITY</font></td>
<td WIDTH="44%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">Drop List</font><font SIZE="3">,不选</font><font FACE="Times New Roman" SIZE="3">Sort</font><font SIZE="3">,初列表为</font><font FACE="Times New Roman" SIZE="3">None</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">Even</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">Odd</font></td>
</tr>
<tr>
<td WIDTH="29%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">Stop bits</font><font SIZE="3">组合框</font></td>
<td WIDTH="26%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">IDC_STOPBITS</font></td>
<td WIDTH="44%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">Drop List</font><font SIZE="3">,不选</font><font FACE="Times New Roman" SIZE="3">Sort</font><font SIZE="3">,初列表为</font><font FACE="Times New Roman" SIZE="3">1</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">1.5</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">2</font></td>
</tr>
<tr>
<td WIDTH="29%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">Flow control</font><font SIZE="3">组框</font></td>
<td WIDTH="26%"><font SIZE="3"><p ALIGN="JUSTIFY">缺省</font></td>
<td WIDTH="44%"><font SIZE="3"><p ALIGN="JUSTIFY">标题为</font><font FACE="Times New Roman" SIZE="3">Flow control</font></td>
</tr>
<tr>
<td WIDTH="29%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">None</font><font SIZE="3">单选按钮</font></td>
<td WIDTH="26%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">IDC_FLOWCTRL</font></td>
<td WIDTH="44%"><font SIZE="3"><p ALIGN="JUSTIFY">标题为</font><font FACE="Times New Roman" SIZE="3">None</font><font SIZE="3">,选择</font><font FACE="Times New Roman" SIZE="3">Group</font><font SIZE="3">属性</font></td>
</tr>
<tr>
<td WIDTH="29%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">RTS/CTS</font><font SIZE="3">单选按钮</font></td>
<td WIDTH="26%"><font SIZE="3"><p ALIGN="JUSTIFY">缺省</font></td>
<td WIDTH="44%"><font SIZE="3"><p ALIGN="JUSTIFY">标题为</font><font FACE="Times New Roman" SIZE="3">RTS/CTS</font></td>
</tr>
<tr>
<td WIDTH="29%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">XON/XOFF</font><font SIZE="3">单选按钮</font></td>
<td WIDTH="26%"><font SIZE="3"><p ALIGN="JUSTIFY">缺省</font></td>
<td WIDTH="44%"><font SIZE="3"><p ALIGN="JUSTIFY">标题为</font><font FACE="Times New Roman" SIZE="3">XON/XOFF</font></td>
</tr>
<tr>
<td WIDTH="29%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY">TTY options</font><font SIZE="3">组框</font></td>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -