用vc的串口通信实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

高级Internet编程实验报告实验题目:串口通信

班级:

学号:

姓名:

日期:2015-6-8

一、实验要求

把两台计算机的串口通过串口线连在一起,通过串口实现两台计算机通讯。可以利用高级语言、C语言编程实现,要求程序界面友好,有发送和接收功能,其接收和发送内容可在屏幕上显示。

二、实验原理

串口通讯把数据的字节分解成单个的二进制比特流依次传输,其结构简单,连接线少,应用非常广泛。实现串口通信的方法很多。如:利用标准通信函数实现串口通信、利用API实现串口通信和利用ActiveX控件实现。

本文主要采用ActiveX控件Microsoft CommunicationsControl(MSComm)编程,Windows平台先进的ActiveX技术使得对串口编程不再需要处理烦琐的细节。利用已有的AxtiveX控件,只需要编写少量的代码,就可以轻松高效地完成任务。

以下对ActiveX控件属性进行简单介绍,在ClassWizard中为新创建的通信控件定义成员对象(CMSComm m_comm),通过该对象便可以对串口属性进行设置,MSComm控件共有27个属性,这里只介绍其中几个常用属性:

CommPort:设置并回通讯端口号,缺省为COMl。

Settings:以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。

PortOpen:设置并返回通讯端口的状态,也可以打开和关闭端口。

Input:从接收缓冲区返回和删除字符。

Output:向发送缓冲区写一个字符串。

InputLen:设置每次Input读入的字符个数,缺省值为0,表明读取接收缓冲区中的全部内容。

InBufferCount:返回接收缓冲区中已接收到的字符数,将其置0可以清除接收缓冲区。

InputMode:定义Input属性获取数据的方式(为0:文本方式;为1:二进制方式)。

RThreshold和SThreshold:表示在OnComm事件发生之前,接收缓冲区或发送缓冲区中可以接收的字符数。

三、实验步骤

1、建立应用工程

启动VC++6.0,创建一个基于对话框的MFC应用程序项目,选择Project菜单下Add to Project子菜单中的Components and Controls选项,在弹出的对话框中双击Registered ActiveX Controls项,则所有注册过的ActiveX控件出现在列表框中。选择Microsoft Communications Con—trol version 6.0,单击insert 按钮即可将通信控件插入该工程。添加该控件到对话框中,设置控件ID号为IDC _MSCOMM.

2、添加界面控件

将对话框中的按钮“取消”删除,将“确定”按钮改为“退出”。在对话框中添加适当的界面控件。本实验中需添加的标注用的静态控件、用于选择串口和设置波特率的组合框分别设置控件ID号为IDC_COMBO_SELECT和IDC _COMBO_BTL SET、添加控制开始发送/接收按钮控件并设置控件ID号为IDC_BUTTON_START,添加用于输入发送数据和输出接收数据的编辑框并设置控件ID号为IDC_EDIT_SEND

和IDC_EDIT_RECEVE,同时为其设置各种属性。添加完后如下图:

3、映射控件通用消息

(1)打开MFC ClassWizard对话框,单击Member Valuable为相应控件添加变

(2)单击Message Maps,添加对话框初始化函数BOOL CCOMM_TD lg::OnInitDialog();编辑加入代码如下:

BOOL CCOMM_TDlg::OnInitDialog()

{

// TODO: Add extra initialization here

m_comselect.AddString("COM1"); //为组合框设置选项,即设定串口选项m_comselect.AddString("COM2");

m_comselect.AddString("COM3");

m_comselect.AddString("COM4");

m_comselect.AddString("COM5");

m_comselect.SetCurSel(0); //设置默认串口是COM1

m_btlset.AddString("2400");//为组合框设置选项,即设定波特率选项

m_btlset.AddString("4800");

m_btlset.AddString("9600");

m_btlset.AddString("19200");

m_btlset.AddString("38400");

m_btlset.SetCurSel(0);//设置默认波特率为2400

return TRUE; // return TRUE unless you set the focus to a control }

(3)为按钮IDC_BUTTON_START添加单击响应函数void CCOMM_TDl g::OnButtonStart();函数代码如下:

void CCOMM_TDlg::OnButtonStart()

{

int n_com,n_set,i;

CString temp;

n_set=m_btlset.GetCurSel();//获取波特率选择索引号

switch(n_set) // 转换为对应的波特率

{

case 0:

i=19200;

break;

case 1:

i=2400;

break;

case 2:

i=38400;

break;

case 3:

i=4800;

break;

case 4:

i=9600;

break;

}

temp.Format("%d,n,8,1",i); //将设置参数转换为CString类型存入temp中m_comm.SetSettings(temp);//波特率设置

m_comm.SetInputMode(1); //1:表示以二进制方式检取数据

m_comm.SetRThreshold(1);

m_comm.SetInBufferSize(1024);//设置输入缓冲区的大小

m_comm.SetOutBufferSize(512);//设置输出缓冲区的大小

//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件

n_com=m_comselect.GetCurSel();

m_comm.SetCommPort(n_com); //选择com

if( !m_comm.GetPortOpen())

m_comm.SetPortOpen(TRUE);//打开串口

else

AfxMessageBox("不能打开该串口。");

m_comm.SetInputLen(0); //设置当前接收区数据长度为0

m_comm.GetInput();//先预读缓冲区以清除残留数据

UpdateData(TRUE); //读取编辑框内容

int Count=m_send.GetLength();//字符串长度

char TxData[1000];

int j;

for(j=0;j

TxData[j]=m_send.GetAt(j);//要发送的字符串送字符数组

CByteArray array;

array.RemoveAll();

array.SetSize(Count);

for(j=0;j

相关文档
最新文档