串口中断发送与接收.doc_第1页
串口中断发送与接收.doc_第2页
串口中断发送与接收.doc_第3页
串口中断发送与接收.doc_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

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

文档简介

串口中断接收与发送以前一直写串口程序都是发送一个字符,然后等待TI=1时再发另一个字符,觉得这样很浪费时间,因为在波特率为9600时,每发一个字符差不多要1ms的时间;接收则接收一个字符即存入数组,直到有结束标志出现,后来发现这种做法很局限,因为在与一些串口设备通讯时,返回的数据很难以最后一个字符为结束标志符。于是现在重新变换了一下串口发送(接收)的思路:发送:中断只管发送,程序把要发送的数组写入缓存然后触发发送信号,剩下的则由中断处理,当识别到结束标志时,发送完毕,及置位发送完毕标志。接收:中断只管接收并存入缓存,程序每循环一次则检测一次缓存是否有数据变化,若有则读缓存,若无则跳过。在读完最后一个缓存字符之后若n(设n=100)次循环检测缓存再无变化,则认为一组数据发送完毕。程序流程图如下所示:开始读取缓存缓存变化?计数复位其他程序数据处理计数减1接收完毕计数=0?YNNY变化过?YN于是写了如下程序。/*串口中断接收(发送)数据单片机接收完一组数据后将其再从串口发回串口测试直接可运行*/#include#include#include#define uchar unsigned char#define uint unsigned intsbit Rxd=P10;/接收脚(模拟串口)sbit Txd=P11;/发送脚#define RST0x01#define NEW0x02/新短信标志#define CMGR0x03/读短信标志#define BEGIN 0x04/仪表数据开始读#define STOP 0x05/仪表数据结束读#define NEXT0x06/准备读短信内容#define NEXTBEGIN0x07/开始读短信#define START0x08/开始读发送短信的手机号码#define TRUE0x09/准备读号码,也作为新短信读取后的标志#define FALSE0x0a/没有新短信uchar xdata table_send140;/发送缓存uchar SendLength=0;uchar xdata table_receive32;/接收缓存uchar ReceiveLength=0;uchar xdata table_dat100=Hello world!n;/数据存储uchar DatLength=0;/数据长度标志uchar SendFlag=0;/发送状态标志uchar ReadMark=0;/读取串口数据记录的位置(书签)uchar ReadFlag;/读串口标志uint EndFlag=250;/计数250void init_serial1();/串口初始化为方式1:9600,n,8,1void send_listtable(uchar *list);/串口发送一个字符串void receive_listtable();/串口缓存接收void main()/主程序uint j=1000;while(j-);/开启程序时先等待一会(一直还没明白为什么要这样,不然下完程序后第一次发送出错)init_serial1();/串口初始化send_listtable(table_dat);/先试发一串数据while(1)receive_listtable();/读缓存if(ReadFlag=STOP)/读取完一组数据ReadFlag=RST;send_listtable(table_dat);/将读取的数据发回串口(调试用)void init_serial1()SendFlag=STOP;ReadFlag=RST;TMOD|=0X20;/开启串口收发设置TH1=0XFD;/波特率9600TL1=0XFD;SM0=0;SM1=1;/方式1,10位异步收发REN=1;/数据接收允许RI=0;TI=0;TR1=1;ES=1;EA=1;void send_listtable(uchar *list)/串口发送程序,将list数据存入缓存,并触发发送uchar lislength=0;if(SendFlag=STOP)/数据发送完标志dotable_sendlislength=listlislength;while(listlislength+!=n);/结束标志SendFlag=BEGIN;/发送开始标志,且标志着发送没有结束TI=1;void receive_listtable()/读取串口缓存数据/DatLength=0;while(ReadMark!=ReceiveLength)/若缓存数据发生变化,则进入table_datDatLength=table_receiveReadMark;/将缓存数据读出table_datDatLength+1=n;DatLength+;ReadMark=+ReadMark&0x1f;/读位置标记+EndFlag=100;/计数复位ReadFlag=BEGIN;/形如读了if(ReadFlag=BEGIN)if(EndFlag=0)/在收到最后一个字符后扫描100次若缓存未再有/数据输入,则认为本段数据传输完毕DatLength=0;ReadFlag=STOP;/一组数据读取结束elseEndFlag-;/计数减1void serial1() interrupt 4/串口数据读完(写完)1个数据后中断if(RI)/读串口RI=0;table_receiveReceiveLength=SBUF;ReceiveLength=+ReceiveLength&0x1f;/缓存16位,循环存入else if

温馨提示

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

最新文档

评论

0/150

提交评论