串口中断发送与接收_第1页
串口中断发送与接收_第2页
串口中断发送与接收_第3页
串口中断发送与接收_第4页
串口中断发送与接收_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

1、串口中断接收与发送以前一直写串II程序都是发送一个字符,然后等待TI=1时再发另一个字符,觉得这样很浪 费时间,因为在波特率为9600时,每发一个字符差不多要1ms的时间:接收则接收一个字 符即存入数组,直到有结束标志出现,后来发现这种做法很局限,因为在与一些串II设备通 讯时,返回的数据很雅以最后一个字符为结束标志符。于是现在重新变换了一下串口发送(接收)的思路:发送:中断只管发送,程序把要发送的数组写入缓存然后触发发送信号,剩下的则由中断处 理,当识别到结束标志时,发送完毕,及置位发送完毕标志。接收:中断只管接收并存入缓存,程序每循环一次则检测一次缓存是否有数据变化,若有则 读缓存,若无则

2、跳过。在读完最后一个缓存字符之后若n (设n=100)次循环检测缓存再无 变化,则认为一组数据发送完毕。程序流程图如下所示:读取缓存计数复位计数减1接收完毕数据处理其他程序于是写了如下程序。,* *:$:*;$:*:$:*:$:* * *:*串I中断接收(发送)数据单片机接收完一组数据后将其再从串11发回串I测试直接可运行#iiiclude#inc lude#mclude#define uchai unsigned char#define umt unsigned mtsbit Rxd=PlA0;sbit Txd=PlAl;接收脚(模拟串I I)发送脚0 x010 x020 x030 x040

3、 x05#define RSTdefine NEW#define CMGR#define BEGINdefine STOP#define NEXT 0 x06#define NEXTBEGIN 0 x07#define START#define TRUE#define FALSE0 x080 x090 x0a新短信标志读短信标志仪表数据开始读仪表数据结束读/准备读短信内容开始读短信开始读发送短信的手机号码准备读号码,也作为新短信读取后的标志没有新短信数据存储数据长度标志发送状态标志读取串11数据记录的位置(书签)/读串I标志计数250void iniCsenallQ;void send_lis

4、ttable(ucharvoid receive_listtable();uchai xdata table_send140;发送缓存uchai SendLength=O;uchai xdata table_receive32;接收缓存uchai ReceiveLength=O;uchai xdata table_dat 100=MHello world ?nM;uchai DatLength=O;uchai SendFlag=O;uchai ReadMaik=0;uchai ReadFlag;umt EndFlag=250:串I I初始化为方式1:9600,n,8,1串I发送一个字符串串I缓

5、存接收主程序umtj=1000;while(j-);开启程序时先等待一会(一直还没明白为什串I I初始化先试发一串数据么要这样,不然下完程序后第一次发送出错)init_seiiall();send_listtable(table_dat);while(l)receiveJisttableQ;if(ReadFlag=STOP)读缓存读取完一组数据ReadFlag=RST;sendjisttable(table_dat);将读取的数据发回串I 1(调试用)void init_senallQSendFlag=STOP;ReadFlag=RST;TMOD|=0X20;TH1=OXFD;TL1=OXFD

6、:SM0=0;开启串I I收发设置波特率9600SM1=1;REN=1;RI=0;TI=0;TR1=1;ES=1;EA=1;方式1, 10位异步收发数据接收允许void send_listtable(uchar *list) 并触发发送uchar lislength=O;iRSendFlagSTOP)do串I I发送程序,将list数据存入缓存,数据发送完标志table_sendlislength=listlislength;)while(listlislength+?=,n,);/结束标志SendFlag=BEGIN;发送开始标志,且标志着发送没有结束TI=1;)void receive_l

7、isttable()读取串口缓存数据/DatLength=O;while(ReadMark!=ReceiveLength)进入若缓存数据发生变化,则table_datDatLength=table_receiveReadMaik; 将缓存数据读出 table_datDatLength+ DatLengtli+;ReadMaik=+ReadMark&Ox 1 f;EndFlag=100;ReadFlag=BEGIN;ifReadFlag=BEGIN)读位置标记计数复位形如读了if(EndFlag=O)扫描100次若缓存未再有在收到最后一个字符后数据输入,则认为本段数据传输完毕DatLength=O:ReadFlag=STOP;一组数据读取结束) elseEndFlag-;计数减1void serial IQ mtemipt 4串I 1数据读完(写完)1个数据后中断读串IRI=0;table_receiveReceiveLength=SBUF;缓存16位,循环存入ReceiveLengtli=+ReceiveLength&Ox 1 f;)else if(table_send

温馨提示

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

评论

0/150

提交评论