1、基于MSComm控件实现STC89C52单片机与PC的串口通信孙 宇(武汉理工大学汽车学院,汽车1303班,学号:1049721302179)摘要:串口是常用的计算机与外部串行设备之间的数据传输通道。串行通信使用方便,应用广泛。介绍STC89C52单片机以及与PC的接口,以MSComm控件为例,介绍PC端串中通信程序的开发。并给出了基于VS2005开发平台的串行通信的程序实例。关键词:串口通信;单片机;MSComm控件;C+Realization of serial communication based on MSCommSUN Yu(School of Automotive Enginee
2、ring, Wuhan University of Technology ; Power Machinery and Engineering, Graduate 1303; 1049721202211)Abstract:Serial port is the data transmission passway between commonly used computer and serial equipment of outsideBecause serial communication is convenient to be easily used,it is used extensively
3、This paper introduce the structure of the serial port and the method of realizing the serial communication programmingIt presents how to make use of com controlling part MSCoom to realize serial com programming between the PC and serial equipmentKeyword: serial port communication; SCM; MSComm; C+6引言
4、PC与单片机构成的上位机、下位机分布式控制系统是一种常见的工业控制系统。单片机作为下位机可进行现场数据采集和就地控制。并可将采集到的数据或者状态信息传送到上位PC。以做进一步的分析处理。在实际应用中,上位机与下位机的通信问题是首要解决的问题之一,串行通信以其高效率、可靠、标准统一的优点成为重要的通信手段1。本文即在Windows WIN7环境下,基于C+语言,在VS2005软件中,使用MSComm控件实现STC89C52单片机与PC之间的串行通信。1串行口通信简介1.1 串行口通信串口通信是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式。这种通信方式使用的
5、数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。串口是计算机上一种非常通用的设备通信协议。大多数计算机包含两个基于RS-232协议的串口。串口同时也是仪器仪表设备通用的通信协议。同时,串口通信协议可以用于获取远程采集设备的数据。RS-232(ANSI/EIA-232标准)是IBM-PC及其兼容机上的串行连接标准。可用于许多用途,比如连接鼠标、打印机或者Modem,同时也可以接工业仪器仪表。用于驱动和连线的改进,实际应用中RS-232的传输长度或者速度常常超过标准的值。RS-232只限于PC串口和设备间点对点的通信。1.2 异步通信在异步通信中,数据通常以字符为单位组成数据帧
6、进行传输。发送端和接收端由各自的时钟来控制发送和接收2。在串口通信中发送字符的帧格式如下:(1) 起始位:字符传输的开始,起始位为低电平以表示数据发送的开始.(2) 数据位:紧跟起始位之后是数据位,根据用户设定可以是5、6、7、8数据位,低位在前,高位在后。(3) 奇偶校验位:位于数据位之后,用于串行通信的可靠性。有奇校验、偶校验,也可以没有校验。(4) 停止位:该位是字符的最后一位,用高电平表示,可以为1、1.5或2位。用于接收端表示一个字符已经发送完毕。在发送完数据后发送端信号变成空闲位,位高电平。在数据的发送过程中,两帧数据可以有空闲位也可以没有空闲位,可以有一个也可以有多个空闲位。异步
7、通信不需要时钟同步,所需连接设备简单,但其传送效率比较低。1.3 波特率通信线上的字符数据是按位传送的,每一位的宽度(即位信号持续时间)由数据传送速率确定,数据传送速率用波特率(Baud Rate)来表示。国际上规定了一些标志波特率系列,其常见波特率有4800、9600、19200等。波特率定义:单位时间内传送的数据位数,即:1波特1位s1.4 串口通信程序开发的方法选择在Microsoft Windows下开发串行通信程序通常有如下几种方法:(1)利用Windows API通信函数。(2)利用Windows的读写端口函数 (Windows 95系列下)或开发驱动程序(WindowsNT系列下
8、)直接对串口进行操作。(3)利用第三方提供或自己编写串口类。(4)使用串口通信组件,如AcfiveX控件MSCommo以上几种方法中,第一种使用面较广,但由于比较复杂,使用起来比较困难。第二种需要了解硬件电路结构原理,深入驱动层次,专业化程度较高。第三种方法使用面向对象技术封装Wind32API函数,提供一个用于串口通信的类,只要理解这种类的几个成员函数,就能方便地使用,但编写能普遍应用的这种类相当困难。第四种方法程序实现非常简单,结构清晰,只需要对串口进行简单配置就能满足控制计算机和智能设备之间的通信,所以在这里选择利用串口通信控件的方法来实现双机互联通信。MicroSoft Communi
9、cations Contml(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行端口发送和接收据的串行通信功能,使用非常方便。以下是串口通信的实现过程。2基于MSComm控件的串口程序开发2.1 MSComm控件简介MSComm控件是微软公司开发的专门用于串行通信的控件。它是高级语言编写的串行通信程序和PC串口之间的桥梁。通过这个效率,使得开发串口通信程序的工作变得更加容易。设置控件的几个属性,然后添加控件的事件响应代码,就可以使串口按照要求进行工作。MSComm控件的大部分属性石可读可写的。当对其进行写入操作时
10、是在设置属性的新值。当读属性时,可以读出该属性的当前设置值。2.2 MSComm控件常用的属性(1)put_CommPort()属性:通过设置该属性,可以决定串口通信使用的串口编号。(2)put_Settings()属性:该属性用于设置串行通信参数。通信参数包括波特率、奇偶校验类型、数据位数及停止位数等四个参数。(3)put_CommOpn()属性:设置该属性值可以打开或关闭串口。(4)get_Input()属性:从缓存区里获取数据。(5)put_Output属性:向缓冲区里写入数据。(6)put_InBufferCount()属性:清空接收缓冲区。(7)put_InBufferSize()
11、属性:设置缓存区大小。(8)put_InputMode()属性:设置从输入缓存区中读取数据的读取方式。(9)put_RThreshold()属性:设置阈值。当接收缓存区中的字符达到该阈值时,MSComm控件就会产生OnComm事件。(10)put_InputLen()属性:该属性决定了一次读取字节数3。2.3 程序开发打开vS2005,建立一个基于对话框的MFC应用程序。首先在对话框中利用工具箱添加两个静态文本控件两个编辑框控件和一个按钮控件到对话框中。接着就开始添加MSComm件。在对话框上的空白处点击右键。在弹出的快捷菜单中,选择添加ActiveX控件。在接着弹出的对话框中列出了本机所有的
12、已经注册的控件选择Microsoft Communications Control, Version 6.0.单击Insert,接受缺省的选项。这时在对话框中就出现了电话图标,现在要做的是用鼠标将此图标拖到对话框中适当的位置,程序运行后这个图标是看不到的。然后设计自己的程序界面,并为控件添加合适的变量类型和变量名。程序设计界面如下具体代码如下:(1)在void C串口通信Dlg:OnCbnSelchangeComboCom()下,添加COM端口选择程序。void C串口通信Dlg:OnCbnSelchangeComboCom()/ TODO: 在此添加控件通知处理程序代码UpdateData(
13、true);switch(Mycom)case 0:MyMscomm.put_CommPort(1);break;case 1:MyMscomm.put_CommPort(2);break;case 2:MyMscomm.put_CommPort(3);break;case 3:MyMscomm.put_CommPort(4);break;case 4:MyMscomm.put_CommPort(5);break;case 5:MyMscomm.put_CommPort(6);break;/UpdateData(false);(2)在void C串口通信Dlg:OnCbnSelchangeCo
14、mboB()下,添加波特率选择程序。void C串口通信Dlg:OnCbnSelchangeComboB()/ TODO: 在此添加控件通知处理程序代码int mybaud;switch(m_baud) /是串口编号对应波特率值case 0:mybaud=9600;break;case 1:mybaud=2400;break;case 2:mybaud=4800;break;case 3:mybaud=19200;break;strStatus.Format(_T(%.0f,mybaud); /将变量mybaud转化成字符串型变量(3)在void C串口通信Dlg:OnCbnSelchange
15、ComboJ()下,添加奇偶校验选择程序。void C串口通信Dlg:OnCbnSelchangeComboJ()/ TODO: 在此添加控件通知处理程序代码switch(m_jioayan)case 0:jiaoyan=N;case 1:jiaoyan=O;case 2:jiaoyan=E;(4)双击“打开串口”按钮,VS2005会自动位按钮添加事件。在该事件下,编写初始化程序和打开串口程序。void C串口通信Dlg:OnBnClickedButton1()/ TODO: 在此添加控件通知处理程序代码UpdateData(true);paraments=strStatus;parament
16、s+=,;paraments+=jiaoyan;paraments+=,8,1;MyMscomm.put_Settings(paraments);MyMscomm.put_InBufferCount(0); MyMscomm.put_InBufferSize(1024); MyMscomm.put_InputMode(1); MyMscomm.put_InputLen(0); MyMscomm.put_RThreshold(1);MyMscomm.put_PortOpen(true);MessageBox(_T(串口打开成功!);(5)双击“发送”按钮,添加事件。void C串口通信Dlg:O
17、nBnClickedSend()/ TODO: 在此添加控件通知处理程序代码UpdateData(true);MyMscomm.put_Output(COleVariant(m_senddata);(6) 右键单击MSComm控件图标,选择“添加事件处理程序”。在该事件下编写数据接收程序。void C串口通信Dlg:OnCommMscomm1()/ TODO: 在此处添加消息处理程序代码UpdateData(true);VARIANT variant_inp; /定义一个变体类型数据变量,以为MyMScomm.get_Input()得到的是该类型的变量COleSafeArray safearr
18、ay_inp; /COleSafeArray类是用于处理任意类型和维数的数组的类long i=0;int len;char rxdata1000;switch (MyMscomm.get_CommEvent() case 2: /表示缓冲区里有数据variant_inp=MyMscomm.get_Input();safearray_inp=variant_inp;len=safearray_inp.GetOneDimSize(); /得到数据长度for(i=0;ilen;i+)safearray_inp.GetElement(&i,&rxdatai);m_Dis+=rxdatai;rxdata
19、i=0;break;default:break; UpdateData(false);至此,所有上位机程序编写完成。3. STC89C52RT单片机串行通信的C语言程序开发在Keil C 软件中,使用C语言编写下位机串口通信程序。然后使用串口助手STC_ISP_V480将程序下载到单片机里。#include unsigned char flag,a;void main() REN=1; SM0=0;SM1=1; TR1=1;TMOD=0x20; TH1=0xfd; TL1=0xfd;EA=1;ES=1; while(1)if(flag=1)ES=0;flag=0;SBUF=a; while(!
20、TI);TI=0;ES=1; void ser() interrupt 4 RI=0; P1=SBUF;a=SBUF;flag=1; 4.运行与使用说明程序编写完成后,点击调试,就可以运行“自制简易串口小助手”了。使用说明如下:(1)选择串行端口、波特率和奇偶校验类型。本文中,作者使用COM3口,波特率选择9600,奇偶校验类型选择“无校验”。(2)将单片机USB线插入COM3口对应的USB接口。一定要与自己使用的COM端口对应。(3)点击打开串口。如果弹出“串口打开成功”的窗口,表示串口初始化成功,并且串口打开成功。(4)在“发送”按钮旁的编辑框里,输入一段字符串,点击“发送”按钮,即可完成数据的发送。注意:只能发送数字、符号和字母,不能发送汉字。(5)所发送的数据将会自动显示在接收数据框内。如果想换行,请手动Enter。参考文献1 候艳. 用VS2005实现AT89C51单片机与PC的串行通信. 西华师范大学物理与电子信息学院.2 田立,马鸣鹤. 51系列单片机开发实例精解M. 中国电力出版社,2009.8:66-67.3 刘书智,李琳娜. Visual C+ 实践与提高串口通信与工程应用篇M. 中国铁路出版社,2009.1: 79-102.