串口中断发送与接收

上传人:汽*** 文档编号:559034292 上传时间:2023-10-10 格式:DOCX 页数:5 大小:32.22KB
返回 下载 相关 举报
串口中断发送与接收_第1页
第1页 / 共5页
串口中断发送与接收_第2页
第2页 / 共5页
串口中断发送与接收_第3页
第3页 / 共5页
串口中断发送与接收_第4页
第4页 / 共5页
串口中断发送与接收_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《串口中断发送与接收》由会员分享,可在线阅读,更多相关《串口中断发送与接收(5页珍藏版)》请在金锄头文库上搜索。

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

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

3、0x03#define BEGIN0x04#define STOP0x05define NEXT 0x06新短信标志 读短信标志仪表数据开始读仪表数据结束读准备读短信内容#define NEXTBEGIN 0x07 开始读短信#define START0x08开始读发送短信的手机号码#define TRUE0x09准备读号码,也作为新短信读取后的标志#define FALSE0x0a没有新短信uchai xdata table_send140;发送缓存uchai SendLength=0;uchai xdata table_receive32;接收缓存uchai ReceiveLength=O

4、;uchai xdata table_dat 1001=MHello world?nM;数据存储uchai DatLength=O;uchai SendFlag=O;uchai ReadMaik=0;uchai ReadFlag;umt EndFlag=250:void init_senall();void send_listtable(uchar *list);void receive_listtable();数据长度标志发送状态标志读取串11数据记录的位置(书签)读串口标志计数250串I I初始化为方式1:9600,11,&1串口发送一个字符串串I缓存接收主程序void main()umt

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

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

7、tLength=O;while(ReadMark!=ReceiveLength) 进入读取串丨I缓存数据若缓存数据发生变化,则void serial IQ mtemipt 4 】f(RI)读位置标记卄计数复位形如读了在收到最后一个字符后数据输入,则认为本段数一组数据读取结束计数减1缓存16位,循坏存入table_datDatLength=table_ieceiveReadMaik; 将缓存数据读出table_datDatLength+1 =3;DatLengtli+;ReadMaik=+ReadMark&Ox 1 f;EndFlag=100;ReadFlag=BEGIN: if|;ReadFl

8、ag=BEGIN)if(EndFlag=O)打描100次若缓存未再有据传输完毕DatLength=O: ReadFlag=STOP;elseEndFlag-;串I 1数据读完(写完)1个数据后中断读串丨IRI=0; table_receiveReceiveLength=SBUF; ReceiveLengtli=+ReceiveLength &0x 1 f;else if(table_sendSendLength! =,n,) 写串 I ITI=O;SBUF=table_sendSendLength; SendLength-H-;/若识别到结束标志,则结束elseTI=O;SendFlag=STOP; SendLength=O;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号