微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于单片机的无线电子点菜系统硬件方案设计

基于单片机的无线电子点菜系统硬件方案设计

时间:09-14 来源:互联网 点击:

IDS Messages Function
ID_SEND BN_CLICKED OnSend
ID_CLEAR BN_CLICKED OnClr
IDC_1 BN_CLICKED On_Com1
IDC_2 BN_CLICKED On_Com2
IDC_MSComm OnComm OnComm

4.2.2程序设计原理
第一步:初始化串行口。调用SetCommPort()函数,选择使用的端口好,然后设置波特率发送接收的处理方式,以及数据的传输方式,最后将串口打开。
第二步:发送数据。将要发送的字符串变成特定的类型后,调用函数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(”9600,n,8,1″);
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(”9600,n,8,1″);
m_mscomm.SetRThreshold(1);
m_mscomm.SetSThreshold(0);
m_mscomm.SetInputLen(0);
m_mscomm.SetInputMode(1);
m_mscomm.SetPortOpen(TRUE);
}
1)CommPort:分别选1和2。
2) Setting设置或返回串行端口的波特率:9600、无奇偶校验位、数据位数为8、1位停止位。
3) InBufferSize:设置接收缓冲区为1024字节。
4) RThreshold:设置当接收缓冲区内字节个数为1时,触发MSCOMM的OnComm事件,然后由计算机将接收缓冲的数据读出,并将接收缓冲区清空。
5) InputLen:值为0,设置INPUT读取整个缓冲区的内容。
6) OutBufferSize:设置发送缓冲区为512字节。
(3)发送数据的源程序代码
void CMyDlg::OnSend()
{
if(!m_mscomm.GetPortOpen())
m_mscomm.SetPortOpen(TRUE);
UpdateData(TRUE);
m_mscomm.SetOutput(COleVariant(m_str_send)); //发送数据
}
将文本框内的字符串送到变量m_str_send中,然后将字符转化为ColeVariant类型的数据,再通过SetOutput函数将数据发送到发送缓冲区中。
(4)接收数据的源程序代码
void CMyDlg::OnComm()
{
VARIANT variant_tmp;
COleSafeArray safearray_tmp;
LONG len,i;
BYTE buf[2048];
CString str_tmp;
if(m_mscomm.GetCommEvent()==2)
{
variant_tmp=m_mscomm.GetInput();
safearray_tmp=variant_tmp;
len=safearray_tmp.GetOneDimSize();
for(i=0;ilen;i++)
safearray_tmp.GetElement(i,buf+i);
for(i=0;ilen;i++)
{
BYTE ch=*(char*)(buf+i);
str_tmp.Format(”%c”,ch);
m_str_recv+=str_tmp;
}
}
UpdateData(FALSE);
}
当m_mscomm.GetCommEvent()==2时候,数据到来,触发OnComm事件,调用该函数。首先通过m_mscomm.GetInput()将接收缓冲区内的数据读到变量variant_tmp中,再将variant_tmp赋予safearray_tmp来实现数据类型转化为ColeSafeArray。通过safearray_tmp.GetOneDimSize()求出接收到的字符的总长度,再将每个ColeSafeArray变量转化为Byte类型的变量,最后转化为字符类型,并将它显示在文本框内。
void CMyDlg::OnComm() 的流程图:

图4.3 void CMyDlg::OnComm() 的流程图

(5)清空功能函数源代码
void CMyDlg::OnClr()
{
m_str_send=” “;
m_str_recv=” “;
UpdateData(FALSE);
}
总的程序流程图如图4.4所示
图4.5是PC机通过端口1向单片机发送数据时候的图型界面。进入界面后,首先要进行根据连接的串行口选择要初始化的端口,然后使用键盘在发送缓冲区内输入一系列的字符。等单片机开发板上电后,单击发送按键将数据发送出去。
图4.6是PC机通过串口接收单片机发送过来的数据时候的图形界面。在缓冲区接收的数据为二进制形式,程序内已经将这些二进制转化为字符串在界面上显示。
图4.7是串行口调试工具初始运行时候的图形界面。
事件驱动方式时,由计算机直接管理,字节之间不可控,而且单片机串行口和PC机串行口速率差别较大,接收程序一定要精心合理的设计,才能使传输稳定可靠,否则很容易出现意想不到的问题。在调试过程中,如果不小心将串行口调试工具的波特率和开发板串行口的波特率设置为不同,就会出现错误。程序中已经将串行口的波特率设置为9600bps,这样可以避免错误。
图4.5通过端口1进行发送时候的图型界面

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top