代码规范性书写_第1页
代码规范性书写_第2页
代码规范性书写_第3页
代码规范性书写_第4页
代码规范性书写_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

串口通讯

代码规范性书写

电子组代码规范性书写1.首先最基本的。写出的代码要有层次感,让他们看时不会太费力,思路清晰即可,并且尽可能少滴出现编写错误。2.了解一些编译常见问题处理。3.STC89与STC12程序之间移植的注意项。了解主要不同点与相同点。【硬件实现与CPU实现区别】4.代码结构规整,思路清晰。。一个好的思路等于解决了一大半工作量voidDelay1ms() { unsignedchari,j; _nop_(); _nop_(); _nop_(); i=11; j=190; do { while(--j); }while(--i);}//STC12voidDelay1ms() { unsignedchari,j; _nop_(); i=2; j=199; do { while(--j); }while(--i);}//STC89延时函数的问题【寄存器,定时器,串口,CPU实现和定时器】振荡(时钟)周期,机器周期,指令周期三者不同STC12默认是1T模式,STC89默认是12T模式为什么STC官网说只能快6~7倍

//AUXR&=0x7F;

TMOD&=0xF0;

TMOD|=0x01;

TL0=0xA4;

TH0=0xFF;

TF0=0;

TR0=1; 上面关于延时函数的不同,但是下面的的定时器初始化函数同样与时间有关,但是在移植时却不需要更改。一般通讯格式与稳定性上位机与下位机的通信上位机是指可以直接发出操控命令的计算机,一般是,屏幕上显示各种信号变化。下位机是直接控制设备获取设备状况的计算机,一般是单片机、PLC等。上位机发出的命令首先给下位机,下位机再根据此命令解释成相应时序信号直接控制相应设备。下位机不时读取设备状态数据(一般为模拟量),转换成数字信号反馈给上位机。在通讯过程中,下位机上位机都需要一个共同的通讯协议负责信息交流,并提高稳定性。【上位机与下位机通讯具体过程】(最普通)常用到的通讯格式为帧头(包头/开始标志位)+数据包+帧尾(包尾/结束标志位)简单的设计解决了许多问题1.上位机、下位机都需要明确到底哪些才是自己需要接受的数据。2.不同的帧头帧尾可以对数据包内容进行分类接受(此功能也可在数据包内实现)3.方便上位机与下位机编程。帧头帧尾提供了通讯开始与通讯结束的两个标志位。可控制内容输入、输出。在数据包发送数据时常用两种形式1.使用十六进制格式发送——优势:最短数据长度包含最多的信息。且单片机不用进行或进行简单解析(不一定,有时解析难度还是较大)。缺点:调试不太方便,直观性不强。2.使用十进制格式发送——优劣与上十六进制格式正好相反。如:如果发送一个值为100的数据。

你可以发送一个0x64进行传输。也可以发送0x310x300x30单片机接收到时进行解析数据包的常用简单结构目前简单数据包应用的格式有1.以固定长度进行识别如:类似S40034D格式假如我们按照一个约定数据包内第一个数据为2位,第2个数据为3位。(上位机与下位机已经约定好的)则数据包信息为4034。。如果我们发送信息为11时就要发送S01001D2.以特殊字符作为数据分割点进行识别如:类似上面S40034D格式4034数字我们可以用字母将数据分割为即发送S40A34D。若发送11数字就可以发送S1A1D两种通讯格式各有优略,各自按照自己的习惯和具体通讯数据类型进行选择第一种数据处理方便,长度固定,但可能耗费较多资源。第二种需要分配空间,动态长度存储,需要算法进行解析处理。关于串口发送和接收函数的纠结纠结1:到底在发送的时候需不需要关闭串口中断(ES=0)纠结2:为什么串口自己写,少了一点点差别为什么很大串口的发送和接受方式有两种方法:中断法、轮询法(不用中断)首先,明确,串口接受数据、发送数据时是不需要CPU参与具体时序过程(不同于CPU模拟的IIC通讯,需要CPU模拟)的,是由定时器与串行口等硬件共同协助工作的。当CPU置于SBUF=A语句时,就相当于通知串口硬件工作并把A的八位的ASCII码值一位一位滴发送出去。发送结束后有TI置1作为发送结束的中断请求。当上位机发送数据过来时,CPU是并不知道这件事的,等到一个字节接收完毕后,由硬件将RI置1,通知CPU有一字节数据到来,并已经存至SBUF中可以取走。

RI、TI都是由硬件置1,由软件清零的。#include“STC12C5A60S2.H“//忽略串口初始化程序unsignedcharbuf,rec_flag=0;statick=0;voidmain(){ Init_USRT(); while(1) { if(rec_flag==1) { rec_flag=0; SBUF=buf+k; } }}voidserial_ser()interrupt4{

if(TI)//发送中断服务函数 { TI=0;

k++; } if(RI)//接受中断服务函数 { RI=0;

buf=SBUF; rec_flag=1; }}RITI触发的中断进行处理。想想问什么接收数据时常用中断法,发送数据时常用轮询等待法。while(!TI);TI=0;SBUF=0x0d;/*outputCR*/}if(RI){if(SBUF==XOFF){do{RI=0;while(!RI);}while(SBUF!=XON);RI=0;}}

while(!TI);TI=0;return(SBUF=c);}Printf()函数的内部实现是由putchar实现#include<reg51.h>#defineXON0x11#defineXOFF0x13/**putchar(fullversion):expands'\n'intoCRLFandhandles*XON/XOFF(Ctrl+S/Ctrl+Q)protocol*/charputchar(charc){if(c=='\n'){if(RI){if(SBUF==XOFF){do{RI=0;while(!RI);}while(SBUF!=XON);RI=0;}}为什么printf()函数不能用中断清零的方式进行。而且在使用前将TI置1.

一般来说,串口发送部分都是如同你的程序所示(使用轮询法进行书写),不进入中断,通过判断TI来判断是否需要发送下一个字节,发送结束后一定要将TI软件清0,否则会干扰后续的逻辑。(可以试一试,如果没有清零且串口使能打开的情况下,后续程序就像速度减慢了许多倍一样【不断进入串口中断】)如果已打开了串口中断,还必须把串口中断关闭,等全部发送完以后再打开串口中断,避

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论