VB和51单片机串口通信讲解
- 格式:doc
- 大小:52.00 KB
- 文档页数:9
VB环境下实现PC机与单片机的串行通讯随着科技的不断发展,PC机和单片机的联系日益密切,特别是在嵌入式系统领域中,单片机已经成为了必不可少的重要组成部分。
而如何实现PC机和单片机之间的通讯,是一项必须要掌握的技能。
本篇文章主要介绍如何运用VB环境下的串口编程,实现PC机与单片机的串行通讯。
一、概述通讯技术日新月异,各种新的通讯技术层出不穷。
而在普通家庭却使用最为广泛的通讯技术,还是传统的串口通讯。
使用传统的串口通讯,可以实现PC机与单片机之间的数据交互,可靠性高,兼容性强,使用便捷。
要实现PC机与单片机之间的串行通讯,需要掌握两个技能:单片机串行通讯的编程和VB环境下串口编程。
二、单片机串行通讯的编程单片机串行通讯主要是通过寄存器和中断实现的。
单片机通过一个IO口与电脑之间建立一个简单的通讯接口,PC机通过该接口向单片机发送数据,单片机接收到数据,就可以通过该接口把数据返回给PC机。
单片机串口通讯编程的内容主要包括串口数据位、停止位、校验位、波特率等信息,这些信息需要设置在单片机的寄存器中。
同时,还要设置中断信息,以免程序在不接收数据时死等。
三、VB环境下串口编程VB环境下串口编程的关键是掌握控件的使用。
实际上,VB环境下的串口编程非常简单,只需要使用微软提供的MSComm控件就可以实现。
通过MSComm控件的事件和方法,可以轻松地实现数据的读取、发送、接收等功能。
需要注意的是,MSComm控件的BaudRate属性需要与单片机编写的程序的波特率一致,不然可能会出现通讯故障。
四、如何实现串口通讯首先需要硬件上建立好通讯接口。
通常情况下,USB串口转换器和单片机板子都会配套出售,只需要把两者插在一起即可。
其次需要编写单片机的串口通讯程序。
单片机数字口与串口的通讯,就是把串口接到单片机的数字口中,通过串口向外发送数据。
因此,编写单片机的串口通讯程序,需要设置停止位、数据位、奇偶校验位、波特率等参数。
VB入门中最简单入门教程基于VB单片机与PC通信一、目的和要求1、掌握利用VB软件制做出通信界面;2、掌握在VB中添加程序并能够写出发送数据的程序;3、掌握单片机串行口通信原理;4、掌握单片机接受串行口通信数据程序;二、设备1、Keilc51软件及电脑一台;2、89C51单片机开发板一块;3、Microsoft Visual Basic 6.0软件;三、实验内容本次课程设计就是利用Microsoft Visual Basic 6.0软件制作一个通信界面在界面上添加三个按钮,当按第一个按钮时单片机上的LED灯正转,当按第二个按钮时单片机上的LED灯反转,当按第三个按钮时单片机上的LED灯闪烁。
单片机能正确接受并显示。
四、原理串口是计算机上一种非常通用设备通信的协议〔不要与通用串行总线Universal Serial Bus或者USB混淆〕。
大多数计算机包含两个基于RS232的串口。
串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。
同时,串口通信协议也可以用于获取远程采集设备的数据。
串口通信的概念非常简单,串口按位〔bit〕发送和接收字节。
尽管比按字节〔byte〕的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。
它很简单并且能够实现远距离通信。
比方IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。
五、步骤1、在桌面上启动Microsoft Visual Basic 6.0软件弹出对话框,点击标准EXE确定。
2、添加串口控件点击工程-部件-Microsoft Comm control 6.0 即可会在左方的工具栏出现该工具,双击此工具会在form1中出现。
3、初始化串口双击form1中的空白区域添加程序MSComm1.Settings = "9600,n,8,1"mPort = 4MSComm1.PortOpen = TrueMSComm1.RThreshold = 1mPort 取决你使用的串行口,在设备管理器中查看。
第14卷第4期北京电子科技学院学报2006年12月Vol.14No.4JournalofBeijingElectronicScienceandTechnologyInstituteDec.2006基于VB.NET的PC机和MCS-51单片机之间的串行通信何文才1,2杜鹏1,2刘培鹤1牛晓蕾1,2张媛媛1,2(1.北京电子科技学院通信工程系,北京,100070;2.西安电子科技大学通信工程学院,陕西西安,710071)摘要:本文介绍了基于VisualStudio2005的VisualBasic2005(简称VB.NET)进行串口程序开发的方法,它具有开发周期短、可靠性强等特点。
同时给出了PC机与51单片机串行通信的应用实例,这对快速掌握最新的PC机与单片机串口通信技术有一定的参考价值。
关键词:VisualBasic.NET;Serialport控件;串行通信;单片机中图分类号:TP368.2文献标识码:A文章编号:1672-464X(2006)04-0061-041引言PC机和单片机之间的通信问题一直是业界的热门话题,它广泛应用于工业控制系统、智能检测系统、数据采集系统等。
PC机与单片机之间通常采用两种通信方式:并行通信和串行通信。
并行通信是指将待发送数据的各位同时传送,串行通信则将数据一位一位地按顺序传送。
并行通信虽然传输效率高、速度快,但可靠性差,所需硬件设备复杂,不适于长距离通信(通常不超过三十米),所以一般只适用于要求实时性强,传送速率较高的系统中,实用面较窄。
相比之下,串行通信虽然速度较慢、效率较低,但可靠性好,简单易实现,传输距离较长,所以被广泛应用于多种场合,特别适合于计算机与计算机、计算机与外设之间的远距离通信[1]。
串行通信包括同步通信和异步通信。
在同步通信中,数据开始传送前用同步字符来指示,并由时钟信号来实现发送端和接受端同步。
同步通信可以提高传输速率,但硬件实现比较复杂,常用于信息量大,传输速率要求高的场合;而在异步通信中,规定了标准的字符数据传输格式,即每一帧信息由起始位、数据位、奇偶校验位和停止位组成。
关于使用VB 与单片机通信一、电脑和单片机通信(以MCS51 为例),必须进行电平转换,推荐使用单5V 供电的MAX232CPE ,只需简单地外接几个电容就可实现,具体电路可参考《单片机原理及接口技术》(P382 )。
二、使用VB 与单片机通信,可以利用VB 提供的MSCOMM 控件。
1 、如果工具箱中没有MSComm 控件,其外形是一个小电话,则需要添加该控件。
选择“Project ”菜单的Commponent 项,弹出一个对话框,在控件列表中找到Mircosoft Coun confrol 6.0 ,点击左边的方框,确定即可。
2 、MSCOMM 控件的主要属性。
( 1 )CommPort 设置或返回通讯端口号。
格式为:mPort [ =PortNumber] 。
在设计时,PortNumber 可以设置成从1 到16 的任何数(缺省值为1 )。
但是如果用PorOpen 属性打一个并不存在的端口时,就会产生错误。
还需注意的是必须在打一开端口之前设置CommPort 属性。
例如:mPort=2, 即设置当前通信串口为COM2 口。
( 2 )Settings 以字符串形式设置或返回波特率、奇偶校验、数据位和停止位。
格式为:MSComm.Settings[=ParaString] 。
ParaString 是一个包含四部分的字符串。
第一部份为波特率,其可选值为110 ,300 ,600 ,1200 ,2400 ,9600 ,14400 ,19200 ,28800 。
第二部份为奇偶校验,N 表示不校验,E 表示偶校验,O 表示奇校验,S 表示空格检验,M 表示符号校验。
第三部份为数据位位数,其可选值为4 , 5 ,6 ,7 ,8 ,。
第四部份为停止位位数,其可选值1 ,1.5 ,2 。
Settings 属性的缺省值为“9600 ,N ,8 ,1 ”。
(3 )handshaking 设置或返回硬件握手协议,指的是PC 机与Modem 之间为了控制流通而约定的内部协议。
51单片机串口通信(相关例程) 51单片机串口通信(相关例程)一、简介51单片机是一种常用的微控制器,它具有体积小、功耗低、易于编程等特点,被广泛应用于各种电子设备和嵌入式系统中。
串口通信是51单片机的常见应用之一,通过串口通信,可以使单片机与其他外部设备进行数据交互和通信。
本文将介绍51单片机串口通信的相关例程,并提供一些实用的编程代码。
二、串口通信基础知识1. 串口通信原理串口通信是通过串行数据传输的方式,在数据传输过程中,将信息分为一个个字节进行传输。
在51单片机中,常用的串口通信标准包括RS232、RS485等。
其中,RS232是一种常用的串口标准,具有常见的DB-9或DB-25连接器。
2. 串口通信参数在进行串口通信时,需要设置一些参数,如波特率、数据位、停止位和校验位等。
波特率表示在单位时间内传输的比特数,常见的波特率有9600、115200等。
数据位表示每个数据字节中的位数,一般为8位。
停止位表示停止数据传输的时间,常用的停止位有1位和2位。
校验位用于数据传输的错误检测和纠正。
三、串口通信例程介绍下面是几个常见的51单片机串口通信的例程,提供给读者参考和学习:1. 串口发送数据```C#include <reg51.h>void UART_Init(){TMOD = 0x20; // 设置计数器1为工作方式2(8位自动重装) TH1 = 0xFD; // 设置波特率为9600SCON = 0x50; // 设置串口工作方式1,允许串行接收TR1 = 1; // 启动计数器1}void UART_SendChar(unsigned char dat){SBUF = dat; // 发送数据while (!TI); // 等待发送完成TI = 0; // 清除发送完成标志}void main(){UART_Init(); // 初始化串口while (1){UART_SendChar('A'); // 发送字母A}}```2. 串口接收数据```C#include <reg51.h>void UART_Init(){TMOD = 0x20; // 设置计数器1为工作方式2(8位自动重装) TH1 = 0xFD; // 设置波特率为9600SCON = 0x50; // 设置串口工作方式1,允许串行接收TR1 = 1; // 启动计数器1}void UART_Recv(){unsigned char dat;if (RI) // 检测是否接收到数据{dat = SBUF; // 读取接收到的数据 RI = 0; // 清除接收中断标志// 处理接收到的数据}}void main(){UART_Init(); // 初始化串口EA = 1; // 允许中断ES = 1; // 允许串口中断while (1)// 主循环处理其他任务}}```3. 串口发送字符串```C#include <reg51.h>void UART_Init(){TMOD = 0x20; // 设置计数器1为工作方式2(8位自动重装) TH1 = 0xFD; // 设置波特率为9600SCON = 0x50; // 设置串口工作方式1,允许串行接收TR1 = 1; // 启动计数器1}void UART_SendString(unsigned char *str){while (*str != '\0')SBUF = *str; // 逐个发送字符while (!TI); // 等待发送完成TI = 0; // 清除发送完成标志str++; // 指针指向下一个字符}}void main(){UART_Init(); // 初始化串口while (1){UART_SendString("Hello, World!"); // 发送字符串}}```四、总结本文介绍了51单片机串口通信的基础知识和相关编程例程,包括串口发送数据、串口接收数据和串口发送字符串。
设计基本原理主要功能:上位机和下位机连接好后握手,如果成功,上位机就可以发字符串让下位机的LCD显示出来,如果没有握手就不显示上位机发来的内容.下位机设计:主程序首先初始化串口和LCD,然后进入一个死循环,这个循环往LCD写dataArray这个数组中的数据,因此只要改变了这个数组中的第0-31位的内容就相当于改变了屏幕上显示的内容. 当串口发来消息的时候,执行中断号为4(串口中断)的服务子程序.这时候还不能让上位机往下位机传字符串,因此需要判断是否已经握手,判断的标志就是dispEn (display enable),如果等于0说明还没有握手,就把用户发来的数据当成是控制字control,如果是等于1说明之前已经握过手了,就把用户发来的数据放到dataArray中.最后判断控制字是否是握手,如果control等于0x00是就握手信号,然后回复0x01.然后把dispEn=1,最后把控制字control改掉(因为下一次中断可能已经不是握手信号了)上位机设计:由于已经把端口号写在vb程序中了,所以要改端口号的话要进vb的代码中把mPort = 4 中的4 改为自己需要的串行端口号.然后运行程序,打开端口,此时没有和下位机握手,所以输入数据后单击发送是没有反应的,所以需要先单击握手按钮,向传哭发送0x00,然后延时800毫秒等待回复,然后接收数据,如果回复的是0x01那就表明握手成功,如果没有回复那就是握手失败.用户点击发送信息,上位机把字符串拆分成字符来发送一次发送一个字符,每个字符发送延时30毫秒避免因为连续发送而造成的乱码.a)原理框图b)硬件电路原理图AT89C521~8:I/OP1口(P1.0~P1.7);9:复位脚(RST/Vpd);10~17:I/OP3口(P3.0=RXD,P3.1=TXD,P3.2=-INT0,P3.3=-INT1,P3.4=T0,P3.5=T1,P3.6=-WR,P3.7=-RD)主要是此引脚;18、19:晶振(18=XTAL2,19=XTAL1);20:地(Vss);21~28:I/OP2口(P2.0~P2.7);29:-PSEN;30:ALE/-PROG;31:-EA/Vpp32~39:I/OP0口(P0.7~P0.0);40:+5V电源。
一种VB和单片机进行串行通信的可靠协议摘要:本文详细介绍了VB和单片机之间进行通信的过程。
为了确保通信的可靠性,特别设计了一种以单片机为主控机的通信协议,并对其性能进行了初步探讨。
关键词:单片机串行通信可靠性在进行数据通信的软件设计时必须解决好两个方面的问题:一是可靠性,二是速度。
而这两方面的问题可靠性是第一位的。
速度只能是在可靠的基础上的速度。
可靠快速转输的实现需要上下位机软件以及通信协议等各个环节的可靠和其间的相互配合。
完成硬件层的串行通信设计较为简单,然而在实际工业现场中,干扰是不可避免的,因而仅仅依靠硬件层的通信必然会出现问题。
为了实现可靠通信,本文作者在实践的基础上提出了一种较为可靠的通信协议。
协议是基于帧的。
计算机端使用VB,而单片机端使用KEILC。
一、通信协议的设计本协议适用于单片机和计算机点对点通信的情况,设定单片机始终为主机,无论收发数据都由单片机确定。
协议分为三部分:握手帧、数据帧和应答帧。
A、握手帧定义:令计算机处于接收状态,单片机发送0X54(T),作为握手信号,如果计算机回0X63(c),则握手成功。
如果在给定时间内(100MS)计算机不回,则重发。
如果连发三次都失败,则转向错误处理。
B、数据帧定义:据,则可以以0X56为起始标志,数据长度设为1,数据任填。
C、应答帧:计算机每收到一个完整而正确的帧,就给单片机连发两个0X63(c)。
单片机收到任意一个即可认为应答成功。
此设计主要是防止应答数据丢失或错误。
D、错误处理:如果任何一帧接收不成功,则向单片机发0xEE表示接收错误并要求重发。
同时,VB记录错误原因,以便编程者分析。
如果单片机连发三次都不成功,则指出错误原因。
例如:VB的接收错误有:握手错误、数据帧的起始帧错误、数据帧的校验帧错误。
单片机的发送错误有:握手失败、数据传输失败。
二、单片机的软件设计近一两年来单片机的C语言已经成为单片机编程的主要工具。
KeilC软件产生的代码长度以比的上中等程序员用汇编的水平。
VB和51单片机串口通信讲解Commport;设置或返回串口号。
SettingS:以字符串的形式设置或返回串口通信参数。
Portopen:设置或返回串口状态。
InputMode:设置或返回接收数据的类型。
Inputlen:设置或返回一次从接收缓冲区中读取字节数。
InBufferSize:设置或返回接收缓冲区的大小,缺省值为l 024字节。
InBufferCount:设置或返回接收缓冲区中等待计算机接收的字符数。
Input:从接收缓冲区中读取数据并清空该缓冲区,该属性设计时无效,运行时只读。
OutBufferSize:设置或返回发送缓冲区的大小,缺省值为512字节。
OutBufferCount:设置或返回发送缓冲区中等待计算机发送的字符数。
Output:向发送缓冲区发送数据,该属性设计时无效,运行时只读。
设置好这些属性和方法,程序很容易就可以编出来了,其中要注意的是串口的波特串设置,OnComm事件的程序编写。
程序的设计是这样的,计算机向单片机发送一个’S’,表示通信开始。
然后紧接着又发送9个字符,其中最后一个字符是前面9个字符(包括’S’)的校验和。
单片机正确接收到10个字符后,把10个字符从新又送回来。
//---------------------------------------初始化串口设计-----------------------------Private Sub Form_Load()Comm1.Setting="9600,n,8,1," ’设置波特率和发送字符格式mPort=1 ’设置通讯串口Comm1.InputLen=0 ’设置或返回一次从接收缓冲区中读取字节数,0表示一次读取所有数据Comm1.InBuffersize=512Comm1.InBufferCount=0Comm1.OutBufferCount=0Comm1.Rthreshold=1Comm1.PortOpen=TrueEnd Sub ’打开串口//--------------------------------------给单片机发送’S’,开始通信-----------------------------Private Sub Command1_C1ick()Timer1.Enabled=TrueEnd SubPrivate Sub Command2_C1ick()Varbuffet=“S”Comm1.Ouput=varbuffeTimer2.Enabled=TrueEnd SubPrivate Sub Form_Unload(Cancel As Integer)Comm1.PortOpen=FalseEnd Sub//---------------------------------------向单片机发送数据-----------------------------Private Sub Timer2_ Timer()Outputsignal=Str(Text2.text) ’向单片机发送数据Temp(1)=Cbyte(outputsignal)Varbuffer=tempComml.Output=varbufferTimer2.Enabled=FalseEnd Sub//---------------------------------------接收单片机发送的数据,并显示-----------------------------Private Sub Comm1_OnComm()Select Case mEvent ’设置oncomm事件,读取片机存的值Case comEvReceiveInputsignal=comm1.InputText1.Text=Asc(Inputsignal) ’单片机存的值用textbox显示出Case ElseEnd selectEnd Sub关于MSCOMM控件的一些说明VB5.0/6.的MSComm通信控件提供了一系列标准通信命令的接口,它允许建立串口连接,可以连接到其他通信设备(如Modem).还可以发送命令、进行数据交换以及监视和响应在通信过程中可能发生的各种错误和事件,从而可以用它创建全双工、事件驱动的、高效实用的通信程序。
VB实现电脑跟单片机通讯任务说明:电脑端通过串口将数字(00,01,….,FF,十六进制)发送给单片机,单片机收到后回传这个数字,电脑接收到回传数据后显示出来,若发送的数据和接受的数据一致,则串口通讯正常,否则错误。
起始符是数字00,结束符是数字FF。
一、软件界面设计如下:二、VB程序代码如下:'将数字(0,1,2,3...255,转换为16进制)传给单片机,单片机收到后回传这个数字,PC机接收到回传数据后显示出来,'若发送和接收的数据相同,显示通信正常,否则通信不正常'发送以00开始,以FF结束'定义变量Dim data, data1 As V ariant '串口初始化'在窗体的Load事件中加入下列代码对串口进行初始化:Private Sub Form_Load()mPort = 1MSComm1.InputMode = 1MSComm1.RThreshold = 1MSComm1.SThreshold = 1MSComm1.Settings = "9600,n,8,1"MSComm1.PortOpen = Truesenddata.Text = "00"End Sub'单击清空文本框Private Sub senddata_Click()senddata.Text = ""Cmdsend.Enabled = TrueEnd SubPrivate Sub senddata_Change()senddata.Text = UCase(senddata.Text)End SubPrivate Sub senddata_KeyPress(KeyAscii As Integer)If (KeyAscii >= Asc("a") And KeyAscii <= Asc("f")) ThenKeyAscii = KeyAscii - 32End IfEnd Sub'向单片机发送数据Private Sub Cmdsend_Click()If Len(senddata.Text) <> 2 ThenMsgBox ("请输入2位16进制数!")Exit SubEnd Ifc = senddata.TextIf (c = "FF") Thendata1 = "&H" & cdata = Chr(data1)Elsea = Left(c, 1) '截取senddata左边字符b = Right(c, 1) '截取senddata右边字符data1 = "&H" & senddata.Text 'data1没有将senddata中的字符拆开data = Chr("&H" & a) & Chr("&H" & b) '将senddata中的字符拆开存入data中,这样就会解决例如A1接收不正确的问题End IfMSComm1.Output = dataCmdsend.Enabled = FalseEnd Sub'获取温度测量值并显示'每发送一次指令,触发下面事件,返回数据串Private Sub MSComm1_OnComm()Dim Inbyte() As ByteDim buffer As Variant'读取仪表返回数据串Select Case mEventCase comEvReceiveInbyte = MSComm1.InputFor i = LBound(Inbyte) To UBound(Inbyte)buffer = buffer + Hex(Inbyte(i))Next iCase comEvSendEnd SelectIf Len(Trim(buffer)) = 1 Thenreturndata.Text = Str("0") & bufferElsereturndata.Text = bufferEnd IfIf "&H" & buffer = data1 ThenLabel1.ForeColor = QBColor(13)Label1.Caption = "通信正常!"End IfIf "&H" & buffer <> data1 ThenLabel1.ForeColor = QBColor(12)Label1.Caption = "通信不正常!"Label1.Caption = "未接收到数据"End IfIf Trim(buffer) = "FF" ThenLabel1.ForeColor = QBColor(12)Label1.Caption = "输入00重新开始!"End IfEnd Sub'当退出程序时,关闭串行口Private Sub Cmdquit_Click()Unload MeEnd SubPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) MSComm1.PortOpen = False '关闭串口End Sub三、单片机代码:。
1引言1.1 设计的目及意义一般的PC与单片机之间的串行通信,需要单片机采集数据,然后用异步串行通讯方式传给PC机。
相对而言比较的烦琐,而本文着重用VB具有面向对象的设计方法,友好的用户来探讨在VB环境下来实现PC机与51单片机之间串行通讯的方法。
实现起来要简捷方便。
随着计算机系统的应用和微机网络的发展,各种控制设备之间的通信功能越来越显得重要。
尤其是伴随着单片微型机技术的发展,人们已越来越多地采用单片机来对一些工业控制系统中如温度、流量和压力等参数进行检测和控制。
在本系统中,下位机采用一片AT89S51单片机,用于对发送的数据实施控制,为了实现对输入数据的接收,上位机采用便携式PC机,上、下位机之间通过MAX232芯片实现串行数据通信。
PC 机具有强大的监控和管理功能,而单片机则具有快速及灵活的控制特点,通过PC 机的RS-232 串行接口与外部设备进行通信,是许多测控系统中常用的一种通信解决方案。
本文将论述在VB 环境下PC 机与单片机之间实现串行通讯的软硬件方案。
实现单片机与PC 机的相互通信。
单片机部分由汇编语言实现,PC 机的通讯程序使用Visual Basic 编写,VB 是Microsoft 公司推出的Windows 应用程序开发工具,因其具有界面友好,编程简便等优点而受到广泛的使用,而且Visual Basic 6.0 版本带有专门实现串行通讯的MSCOMM 控件。
因此如何实现PC 机与单片机之间的通讯具有非常重要的现实意义。
利用VB6.0 的事件驱动方式可以很方便地开发数据采集与监控系统,用单台PC 机可以测量和监控多路控制信号,整控制系统设计方便,对小型测控系统的设计具有很大的实用性。
1.2 设计实现的功能实现单片机与PC 机的相互通信。
具体要求有以下两点:①单片机发固定编好的代码,在用VB 编好的界面上接收;②在VB 编好的界面上发送数字,在单片机板上的数码管上显示出来。
2 硬件设计方案为了实现PC机与单片机之间的串行通信,我们首先要清楚了解整个系统所采用的原理图。
VB和51单片机串口通信讲解Commport;设置或返回串口号。
SettingS:以字符串的形式设置或返回串口通信参数。
Portopen:设置或返回串口状态。
InputMode:设置或返回接收数据的类型。
Inputlen:设置或返回一次从接收缓冲区中读取字节数。
InBufferSize:设置或返回接收缓冲区的大小,缺省值为l 024字节。
InBufferCount:设置或返回接收缓冲区中等待计算机接收的字符数。
Input:从接收缓冲区中读取数据并清空该缓冲区,该属性设计时无效,运行时只读。
OutBufferSize:设置或返回发送缓冲区的大小,缺省值为512字节。
OutBufferCount:设置或返回发送缓冲区中等待计算机发送的字符数。
Output:向发送缓冲区发送数据,该属性设计时无效,运行时只读。
设置好这些属性和方法,程序很容易就可以编出来了,其中要注意的是串口的波特串设置,OnComm事件的程序编写。
程序的设计是这样的,计算机向单片机发送一个’S’,表示通信开始。
然后紧接着又发送9个字符,其中最后一个字符是前面9个字符(包括’S’)的校验和。
单片机正确接收到10个字符后,把10个字符从新又送回来。
//---------------------------------------初始化串口设计-----------------------------Private Sub Form_Load()Comm1.Setting="9600,n,8,1," ’设置波特率和发送字符格式mPort=1 ’设置通讯串口Comm1.InputLen=0 ’设置或返回一次从接收缓冲区中读取字节数,0表示一次读取所有数据Comm1.InBuffersize=512Comm1.InBufferCount=0Comm1.OutBufferCount=0Comm1.Rthreshold=1Comm1.PortOpen=TrueEnd Sub ’打开串口//--------------------------------------给单片机发送’S’,开始通信-----------------------------Private Sub Command1_C1ick()Timer1.Enabled=TrueEnd SubPrivate Sub Command2_C1ick()Varbuffet=“S”Comm1.Ouput=varbuffeTimer2.Enabled=TrueEnd SubPrivate Sub Form_Unload(Cancel As Integer)Comm1.PortOpen=FalseEnd Sub//---------------------------------------向单片机发送数据-----------------------------Private Sub Timer2_ Timer()Outputsignal=Str(Text2.text) ’向单片机发送数据Temp(1)=Cbyte(outputsignal)Varbuffer=tempComml.Output=varbufferTimer2.Enabled=FalseEnd Sub//---------------------------------------接收单片机发送的数据,并显示-----------------------------Private Sub Comm1_OnComm()Select Case mEvent ’设置oncomm事件,读取片机存的值Case comEvReceiveInputsignal=comm1.InputText1.Text=Asc(Inputsignal) ’单片机存的值用textbox显示出Case ElseEnd selectEnd Sub关于MSCOMM控件的一些说明VB5.0/6.的MSComm通信控件提供了一系列标准通信命令的接口,它允许建立串口连接,可以连接到其他通信设备(如Modem).还可以发送命令、进行数据交换以及监视和响应在通信过程中可能发生的各种错误和事件,从而可以用它创建全双工、事件驱动的、高效实用的通信程序。
但在实际通信软件设计过程中,MSComm控件并非像想像中那样完美和容易控制.特别是在中文Wln95/98下通信时更会出现问题。
下面就从基础开始介绍,然后逐步讨沦MSComm控件在编程中出现的问题以及编程技巧。
一、用MSComm控件通信1.串口通信基础知识一般悦来,计算机都有一个或多个串行端口,它们依次为com1、Com2、…,这些串口还提供了外部设备与pC进行数据传输和皿信的通道。
这些串口在CPU和外设之间充当解释器的角色。
当字符数据从CPU发送给外设时,这些字符数据将被转换成串行比特流数据;当接收数据时,比特流数据被转换为字符数据传递给CPU,再进一步说,在操作系统方面,Windows用通信驱动程序(COMM.DRV)调用API函数发送和接收数据,当用通信控件或声明调用API函数时,它门由COMM. DRV解释并传递给设备驱动程序,作为一个vB程序员,要编写通信程序.只需知道通信控件提供给Windows通信AP1函数的接口即可.换句话说,只需设定和监视通信控件的属性和事件即可。
2.使用Mscomm控件在开始使用MSComm控件之前。
需要先了解其属性、事件或错误属性描述CommPort 设置或返回通信端口号Settings 以字符串的形式设置或返回波特率、奇偶校验、数据位和停止位PortOpen 设置或返回通信端口的状态。
也可以打开和关闭端口Input 返回和删除接收缓冲区中的字符Output 将字符串写入发送缓冲区CommEvent属性为通信事件或错误返回下列值之一。
在该控件的对象库中也可以找到这些常量。
常量值描述ComEventBreak 1001 收到了断开信号ComEventCTSTO 1002 Clear To Send Timeout。
在发送字符时,在系统指定的事1件,CTS(Clear To Send)线是低电平ComEventDSRTO 1003 Data Set Ready Timeout。
在发送字符时,在系统指定的事件,DSR(Data Set Ready)线是低电平ComEventFrame 1004 数据帧错误。
硬件检测到一个数据帧错误ComEventOverrun 1006 端口溢出。
硬件中的字符尚未读,下一个字符又到达,并且丢失ComEventCDTO 1007 Carrier Detect Time。
在发送字符时,在系统指定的事件,CD(Carrier Detect)线是低电平。
CD也称为RLSD(Receive Line Singal Detect,接收线信号检测)ComEventRxOver 1008 接收缓冲区溢出。
在接收缓冲区中没有空间ComEventRxParity 1009 奇偶校验错。
硬件检测到奇偶校验错误7ComEventTxFull 1010 发送缓冲区满。
在对发送字符排队时,发送缓冲区满ComEventDCB 1011 检取端口DCB(Device Control Blick)时发生了没有预料到的错误通信事件包含了下面的设置:常量值描述ComEvSend 1 发送缓冲区中的字符数比Sthreshold值低ComEvReceive 2 接收到了Rthreshold个字符。
持续产生该事件,直到使用了Input属性删除了接收缓冲区中的数据ComEvCTS 3 CTS(Clear To Send)线改变ComEvDSR 4 DSR(Data Set Ready)线改变。
当DSR从1到0改变时,该事件发生ComEvCD 5 CD(Carrier Detect)线改变ComEvRing6检测到响铃信号。
一些URAT(Universal AsynchronousReciver--Transmitters,通用异步收发器)不支持该事件ComEvEOF 7 收到了EOF字符(ASCII字符26)Error消息(MSComm控件)下表列出了MSComm控件可捕获的错误消息:常量值描述ComInvalidPropertyValue 380 无效的属性值ComSetNotSupported 383 属性只读ComGetNotSupported 394 属性只读ComPortOpen 8000 端口打开时该存在无效8001 超时设置必须比0值大ComPortInvalid 8002 无效的端口号8003 属性只在运行时有效8004 属性在运行时是只读的ComPortAleadyOpen 8005 端口已经打开8006 设备标识符无效或不支持8007 不支持设备的波特率8008 指定的字节大小无效8009 缺省参数错误8010 硬件不可用(被其他设备锁住)8011 函数不能分配队列ComNoOpen 8012 设备没有打开8013 设备已经打开8014 不能使用通信通知ComSetCommStateFailed 8015 不能设置通信状态8016 不能设置通信事件屏蔽ComPortNotOpen 8018 该存在只在端口打开是有效8019 设备忙ComReadError 8020 通信设备读错误ComDCBError 8021 检取端口设备控制块时出现部错误搞清楚以上基本属性后,就可以开始编写通信许程序了。
在VB5.0/6.0中新建一个工程文件。
添加Microsoft Comm Control 5.0组件,在简体Form1中加入Command命令按钮并取名为CmdTest,MSComm控件取名为MSComm1,加入如下程序代码。
Private Sub cmdTestClick ( ) '打开串口mPort =2 '设定Com2If MSComml.PortOpen = False ThenMSComm1.Settings = "9600,n,8,1" '9600波特率,无校验,8位数据位,1位停止位MSComm1.PortOpen = True '打开串口End ifMSComm1.OutBufferCount = 0 '清空发送缓冲区MSComm1.InBufferCount = 0 '滑空接收缓冲区'发送字符数据时注意必须用回车符(vbcr)结束MSComm1.Output="This is a qood book ! " &vbCr'泼打或发送AT命令MSComm1.Output = "ATDT , & vbCr'发送字符数组数据时注意ByteArray必须事先定义赋值Dim ByteArray as byte( )'定义动态数组ReDim ByteArray(1)'重定义数组大小ByteArray ( 0 ) =0ByteArray ( 1 ) = 1MSComm1.Output = ByteArrayEnd Subprivate Sub MScommEvent( )Select Case mEventCase comEvReceiveDim Buffer As VariantMSComm1.InputLen = 0'接收二进制数据MSComm1.InputMode= ComInputModeBinaryBuffer=MSComm1.Input'接收字符数据MSComm1.InputMode=comInputModeTextBuffer = MSComml.InputCase elseEnd SelectEnd sub( 程序1)二、中文Win 95/98下的通信问题与解决方法1.接收的数据少于发送的数据如果通过MSComm控件一次性传送较多的二进制数据,那么,很可能收到的数据不足。