当前位置:首页 > 基于单片机无线电子点菜系统硬件设计及实现
基于单片机的无线点菜系统的硬件设计及实现 第四章 硬件驱动程序和串行口调试工具
开发板通过IO口和无线数据传输模块进行数据交换的流程图为图4.2。 是 否 将数据发送到开发板 有数据发送 配置nRF2401的工作方式 开始 循环等待触发条件 DR1=1 是 否 将数据接收到开发板 图4.2开发板通过IO口和无线数据传输模块进行数据交换的流程图
4.1.2 移动端驱动程序
移动端的开发板的结构和PC机端的开发板的结构完全相同,但由于它不需要和PC机通信,只需要和无线数据传输模块进行通信。因此相对另一端的驱动简单一些。具体编程规则在上一节已经详细叙述,这里不再多说,具体的程序是PC机端程序的一部分。
4.2 串行口调试工具
串行口调试工具是用微软公司的visual c++6.0[20][21]开发的。几乎所有世界级的软件,从业界领先的Web浏览器到面向任务的企业应用,都是使用Microsoft Visual C++开发系统来开发的。要用C++来开发Windows和Web上的高性能应用程序,Visual C++是效率最高的首选工具。Visual C++ 6.0在不牺牲灵活性、性能和控制力度的同时,给C++带来了更高水平的生产效率。它具有可视化的界面,封装了大量的类,使界面制作变的很简单,使用它可以方便快捷地开发Windows环境下的应用程序。visual c++6.0专门为串行口通信提供了Mscomm[20][21]控件,使用该控件程序员不必花时间去了解比较复杂的API函数,通过简单修改控件的属性和使用控件提供的方法就可以实现对串口的配置,完成串口发送和接收数据。 4.2.1串行通信的基本原理
串行端口的本质功能是作为CPU和串行设备间的编码转换器。当数据从CPU经
28
基于单片机的无线点菜系统的硬件设计及实现 第四章 硬件驱动程序和串行口调试工具
过串行端口发送出去时,字节数据转换为串行的位。在接收数据时,串行的位被转换为字节数据。 在Windows环境下,串口是系统资源的一部分。 应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。32位下串口通信程序可以用两种方法实现:利用ActiveX控件;使用API通信函数。在本次课程设计中,所用到的是MFC的MSComm控件,下面先将这个关键的控件做一下简单的介绍。
Microsoft Communications Control(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,为应用程序提供串行通信功能,它为应用程序提供了通过串行接口收发数据的简便方法。MSComm控件在串口编程时非常方便,其实际上是调用了API函数,但我们不必再了解复杂的API函数就可控制串行通信。通信的过程,实际上是对属性的操作和对控件事件的响应。
在Windows操作系统中,串行通信采用“事件通知”方式,支持数据按块传送。进行通信时,Windows开辟一个用户定义的输入输出缓冲区,每接收一个字符就产生一个低级硬件中断,串行驱动程序立即取得控制权,并将字符放入输入数据缓冲区,然后将控制权返还正在运行的应用程序。如果输入数据缓冲区满了,驱动程序用当前定义的流控制机制通知发送方停止发送数据。发送数据也采用类似的处理方式,应用程序将需要发送的数据放入输出数据缓冲区,串口每发送一个字符就产生一个低级硬件中断。
Visual C++ 6.0通信控件Mscomm提供了功能完善的串口数据的发送和接收功能,Mscomm 控件具有两种处理方式:一是事件驱动(Event-driven)方法,一是查询法。
1)事件驱动方式。当通信事件发生时,MSCOMM控件会触发OnComm事件,调用者可以捕获该事件,通过检查其CommEvent属性便可确认发生的是哪种事件或错误,从而进行相应的处理。这种方法的优点是响应及时、可靠性高。
2)查询方式。在程序的每个关键功能之后,可以通过检查CommEvent属性的值来查询事件和错误。如果应用程序较小,这种方法可能更可取。例如,如果写一个简单的电话拨号程序,则没有必要每接收1个字符都产生事件,因为惟一等待接收的字符是调制解调器的\确定\响应。
在使用MSCOMM控件时,1个MSCOMM控件只能同时对应1个串口。如果应用程序需要访问和控件多个串口,那么必须使用多个MSCOMM控件。
在VC++中,MSCOMM控件只对应着1个C++类--CMSComm。由于MSCOMM控件本身没有提供方法,所以CMSComm类除了Create()成员函数外,其他的函数都是Get/Set函数对,用来获取或设置控件的属性。MSCOMM控件也只有1个OnComm事件,用来向调用者通知有通信事件发生。
MSCOMM控件有许多很重要的属性,限于篇幅只给出几个较为重要和常用的属性。
29
基于单片机的无线点菜系统的硬件设计及实现 第四章 硬件驱动程序和串行口调试工具
表4.3 MSCOMM控件的重要属性
属 性 CommPort Settings PortOpen Input Output InputMode
说 明 通信端口号 以字符串形式表示的波特率、奇偶校验、数据位 通信端口的状态,打开或是关闭 接收数据 发送数据 接收数据的类型:0为文本;1为二进制 表4.4 程序中用到的所有控件,以及它们的ID
控件 按钮 按钮 编辑框 编辑框 静态文本 静态文本 组框 单选按钮 单选按钮 mscomm ID ID_SEND ID_CLEAR IDC_EDIT_SEND IDC_EDIT_RCV IDC_STATIC IDC_STATIC IDC_STATIC IDC_1 IDC_2 IDC_MSCOMM 标题 发送 清空 接收缓冲区 发送缓冲区 端口选择 端口1 端口2 表4.5 用到的变量和变量的类型
Control IDS IDC_EDIT_SEND IDC_EDIT_RCV IDC_MSCOMM
Type CString CString CMSComm Messages BN_CLICKED BN_CLICKED BN_CLICKED BN_CLICKED OnComm
Member m_str_send m_str_recv m_mscomm Function OnSend OnClr On_Com1 On_Com2 OnComm Object IDS ID_SEND ID_CLEAR IDC_1 IDC_2 IDC_MSComm 4.2.2程序设计原理
第一步:初始化串行口。调用SetCommPort()函数,选择使用的端口好,然后设置波特率发送接收的处理方式,以及数据的传输方式,最后将串口打开。
30
基于单片机的无线点菜系统的硬件设计及实现 第四章 硬件驱动程序和串行口调试工具
第二步:发送数据。将要发送的字符串变成特定的类型后,调用函数SetOutput(),将数据发送到发送缓冲区
第三步:接受数据。将接收缓冲区中的数据通过GetInput()函数读出,并将它转换为Cstring类型,显示在界面上。 程序的各个主要部分和一些流程图:
(1)登陆界面后,程序首先将接收缓冲区和发送缓冲区清空
程序如下:
m_str_send=\m_str_recv=\
UpdateData(FALSE);
(2)然后进行串行口的初始化,也即是设置MSComm控件的各种属性。首先要进行端口的选择,由于所用到的计算机只有两个串行口,因此本程序只给了两个选择,具体的程序代码如下: void CMyDlg::On_Com1() {
if(m_mscomm.GetPortOpen())
m_mscomm.SetPortOpen(FALSE); m_mscomm.SetCommPort(1); m_mscomm.SetSettings(\m_mscomm.SetRThreshold(1); m_mscomm.SetSThreshold(0); m_mscomm.SetInputLen(0); m_mscomm.SetInputMode(1); m_mscomm.SetPortOpen(TRUE); }
void CMyDlg::On_Com2() {
if(m_mscomm.GetPortOpen()) m_mscomm.SetPortOpen(FALSE); m_mscomm.SetCommPort(2); m_mscomm.SetSettings(\m_mscomm.SetRThreshold(1); m_mscomm.SetSThreshold(0); m_mscomm.SetInputLen(0); m_mscomm.SetInputMode(1);
31
共分享92篇相关文档