ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:46.02KB ,
资源ID:15849757      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/15849757.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(一种VB和单片机进行串行通信的可靠协议Word格式文档下载.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

一种VB和单片机进行串行通信的可靠协议Word格式文档下载.docx

1、如果在给定时间内(100MS)计算机不回,则重发。如果连发三次都失败,则转向错误处理。B、 数据帧定义:起始标志数据长度数据校验位0X55(U)由函数的参数N决定每帧不能超过128个字节数据和校验 说明:起始标志也可以作为标志位使用。例如:如果单片机要求计算机发送数据,则可以以0X56为起始标志,数据长度设为1,数据任填。C、 应答帧:计算机每收到一个完整而正确的帧,就给单片机连发两个0X63(c)。单片机收到任意一个即可认为应答成功。此设计主要是防止应答数据丢失或错误。D、 错误处理:如果任何一帧接收不成功,则向单片机发0xEE表示接收错误并要求重发。同时,VB记录错误原因,以便编程者分析。

2、如果单片机连发三次都不成功,则指出错误原因。VB的接收错误有:握手错误、数据帧的起始帧错误、数据帧的校验帧错误。单片机的发送错误有:握手失败、数据传输失败。二、 单片机的软件设计近一两年来单片机的C语言已经成为单片机编程的主要工具。KeilC软件产生的代码长度以比的上中等程序员用汇编的水平。而开发速度,软件质量和可从用方面,则远远超过了汇编。因而软件部分用C51编写。 为了使协议较为清晰,笔者用流程图将计算机和单片机端的流程图画出,而具体的程序实现有兴趣着可参考后附的程序(程序实现以下例子的功能及信息出错的统计)。(左图为单片机主程序,右图为握手函数)例程:单片机发送30H到50H的内存内容给

3、计算机并由计算机统计传输次数、检测出错原因及次数。A、SMAIN模块是主程序模块,主要进行内存的初始化、握手和数据传送。传送成功后能显示。B、SFUNCTION模块是函数模块,包括init_s(串口初始化),void int_t0(void) interrupt 1( 定时中断),bit Ack()(握手应答),void Send_Data( char data *Adrress,unsigned char n)(任意长度的内存数据发送)C、OnError(char ErrorN)通信错误处理模块,主要功能是指出通信错误类型并强制停机。(源程序及注解附后)(此图为应答函数流程)三、 VB的软件

4、设计 使用微软的VisualBasic6.0(简称VB6)来开发串口通信应用软件十分方便,编程工作量相对较小,只需进行主要应用功能的编程和少量界面控制的编程。其中MSCOMM.OCX即是用于串行通信的控件。常用的收发数据的方法有ONCOMM事件法、轮询法。理论上讲,ONCOMM事件较为方便,可任意设置触发事件,字符串长度。可设置Rthreshold=0使VB在一有数据时就触发ONCOMM事件。但实际上,由于WINDOWS是多任务系统,很难获得精确的定时,因而也很容易漏掉数据包。另外,对于变长的帧数据传输,ONCOMM事件也不太合适。因而笔者采用轮询的方法,借助数据帧的先验知识,一直等待并对接收

5、的数据进行校验。如果校验错误则要求重发。模块说明:A、 Function WaitRecieveByte() As Byte 查询法等待数据模块B、 Private Sub Form_Load() 初始化模块C、 Private Sub SendBuff(buff() As Byte) 查询发发送数据模块D、 Private Sub CommBegin_Click() 整帧接收并校验模块四、 通信的可靠性分析 对于串行通信而言,程序的可靠性是由协议保证的。通信的可靠性主要体现在所使用通信协议的可靠性上。本通信协议的可靠性主要有以下考虑:(1) 通信之前先握手。通过握手的方式可以判断硬件是否正常

6、,计算机是否处于等待状态。每次握手之间等待一段时间,以确保计算机状态。并且连发三次,既可以给计算机一点反映时间,又可防止丢包。(单片机发给计算机的握手信号丢)(2) 数据传输使用帧的方式。这样整帧数据决不可能全部丢失。校验字将整帧信号进行和校验则使误收的可能很小。如果还不放心,则可采用CRC校验,极为可靠。(3) 帧方式通过帧方式判断帧头起始字符来决定一帧的开始这样就避免了部分数据进入到内部数据处理之中,这使数据处理错误的可能性又减少1/256,并可防止其他串行数据和要求数据混淆。(4) 应答采用连发两次0X63,即使丢包一次也不影响程序运行。当然,如果两个包同时都丢,则单片机可能死机。但这种

7、情况实在是太少了。可以采用硬件看门购狗的方式解决。而且即使是在强干扰环境,对于单片机接收而言,一般也只是数据传输错误,很少丢包。(5) 单片机和VB程序都给出了详细的错误处理程序,很容易定位通信错误原因,并有针对性地修改协议。结束语:本文提出了一种单片机和微机串行通信时一种较为可靠的协议,并对此协议的可靠性进行了分析。正文后所附程序正是为检验此协议的可靠性而设计的。实践证明,一个好的通信协议会使单片机产品的可靠性大为提高。 参考文献:史斌星 史佳 Visual Basic 贯通教程 清华大学出版社 马忠梅等 单片机的C语言应用程序设计北京航空航天出版社附1:单片机程序A、SMAIN模块#inc

8、ludestdio.h/*-全局变量-*/char ErrorNum=0;/*ErrorNum 出错时错误代码*/*-函数原型-*/ extern void init_s(void); extern void init_t0(void); /*内存填充函数*/ extern void init_m(char data *Adress,unsigned char n); extern bit hd2hd();/握手函数 extern void Send_Data( char data *Adrress,unsigned char n);/发送数据 extern bit Ack();/应答函数 e

9、xtern void OnError(char ErrorN);/错误处理/*-*/ void main(void) char data *da_point; char data *data_add; init_s();/*s串行通信初始化*/ da_point=0x30;/*从30H开始初始化内存*/ init_m(da_point,35);/*Memory format program*/ init_t0(); if (hd2hd()=0) /*握手*/ ErrorNum=1; OnError(ErrorNum); /*将30H开始地内存内容发送出去 */ data_add=0x30; d

10、o Send_Data(data_add,30); while(Ack()=0); /- TI=1; printf(Send sucess!n); TI=0;B、SFUNCTION模块#include #define true unsigned char 1#define false unsigned char 0#define COUNT 10/*延时常数 10*COUNT ms*/*-*/*全局变量*/bit flag_t=0;/*-*/*串行通信初始化*/void init_s(void) TMOD=0X20; TH1=0XE8; TL1=0XE8; PCON=0X00; /*SMOD=

11、0;*/ SCON=0X50;/*方式1且允许接收*/ TR1=1;/*Memory format function*/void init_m(char data *Address,unsigned char n) unsigned char i=0; Address=0x30; for (i=0;in;i+) *Address=0x55; Address+;/*TIMER0 初始化*/void init_t0(void) TMOD=TMOD|0X21;/*IT IS NOT A gerneral line*/ TH0=0xdc;/*10MS interrupt delay*/ TL0=0x0

12、0; EA=1; ET0=0;/*enable it if want to work*! TR0=0;/*-interrupt program-*/void int_t0(void) interrupt 1 static unsigned char n=0; n+=1;/*not best*/ if (n=COUNT) flag_t=1; n=0; /-/*应答*/bit Ack() unsigned char i,j; while (RI=0);RI=0; i=SBUF; ET0=1;/-! TR0=1; while (RI=0&flag_t=0);/*wait*/ /- restore flag RI=0; flag_t=0; j=SBUF;/- if(

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

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