实验四串口通讯实验Word格式文档下载.docx
- 文档编号:18766936
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:19
- 大小:3.71MB
实验四串口通讯实验Word格式文档下载.docx
《实验四串口通讯实验Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《实验四串口通讯实验Word格式文档下载.docx(19页珍藏版)》请在冰豆网上搜索。
六.实验步骤
1.设备连接
红1:
TQ6410_PDA,将DC5V电源接入蓝2(CN1)接口;
将串口线一端接入PC机,另一端接入蓝3(COM1)接口;
将mimi接口USB线一端接入PC机,另一端接入蓝4(USBOTG)接口;
长按蓝5(K1)打开电源。
注意:
每次实验准备完毕后才能打开电源,实验过程中需要拔插各种设备,也必须先关闭电源。
2.运行实验
1)打开VS2005,单击VS2005菜单栏“文件”“新建”“项目”,弹出新建项目对话框。
项目类型选择“VisualC++”“智能设备”“MFC智能设备应用程序”,项目名称命名为“SerialDemo”。
如下图所示:
2)出来应用程序向导,点击“下一步”。
3)选择SDK,选择已安装的TQ6410A_SDK。
4)应用程序类型选择为“基于对话框”的类型,“MFC的使用”选择“在静态库中使用MFC”项。
5)点击下一步,按照默认配置。
6)点击下一步,按照默认配置。
7)“生成的类”选择“CSerialDemoDlg”,点击“完成”按钮完成应用程序向导。
8)应用程序建立完成后,点击“资源视图”调出应用程序对话框,在此对话框中创建WindowsCE6.0平台的Serial应用程序。
本节将封装一个WindowsCE串口使用类CCESeries。
基于此类,可以方便的开发基于串口方面的通讯应用。
下面逐步介绍WindowsCE6.0平台的Serial应用程序的创建过程。
(1)建立新项目
如前所述,使用VS2005中“文件”“新建”“项目”“VisualC++”“智能设备”“MFC智能设备应用程序”向导创建一个基于对话框的应用程序SerialDemo,编译环境设置为TQ6410A(ARMV4I),设备选择TQ6410AARMV4IDevice,把窗口字体改成宋体小五号。
(2)新建CCESeries类,用于封装串口通讯。
CCESeries类是一个通用C++类,无基类。
其类图如图1所示。
图1串口类类图
CCESeries类将提供4个公有方法和一个回调函数接口。
这4个公有方法分别为OpenPort、ClosePort、WriteSyncPort和SetSeriesTimeouts。
其中OpenPort方法用于根据其指定的参数打开串口,并创建读线程来异步接收数据;
ClosePort方法与OpenPort方法相对应,用于关闭串口释放相关资源,同时也将关闭读线程;
SetSeriesTimeouts方法用于设置串口读写超时;
WriteSyncPort方法用于向串口写入数据;
至于回调函数m_OnseriesRead,是当读线程检测到串口有可读数据时,通过它来通知用户读取数据。
CCESeries类的使用流程如图2所示。
图2CCESeries类使用流程图
(3)建立串口参数输入对话框。
串口参数输入对话框用于在打开串口时,选择正确的串口参数,例如串口号、波特率、奇偶校验等。
串口号表示使用的是机器上哪个串口、波特率、奇偶校验等参数一般由设备厂家提供。
这些参数都是极其重要的,因此应给予足够重视。
利用MFC类向导新建CDlgParams对话框。
设计样式如图3所示。
对话框上的控件及其属性设置如表9所示。
图3“串口参数”输入对话框
表9串口参数输入框界面控件及其属性设置表
1)为CDlgParams类添加如下公有变量,用于存储设置好的串口参数。
public:
UINTm_portNo;
//串口号
UINTm_baud;
//波特率
UINTm_parity;
//奇偶校验
UINTm_databits;
//数据位
UINTm_stopbits;
//停止位
2)重载CDlgParams的OnInitDialog虚函数,用于初始化串口参数下拉框的列表值。
OnInitDialog方法的实现如程序清单10所示。
/*------------------------------程序清单10------------------------------*/
//CDlgParams消息处理程序
BOOLDlgParams:
:
OnInitDialog()
{
CDialog:
OnInitDialog();
//初始化串口参数下拉框,下拉列表
CStringstrItem=L"
"
;
CComboBox*pCmbComNo=(CComboBox*)GetDlgItem(IDC_CMB_COM_NO);
CComboBox*pCmbComBaud=(CComboBox*)GetDlgItem(IDC_CMB_COM_BAUD);
CComboBox*pCmbComParity=(CComboBox*)GetDlgItem(IDC_CMB_COM_PARITY);
CComboBox*pCmbComDatabits=(CComboBox*)GetDlgItem(IDC_CMB_COM_DATABITS);
CComboBox*pCmbComStopbits=(CComboBox*)GetDlgItem(IDC_CMB_COM_STOPBITS);
//初始化数据
pCmbComNo->
ResetContent();
for(inti=0;
i<
10;
i++)
{
strItem.Format(L"
%d"
i+1);
AddString(strItem);
}
SetCurSel(0);
//com1:
pCmbComBaud->
AddString(L"
300"
);
AddString(L"
600"
1200"
);
2400"
4800"
pCmbComBaud->
9600"
19200"
38400"
43000"
56000"
57600"
115200"
SetCurSel(11);
//115200
pCmbComParity->
None"
Odd"
Even"
//None
pCmbComDatabits->
8"
7"
6"
//8
pCmbComStopbits->
1"
1.5"
2"
//1
returnTRUE;
}
/*-----------------------------------------------------------------------*/
3)实现“确定”按钮单击事件,用于保存设置好的参数。
“确定”按钮单击事件代码如程序清单11所示。
/*------------------------------程序清单11------------------------------*/
voidDlgParams:
OnBnClickedOk()
//TODO:
在此添加控件通知处理程序代码
CStringstrTmp;
CComboBox*pCmbComStopbits=(CComboBox*)GetDlgItem(IDC_CMB_COM_STOPBITS);
GetWindowTextW(strTmp);
m_portNo=pCmbComNo->
GetCurSel()+1;
m_baud=_wtoi(strTmp);
m_parity=pCmbComParity->
GetCurSel();
GetWindowTextW(strTmp);
m_databits=_wtoi(strTmp);
m_stopbits=pCmbComStopbits->
//关闭对话框
OnOK();
4)实现“取消”按钮单击事件。
“取消”按钮单击事件代码如程序清单12所示。
/*------------------------------程序清单12------------------------------*/
OnBnClickedCancel()
OnCancel();
/*-----------------------------------------------------------------------*/
至此,串口参数输入对话框就实现完毕,下面将接着实现SerialDemo应用程序主窗口。
(4)设计SerialDemo应用程序主窗口。
1)设计主窗口样式如图4所示。
图4“SerialDemo”主窗口样式
对话框上的控件及其属性设置如表10所示。
表10SerialDemo主界面控件及其属性设置表
2)在解决方案中添加CCESeries类,然后为CSerialDemoDlg类添加m_pSerial成员变量,类型为之前创建的CCESeries类。
定义如下:
CCESeries*m_pSerial;
//串口对象指针
在SerialDemoDlg.h文件添加对CCESeries类的引用。
#include"
CESeries.h"
3)实现“打开串口”按钮事件。
用户单击“打开串口”按钮,将首先打开串口参数输入对话框,根据选择的串口参数,打开指定的串口,具体实现如程序清单13所示。
/*------------------------------程序清单13------------------------------*/
//打开串口
voidCSerialDemoDlg:
OnBnClickedBtnOpen()
//判断串口是否已经打开
if(m_pSerial!
=NULL)
m_pSerial->
ClosePort();
deletem_pSerial;
m_pSerial=NULL;
//串口参数输入对话框
CDlgParamsdlgParams;
if(dlgParams.DoModal()==IDOK)
//新建串口通讯对象
m_pSerial=newCCESeries();
m_OnSeriesRead=OnSerialRead;
if(m_pSerial->
OpenPort(this,
dlgParams.m_portNo,
dlgParams.m_baud,
dlgParams.m_parity,
dlgParams.m_databits,
dlgParams.m_stopbits))
AfxMessageBox(L"
串口打开成功"
else
串口打开失败"
备注:
由于如上代码引用了CDlgParams类,所以应该在SerialDemoDlg.cpp文件中添加对CDlgParams类定义文件的引用。
DlgParams.h"
4)实现“关闭串口”按钮事件,用于关闭指定的串口并释放相应串口对象。
具体实现如程序清单14所示。
/*------------------------------程序清单14------------------------------*/
//关闭串口
OnBnClickedBtnClose()
//关闭串口
//释放串口对象
5)实现“发送数据”按钮事件,用于将待发送的数据写入到串口中,以便传输到串口的另一端,具体实现如程序清单15所示。
/*------------------------------程序清单15------------------------------*/
//发送数据
OnBnClickedBtnSend()
char*buf=NULL;
//定义发送缓冲区
DWORDdwBufLen=0;
//定义发送缓冲区长度
CStringstrSend=L"
//得到发送输入框
CEdit*pEdtSendMsg=(CEdit*)GetDlgItem(IDC_EDT_SEND);
ASSERT(pEdtSendMsg!
=NULL);
//串口如果没有打开,直接返回
if(m_pSerial==NULL)
串口未打开"
return;
//得到待发送的字符串
pEdtSendMsg->
GetWindowTextW(strSend);
//将待发送的字符串转换成单字节,进行发送
buf=newchar[strSend.GetLength()*2+1];
ZeroMemory(buf,strSend.GetLength()*2+1);
//转换成单字节进行发送
WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,strSend.GetBuffer(strSend.GetLeng
th()),strSend.GetLength(),buf,strSend.GetLength()*2,NULL,NULL);
dwBufLen=strlen(buf)+1;
//发送字符串
WriteSyncPort((BYTE*)buf,dwBufLen);
//释放内存
delete[]buf;
buf=NULL;
6)实现CCESeries定义的接收数据回调函数,用于接收数据。
由于该回调函数是在读线程中工作的,因此这里将接收到的数据通过Windows消息转发给主窗口,由主窗口消息函数来做显示处理。
为类CSerialDemoDlg添加OnSerialRead私有方法,定义如下:
private:
//定义串口接收数据函数类型
staticvoidCALLBACKOnSerialRead(void*pOwner,BYTE*buf,DWORDbufLen);
OnSerialRead函数的实现如程序清单16所示。
/*------------------------------程序清单16------------------------------*/
unsignedcharm_uartRxLength=0;
unsignedcharm_uartRxBuffer[255];
//定义串口接收数据函数类型
voidCALLBACKCSerialDemoDlg:
OnSerialRead(void*pOwner,BYTE*buf,DWORDbufLen)
//得到父对象指针
CSerialDemoDlg*pThis=(CSerialDemoDlg*)pOwner;
CopyMemory(m_uartRxBuffer+m_uartRxLength,buf,bufLen);
m_uartRxLength+=bufLen;
//发送异步消息,表示收到串口数据,消息处理完,应释放内存
pThis->
PostMessage(WM_RECV_SERIAL_DATA,WPARAM(m_uartRxBuffer),m_uartRxLength);
/*-----------------------------------------------------------------------*/
7)实现WM_RECV_SERIAL_DATA消息处理函数。
OnSerialRead回调函数中将接收到的数据,通过WINDOWS消息异步发送出去。
这样就需要在CSerialDemoDlg对话框中实现此消息处理,将接收到的数据显示到主窗口的接收框中,具体实现如下:
首先在SerialDemoDlg.h文件中添加WM_RECV_SERIAL_DATA消息常量定义。
//定义串口数据接收消息常量
#defineWM_RECV_SERIAL_DATAWM_USER+101
然后,为CSerialDemoDlg类添加如下自定义消息处理函数定义:
//串口接收数据处理函数
afx_msgLONGOnRecvSerialData(WPARAMwParam,LPARAMlParam);
备注:
该定义可添加在DECLARE_M
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 串口 通讯
![提示](https://static.bdocx.com/images/bang_tan.gif)