实验四串口通讯实验.docx

上传人:b****5 文档编号:5779881 上传时间:2023-01-01 格式:DOCX 页数:19 大小:3.71MB
下载 相关 举报
实验四串口通讯实验.docx_第1页
第1页 / 共19页
实验四串口通讯实验.docx_第2页
第2页 / 共19页
实验四串口通讯实验.docx_第3页
第3页 / 共19页
实验四串口通讯实验.docx_第4页
第4页 / 共19页
实验四串口通讯实验.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

实验四串口通讯实验.docx

《实验四串口通讯实验.docx》由会员分享,可在线阅读,更多相关《实验四串口通讯实验.docx(19页珍藏版)》请在冰豆网上搜索。

实验四串口通讯实验.docx

实验四串口通讯实验

实验四基于WinCE的Serial应用开发

一.课时安排:

4学时

二.实验目的

通过此次实验掌握基于串口编程的VS2005环境之下的WindowsCE6.0平台的Serial应用程序的开发,实现TQ6410PDA开发套件和串口设备的通讯。

三.实验设备

(1)硬件:

TQ6410PDA开发套件一套

PC机一台

(2)软件

VisualStudio2005

PlatformBuilderforWindowsCE6.0

ActiveSync同步工具

TQ6410A_SDK

四.实验内容

五.实验原理

串口是计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,因此应用非常广泛。

例如在工业自动化中,很多智能采集设备都是采用串口方式和PC机进行通讯。

在WindowsCE嵌入式系统中,串口依然是和外部设备进行通讯的重要方式,例如GPS设备。

目前很多PDA都集成了蓝牙通讯功能,可以通过设置蓝牙通讯方式为串口方式,来和另外一端蓝牙设备进行通讯。

作为一名WindowsCE程序编写人员,掌握串口编程知识,将会为日后工作提供极大的便利。

“串行通信”是指外设和计算机间使用两根数据信号线(另外需要地线,可能还需要控制线),数据在一根数据信号线上一位一位地进行传输,每一位数据都占据一个固定的时间长度。

这种通信方式使用的数据线较少,在远距离通信中可以节约通信成本,而且其传输速度也不比并行传输的速度慢。

相反的,“并行通信”是指一条信息的各位数据被同时传送。

并行通讯的特点是:

各数据位同时传送、传送速度快、效率高,但由于有多少数据位就需多少根数据线,因此传送成本较高,比较适用于近距离(相距数米)的通讯。

目前较为常用的串口有9针串口(DB9)和25针串口(DB25),当通信距离较近时(<12m),可以使用电缆线直接连接标准RS232端口(RS422和RS485较远),若通信距离较远,则需附加调制解调器(Modem)。

六.实验步骤

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);

pCmbComNo->AddString(strItem);

}

pCmbComNo->SetCurSel(0);//com1:

//波特率

pCmbComBaud->ResetContent();

pCmbComBaud->AddString(L"300");

pCmbComBaud->AddString(L"600");

pCmbComBaud->AddString(L"1200");

pCmbComBaud->AddString(L"2400");

pCmbComBaud->AddString(L"4800");

pCmbComBaud->AddString(L"9600");

pCmbComBaud->AddString(L"19200");

pCmbComBaud->AddString(L"38400");

pCmbComBaud->AddString(L"43000");

pCmbComBaud->AddString(L"56000");

pCmbComBaud->AddString(L"57600");

pCmbComBaud->AddString(L"115200");

pCmbComBaud->SetCurSel(11);//115200

//奇偶校验

pCmbComParity->ResetContent();

pCmbComParity->AddString(L"None");

pCmbComParity->AddString(L"Odd");

pCmbComParity->AddString(L"Even");

pCmbComParity->SetCurSel(0);//None

//数据位

pCmbComDatabits->ResetContent();

pCmbComDatabits->AddString(L"8");

pCmbComDatabits->AddString(L"7");

pCmbComDatabits->AddString(L"6");

pCmbComDatabits->SetCurSel(0);//8

//停止位

pCmbComStopbits->ResetContent();

pCmbComStopbits->AddString(L"1");

pCmbComStopbits->AddString(L"1.5");

pCmbComStopbits->AddString(L"2");

pCmbComStopbits->SetCurSel(0);//1

returnTRUE;

}

/*-----------------------------------------------------------------------*/

3)实现“确定”按钮单击事件,用于保存设置好的参数。

“确定”按钮单击事件代码如程序清单11所示。

/*------------------------------程序清单11------------------------------*/

voidDlgParams:

:

OnBnClickedOk()

{

//TODO:

在此添加控件通知处理程序代码

CStringstrTmp;

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);

pCmbComBaud->GetWindowTextW(strTmp);

m_portNo=pCmbComNo->GetCurSel()+1;//串口号

m_baud=_wtoi(strTmp);//波特率

m_parity=pCmbComParity->GetCurSel();//奇偶校验

pCmbComDatabits->GetWindowTextW(strTmp);

m_databits=_wtoi(strTmp);//数据位

m_stopbits=pCmbComStopbits->GetCurSel();//停止位

//关闭对话框

OnOK();

}

/*-----------------------------------------------------------------------*/

4)实现“取消”按钮单击事件。

“取消”按钮单击事件代码如程序清单12所示。

/*------------------------------程序清单12------------------------------*/

voidDlgParams:

:

OnBnClickedCancel()

{

//TODO:

在此添加控件通知处理程序代码

OnCancel();

}

/*-----------------------------------------------------------------------*/

至此,串口参数输入对话框就实现完毕,下面将接着实现SerialDemo应用程序主窗口。

(4)设计SerialDemo应用程序主窗口。

1)设计主窗口样式如图4所示。

图4“SerialDemo”主窗口样式

对话框上的控件及其属性设置如表10所示。

表10SerialDemo主界面控件及其属性设置表

2)在解决方案中添加CCESeries类,然后为CSerialDemoDlg类添加m_pSerial成员变量,类型为之前创建的CCESeries类。

定义如下:

public:

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_pSerial->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

{

AfxMessageBox(L"串口打开失败");

}

}

}

/*-----------------------------------------------------------------------*/

备注:

由于如上代码引用了CDlgParams类,所以应该在SerialDemoDlg.cpp文件中添加对CDlgParams类定义文件的引用。

#include"DlgParams.h"

4)实现“关闭串口”按钮事件,用于关闭指定的串口并释放相应串口对象。

具体实现如程序清单14所示。

/*------------------------------程序清单14------------------------------*/

//关闭串口

voidCSerialDemoDlg:

:

OnBnClickedBtnClose()

{

if(m_pSerial!

=NULL)

{

//关闭串口

m_pSerial->ClosePort();

//释放串口对象

deletem_pSerial;

m_pSerial=NULL;

}

}

/*-----------------------------------------------------------------------*/

5)实现“发送数据”按钮事件,用于将待发送的数据写入到串口中,以便传输到串口的另一端,具体实现如程序清单15所示。

/*------------------------------程序清单15------------------------------*/

//发送数据

voidCSerialDemoDlg:

:

OnBnClickedBtnSend()

{

char*buf=NULL;//定义发送缓冲区

DWORDdwBufLen=0;//定义发送缓冲区长度

CStringstrSend=L"";

//得到发送输入框

CEdit*pEdtSendMsg=(CEdit*)GetDlgItem(IDC_EDT_SEND);

ASSERT(pEdtSendMsg!

=NULL);

//串口如果没有打开,直接返回

if(m_pSerial==NULL)

{

AfxMessageBox(L"串口未打开");

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;

//发送字符串

m_pSerial->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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1