c51串行通信汇编语言,基于VB与C51串行通信协议的设计与实现

1 引言

串行通信是计算机之间较常用的通信手段之一,在工业控制中,经常要将带有rs232总线接口的仪器作为i/o接口设备,通过rs232串行总线与pc计算机组成一整套仪器系统。

单片机c语言是一种编译型程序设计语言,它兼顾了多种高级语言的特点,并具备汇编语言的功能。

本文通过制定串行通信协议,上位机采用vb语言,单片机用c语言编程来实现计算机与单片机之间的串行通信,这对功能复杂的通信,采用串口通信协议将使数据传送准确可靠。

2 通信协议及程序设计思想

pc机与单片机之间的通信是通过串行口实现的,由于单片机系统电平是ttl电平,与标准rs232不兼容,本实验通过max232将ttl电平转换为 rs232标准,再与pc机的串口连接。为使数据在链路上无差错的传送,并实现不同的功能,本文采用通信协议来规约数据的传输。本文采用的通信协议如下:

(1) 通信参数设定:

波特率9600,无奇偶校验,8个数据位,1个停止位。

(2) 命令帧格式:

1byte 1byte 2byte 1byte

起始标志 功能码 参数 校验和命令帧起始标志为63h。

功能码:命令帧中的功能码代表不同的命令,例如,当功能码取50h时为上位机读数据命令,下位机接到此命令后把数据传给上位机;当功能码取60h时为上位机写数据命令。命令帧的第三个段为命令参数,是传输命令时的附加信息,如果命令不需要附加信息时,可以将它置为0即可,但有些命令需要进一步的信息,例如,当功能码取52h时帧表示错误命令,这时就可以用命令帧的参数段来表示错误的原因或类型。这种命令帧格式可以保证很大的扩展性和灵活性。

在命令帧和数据帧中都设置了一个字节的校验码,可以确保帧在传输过程中没有错误,这里采用比较容易实现的和校验方式.

(3) 数据帧格式:

1byte 2byte 10byte 1byte

起始标志 序号 数据块 校验和

其中数据帧起始标志为64h,序号是当多帧数据要发送时所规定的发送顺序号。数据块为所要传输的内容。

上位机(pc机)作为主机控制通信的进行,下位机(单片机)作为从机中断响应上位机的通信要求,进入中断服务程序,进行相应的操作。

3 vb中的串行通信机制及其在上位机通信中的实现

vb6中有一个专门用来串行通信的控件-mscomm控件。在vb6中选择“工程/部件”菜单项,在“控件”对话框选中“microsoft comm.control 6.0”,单击“确定”即可添加mscomm控件,然后在窗体中依次布置如下控件并正确设置其属性:3个commandbutton按钮,两个 textbox文本框,一个定时器timer1。其中text1显示的是pc机接收单片机发送的数据,text2显示的是pc机发往单片机的数据。

mscomm控件有两种处理通讯的方式:事件驱动通讯和查询方式。事件驱动的通讯方式处理串行端口交互作用非常有效,是一种功能强大的处理通讯的方法。在通讯过程中,当有通讯事件或错误发生时,mscomm控件的oncomm事件可捕获并处理它们。commevent属性中保留了最近一次通讯事件或错误的数值代码,无论何时当commevent属性的值变化时,就产生oncomm事件。笔者采用oncomm对comevreceive事件的响应来处理收到的数据。当接收缓冲中有rthreshold个字符时该事件产生并持续直到用input属性从接收缓冲区中删除数据。

首先,上位机向单片机发一个连接命令,下位机接到该命令后给一个表示确认的应答信号,于是实现双方握手。不管上位机是读取数据还是发送数据,在数据接收或发送之前都先发送一帧命令以确定是什么样的数据(这是在命令帧的功能码和参数中设定的)。

上位机读数据时,每隔一定时间向下位机发送一帧读数据命令,下位机接到此命令即把数据传上来,送到文本框中显示。上位机发送数据时,首先给下位机发一“写数据”命令帧,下位机接到命令后做好准备接收数据,然后上位机才发数据帧。

(1) “连接”命令按钮的鼠标单击事件

