《2022年并口控制与类的使用 .pdf》由会员分享,可在线阅读,更多相关《2022年并口控制与类的使用 .pdf(15页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、从零开始学 VC系列教程之四. 并口控制与类的使用课程之前 : 这一章让大家等很久了 , 一直在考虑并口操作应该怎么写. 其实这是一个很简单的课题 , 因为是基于成熟操作类的基础上的, 我们主要是学习如果使用网上查到的资料 , 这一点很关键 , 只有学会了利用各种资源 , 才能自主学习取得进步, 同时, 也可以有效的提高开发效率. 学习目标 : 掌握 VC下并口程序的方法及类的使用. 课程详解 : 参照第一章新建一个基于对话框的Vc 工程, 名称定义为 Eg04. 图 01 ( 原文件名 :01.JPG)类型选基于对话框 . 在本例中 , 我们要用到一些资源 , 现列出如下WinIo.sys
2、WinIo.dll 这是一个动态库 , 与 WinIo.sys完成同并口的连接 . WinIo.lib 这是为静态调用提供的引入库文件. 虽然引入库文件和静态库文件都是以 Lib 为扩展名的 , 但实际上有本质的区别 . WinIo.h 这是 IO 操作的头文件 . ParallelPort.cpp 这是一个并口操作类 , 用于同 WinIo 接口, 并定义了相关的操作函数 . 虽然这个类用于同WinIo 的操作接口 , 但这个类并不是从 WinIO 派生的 ,名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - -
3、 - - - - - 第 1 页,共 15 页 - - - - - - - - - 只是一个独立的自定义类. 至于类的自定义 , 以前我们也提到过 . ParallelPort.h 这是并口类的头文件 . 这几个文件是可以从网上下载到的, 并不是我做的 , 所以这个动态库大家就不用问我要源码了 , 因为我也没有 . 首先, 把 WinIo.lib WinIo.h ParallelPort.cpp ParallelPort.h拷贝到工程目录中, 后面马上就要用到 . 再把 WinIo.Dll WinIo.sys拷贝到工程目录的Debug目录中 , 以后工程发布后 , 这两个文件要跟随工程一起.
4、下面添加引入库到系统中, 点击 工程- 设置 在弹出的对话框中选择 连接 标签, 然后在 对象/ 库模块 中加入 WinIo.lib完成后如下图 . 图 02 ( 原文件名 :02.JPG)然后加入并口操作类的头文件. 一般来说 , 网上可以下载到的源码都是以类的形式给出的 ,VC 的好处也在于可以把一个操作封装成类, 以便在不同的工程中调用.如图, 双击类管理器中的 Ceg04Dlg在弹出的文件中加入 #include ParallelPort.h /添加并口类头文件名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理
5、 - - - - - - - 第 2 页,共 15 页 - - - - - - - - - 图 03 ( 原文件名 :03.JPG)同时, 还要定义一个类变量 , 用于并口类的操作 . 在刚打开的类定义文件中找到CEg04Dlg类, 并加入一个类变量m_Port, 完成后如下图所示名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 15 页 - - - - - - - - - 图 04 ( 原文件名 :04.JPG)为了操行方便 , 把并口操作类也加入到工程中, 点击File
6、View标签, 标签位置在类管理类下面 , 见上图中的 FileVi 然后在 Source Files中加入 ParallelPort.cpp在Header Files中加入 ParallelPort.h这样, 就可以在类管理中看到我们所用到的并口操作类了, 同时也可以方便的查阅类函及成员变量. 下面在界面中加入六个按钮和两个文本编辑框, 方法前面已经介绍多次 . 完成后如下图名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 15 页 - - - - - - - - - 图
7、 05 ( 原文件名 :05.JPG)其中, 各控件 ID 如下上面的编辑框 IDC_EDIT_READ 用于显示收到的数据下面的编辑框 IDC_EDIT_WRITE 用于填写要发送的数据读数据口 IDC_BTN_DREAD 用于读取并口数据总线写数据口 IDC_BTN_DWRITE 用于写并口数据口数据读控制口 IDC_BTN_CREAD 用于读取并口控制总线写控制口 IDC_BTN_CWRITE 用于写并口控制口数据读状态口 IDC_BTN_SREAD 用于读并口状态总线并口流水灯 IDC_BTN_LED 用于在数据线上输出流水灯效果先要介绍一下并口 , 以便理解接下来的操作是什么意思.
8、以下一些关于并口的介绍, 摘自互联网 . 并口 SPP模式寄存器定义数据寄存器(基地址)位引脚:D-sub 信号名信号源是否在连接器处倒相引脚: Centronics 0 2 数据位 0 PC 否 2 1 3 数据位 1 PC 否 3 2 4 数据位 2 PC 否 4 3 5 数据位 3 PC 否 5 4 6 数据位 4 PC 否 6 5 7 数据位 5 PC 否 7 6 8 数据位 6 PC 否 8 7 9 数据位 7 PC 否 9 注:控制寄存器的第5 位控制数据位是否能够输出。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - -
9、 名师精心整理 - - - - - - - 第 5 页,共 15 页 - - - - - - - - - 状态寄存器(基地址 +1)位引脚:D-sub 信号名信号源是否在连接器处倒相引脚: Centronics 3 15 nError 外设否 32 4 13 Select 外设否 13 5 12 Paper Out 外设否 12 6 10 nAck 外设否 10 7 11 Busy 外设是 11 注:1,2 位未定义。控制寄存器(基地址 +2)位引脚:D-sub 信号名信号源是否在连接器处倒相引脚: Centronics 0 1 nStrobe PC 是 1 1 14 nAutoLF PC 是
10、 14 2 16 nInit PC 否 31 3 17 nSelectIn PC 是 36 注: 连接器中没有提供的附加位:4:4:中断启用,此位为1 时,IRQ从 nAck送往系统的中断控制器;为0 时,IRQ不送往中断控制器。5:5:双向控制端口的方向控制位, 此位为 0 时,输出启动; 为 1 时,不能输出;控制端口可以读取外部逻辑电平。6、7:未定义。学过单片机或相关知识的应该可以看懂表格中的意思了, 上面罗列的是除去电源及地线后可用到的 IO口, 数据口 8位, 由状态寄存器第五位决定能否输出, 状态口共 5位, 控制口共 4位. 一般我们只用到数据口来传输数据. 一般来说 , 并口
11、基地址是 0 x378, 也就是数据寄存器的地址 , 在并口类中默认 . 明白了这些以后 , 就可以对并口进行相应的操作了. 接下来要在程序初始化时初始化并口, 在前面的操作中 , 定义了一个类变量m_Port, 这个类变量在后面我们将多次用到. 首先展开类管理器中的CEg04Dlg双击 OnInitDialog()在窗口初始化中加入以下代码. /在这里初始化并口 if(m_Port.InitPort()=TRUE) SetDlgItemText(IDC_EDIT_READ,并口初始化成功 , 并口地址 :0 x378); else SetDlgItemText(IDC_EDIT_READ,并
12、口初始化失败 !); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 15 页 - - - - - - - - - 完成后如下图所示图 06 ( 原文件名 :06.JPG)m_Port.InitPort()是并口操作类中的并口初始化函数, 传入参数是并口地址 , 由于类定义时默认了0 x378 为并口地址 , 这里可以不用传参数了 . 如果初始化成功 ,传回布尔变量 TRUE, 运行一下 , 应该可以看到并口初始化成功的信息. 接下来为读数据口添加代码. 双击 读数据口
13、按钮, 在弹出的代码中加入程序如下void CEg04Dlg:OnBtnDread() / TODO: Add your control notification handler code here BYTE nPortData=m_Port.ReadData(); /从并口读到数据 CString a,b; GetDlgItemText(IDC_EDIT_READ,b); /获取编辑框中原有的文本 a.Format(rn读到数据口数据 :%2.2X,nPortData); b+=a; SetDlgItemText(IDC_EDIT_READ,b); /写入文本到编辑框名师资料总结 - - -
14、精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 15 页 - - - - - - - - - /以下用于将滑块自动移到最后一行 unsigned char nLine=(CEdit*)GetDlgItem(IDC_EDIT_READ)-GetLineCount(); (CEdit*)GetDlgItem(IDC_EDIT_READ)-GetLineCount(); (CEdit*)GetDlgItem(IDC_EDIT_READ)-LineScroll(nLine); 完成后如图所示 (图 8)
15、 图 08 ( 原文件名 :08.JPG)这样就可以从并口读到数据了. 同样的 , 可以添加控制口 , 状态口的按钮响应代码 ,用于读到控制口及状态口, 方法相同 , 这里就不再详叙了 . 不同的是读控制口时 ,用到的函数是 m_Port.ReadCtrl();读状态口用到的函数是m_Port.ReadState();再有一个问题要说一下 , 编辑框默认状态下是单行的, 也就是说 , 我们的换行操作是没有用的 . 可以鼠标右击编辑框 , 在弹出的菜单中选 属性, 并修改其属性如下图所示 ( 图 7) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - -
16、- - - - - 名师精心整理 - - - - - - - 第 8 页,共 15 页 - - - - - - - - - 图 07 ( 原文件名 :07.JPG)下面来添加写数据操作 . 在写数据操作中 , 我们要换一种方法来读写文本编辑框了. 首先鼠标右击下面的写操作编辑框, 在弹出的菜单中选择 建立类向导 , 英文版的 VC请根据翻译 . 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 15 页 - - - - - - - - - 图 09 ( 原文件名 :09.J
17、PG)然后会弹出一个类向导对话框, 选择MemberVariables 标签卡后显示如下 . 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 15 页 - - - - - - - - - 图 10 ( 原文件名 :10.JPG) , 在ID 列表中 , 我们可以看到窗口中为控件添加的ID 号, 双击IDC_EDIT_WRITE会弹出另一个对话框 , 将各框中的内容修改如下图名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - -
18、- - - - 名师精心整理 - - - - - - - 第 11 页,共 15 页 - - - - - - - - - 图 11 ( 原文件名 :11.JPG)第一个框中的 m_WriteEdit 是我们为 IDC_EDIT_WRITE 这个编辑器定义的一个类变量名 , 这个类变量会自动与编辑框IDC_EDIT_WRITE 关联, 在以后的操作中用到 . 确定后双击 写数据口 按钮, 为写数据口按钮添加代码 , 完成后如下void CEg04Dlg:OnBtnDwrite() / TODO: Add your control notification handler code here CS
19、tring a; unsigned char b=0; m_WriteEdit.GetWindowText(a); /获取编辑框中文本 a.MakeUpper();/全部转换为大写 if(a=) MessageBox(发送内容不能为空 !); return; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 15 页 - - - - - - - - - for(unsigned char i=0;ia.GetLength() MessageBox(数据格式填写不正确 !)
20、; return; if(a.GetAt(i)=A & a.GetAt(i)=0 & a.GetAt(i)=A & a.GetAt(i+1)=0 & a.GetAt(i+1)=9) b+=(a.GetAt(i+1)-0 x30); else MessageBox(数据格式填写不正确 !); return; m_Port.WriteData(b); 这里可能有点长 , 其实与第三章的发送是一样的, 增加了一点容错处理而已 . 在这里 ,我 们 用m_WriteEdit.GetWindowText(a);来 获 取 编 辑 框 中 文本, m_WriteEdit是开始时候在类向导中定义的变量,Ge
21、tWindowText 是一个窗口函数 , 因为文本编辑框也认为是窗口, 所以窗口操作函数是通用的, 由于m_WriteEdit 与文本框 IDC_EDIT_WRITE 关联, 获取的是文本框中的内容 . 同样, 由于 m_WriteEdit 是 CEdit 变量, 于是就可以有所有 CEdit 的所有属性 , 这与结构变量有点相似 , 大家可以慢慢体会 . 其余口的操作类似 , 不再重复说了 . 这个并口类还有很多功能函数, 这里也清一下 . #define PIN_STROBE 1 #define PIN_AUTO 14 #define PIN_D0 2 #define PIN_D1 3
22、名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 15 页 - - - - - - - - - #define PIN_D2 4 #define PIN_D3 5 #define PIN_D4 6 #define PIN_D5 7 #define PIN_D6 8 #define PIN_D7 9 #define PIN_ERROR 15 #define PIN_INIT 16 #define PIN_SELIN 17 #define PIN_ACK 10 #define
23、 PIN_BUSY 11 #define PIN_PE 12 #define PIN_SLCT 13 这些是对 IO 口的定义 , 用于单个 IO 口的操作 , 操作函数有以下几个 BOOL SetPinLogic(int nPin,BOOL bLogic); /设置指定引脚 ,bLogic=1 高电平 ,bLogic=0 低电平 BOOL GetPinLogic(int nPin);/得到指定引脚的电平 BOOL SetPinL(int nPin);/设置指定引脚为低电平 BOOL SetPinH(int nPin);/设置指定引脚为高电平以上些都是这个并口类的函数了, 有了这些 , 我想大
24、家也就可以随便做点东西了,记得曾有过用并口直接驱动LCD的例子 , 建议也试一下 . 最后一个按钮是流水灯 , 其实这个对于大家来说并不难, 我们也提供一个例子 . 双击 并口流水灯 添加流水灯代码 .IO 口低电平有效 . void CEg04Dlg:OnBtnLed() / TODO: Add your control notification handler code here unsigned char nDataIO=0 x01; CString a,b; unsigned char nCData=m_Port.ReadCtrl(); /读控制寄存器数据 nCData&=0 xDF;
25、 /保证第五位为低 , 使能 IO 输出 m_Port.WriteCtrl(nCData); /写控制口数据 for(char i=0;iGetLineCount(); (CEdit*)GetDlgItem(IDC_EDIT_READ)-GetLineCount(); (CEdit*)GetDlgItem(IDC_EDIT_READ)-LineScroll(nLine); nDataIO=1; Sleep(200); /延时 200ms 接上硬件可以看到 , 按一下出现一次流水灯效果, 由于不方便按硬件 , 就没有试过了. 这一章就先到这里了. 建议大家自己想个作品来试一下, 同时也希望大家分享一下自己的学习及实验感想, 把作品也发上来庆祝一下. 以下是整个工程及教程内容的下载ourdev_500674.rar(文件大小 :1.07M)(名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 15 页 - - - - - - - - -