功能:设置mscomm控件的属性,参数,向下位机发送一个握手信号。

private sub command1_click() ‘发送连接命令

dim x(1) as byte

x(0)=246 ‘握手信号(十六进制为f6h)

mscomm1.inputlen=1 ‘从接收缓冲区读取1个字符

mscomm1.rthreshold=1‘接收缓冲区每收到指定个的字符都会使mscomm控件产生 ‘oncomm事件。

mscomm1.settings=“9600,n,8,1”‘波特率9600,

‘无奇偶校验,8个数据位,1个停止位

if mscomm1.portopen=false then

mscomm1.portopen=true‘判断通讯口1是否打开

end if

mscomm1.output=x

end sub

(2) “接收”命令按钮的鼠标单击事件

启动timer1,定时向下位机发送“读数据”命令帧,在timer1中加入发控制命令的程序,每接收一帧数据就会触发oncomm 的commevreceive事件。

private sub timer1_timer()

dim i as integer

dim cmdbuf(5) as byte

dim p as byte

cmdbuf(0)=99 ‘命令帧起始标志(十六进制为63h)

cmdbuf(1)=80 ‘功能码

cmdbuf(2)=16 ‘参数

cmdbuf(3)=0

for i=0 to 3

p=p+cmdbuf(i)

next

cmdbuf(4)=p ‘校验和为前四位数据的和

mscomm1.output=cmdbuf‘把数组送到输出缓冲区中

end sub

发送数据与接收数据程序大致相同,在发送命令按钮的click过程中首先加入发控制命令的程序,然后再发送数据帧。

(3) oncomm事件

接收缓冲区收到指定个数的字符后使mscomm控件产生oncomm事件。

private sub mscomm1_oncomm()

dim buf as variant

dim rdata() as byte

dim p as variant

if mscomm1。commevent=comevreceive then

buf=mscomm1.input

rdata = buf

text6.text = rdata(0)

select case rdata(0)

case 246  `下位机发来的连接确定命令

mscomm1.inputlen = 1

mscomm1.rthreshold = 1

case 100 `接收下位机数据

while mscomm1.inbuffercount < 12

wend

mscomm1.inputlen = 12

buf = mscomm1.input

end select

4 下位机程序设计

在我们所研制的系统中,上下位机的通信机制采用了类似主从式的协议,下位机(由89c52单片机控制)是从机,正常状态下,下位机执行内部的控制方案,当上位机需要与之通信时,下位机利用其中断响应上位机的通信要求,并进行相应的处理。下位机采用c51进行单片机程序设计。

在使用串口之前,应对其进行初始化,主要是设置产生波特率的定时器1、串行口控制和中断控制。具体步骤是:

(1) 确定定时器1的工作方式-编程tmod寄存器;

(2) 计算定时器1的初值-装载th1,tl1;

(3) 启动定时器-编程tcon中的tr1;

(4) 确定串行口的控制-编程scon;

void initial(void) /*串口初始化*/

{ tmod=0x20;

th1=0xfd;

pcon=0x00;

et1=0;

tr1=1;

scon=0x50;

主程序如下:

#include

void main()

{

void initial(void);

void timer1code(void);

void shakehand(void);

char readcmd(void);

void senddata(void);

char receivedata(void);

ri=0;

while(1)

{

if(commflag==0){shakehand();} /*握手信号*/

if(commflag==1)/*命令信号*/

{

if(readcmd()==1)/*读命令成功*/

{

switch(command[0])/*判断命令帧的功能码*/

{case 0x50:/*pc读数据*/

senddata();/*下位机把所需数 /*据发给上位机*/

break;

case 0x60:/*pc写数据*/

receivedata();/*下位机接收数据*/

break;

}

}

5 结束语

以上程序在系统实际运行中效果良好,通过串口通信协议,上位机能自由地读取单片机上的数据,也能按照命令帧中功能码和参数的不同设置发送不同格式的数据给单片机。上述程序具有较大的实用性,如果需要实现微机与微机,或微机与多个单片机的串行通信,只要根据原理将以上方法和程序稍加改动即可。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值