串口中断发送与接收.doc

串口中断发送与接收.doc

ID:28358246

大小:25.50 KB

页数:6页

时间:2018-12-09

串口中断发送与接收.doc_第1页
串口中断发送与接收.doc_第2页
串口中断发送与接收.doc_第3页
串口中断发送与接收.doc_第4页
串口中断发送与接收.doc_第5页
资源描述:

《串口中断发送与接收.doc》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

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

2、一次则检测一次缓存是否有数据变化,若有则读缓存,若无则跳过。在读完最后一个缓存字符之后若n(设n=100)次循环检测缓存再无变化,则认为一组数据发送完毕。程序流程图如下所示:开始读取缓存缓存变化?计数复位其他程序数据处理计数减1接收完毕计数=0?YNNY变化过?YN于是写了如下程序。/************************************************串口中断接收(发送)数据单片机接收完一组数据后将其再从串口发回串口测试直接可运行***********************************

3、*************/#include#include#include#defineucharunsignedchar#defineuintunsignedintsbitRxd=P1^0;//接收脚(模拟串口)sbitTxd=P1^1;//发送脚#defineRST0x01#defineNEW0x02//新短信标志#defineCMGR0x03//读短信标志#defineBEGIN0x04//仪表数据开始读#defineSTOP0x05//仪表数据结束读#def

4、ineNEXT0x06//准备读短信内容#defineNEXTBEGIN0x07//开始读短信#defineSTART0x08//开始读发送短信的手机号码#defineTRUE0x09//准备读号码,也作为新短信读取后的标志#defineFALSE0x0a//没有新短信ucharxdatatable_send[140];//发送缓存ucharSendLength=0;ucharxdatatable_receive[32];//接收缓存ucharReceiveLength=0;ucharxdatatable_dat[100]="

5、Helloworld!";//数据存储ucharDatLength=0;//数据长度标志ucharSendFlag=0;//发送状态标志ucharReadMark=0;//读取串口数据记录的位置(书签)ucharReadFlag;//读串口标志uintEndFlag=250;//计数250voidinit_serial1();//串口初始化为方式1:9600,n,8,1voidsend_listtable(uchar*list);//串口发送一个字符串voidreceive_listtable();//串口缓存接收void

6、main()//主程序{uintj=1000;while(j--);//开启程序时先等待一会(一直还没明白为什么要这样,不然下完程序后第一次发送出错)init_serial1();//串口初始化send_listtable(table_dat);//先试发一串数据while(1){receive_listtable();//读缓存if(ReadFlag==STOP)//读取完一组数据{ReadFlag=RST;send_listtable(table_dat);//将读取的数据发回串口(调试用)}}}voidinit_seri

7、al1(){SendFlag=STOP;ReadFlag=RST;TMOD

8、=0X20;//开启串口收发设置TH1=0XFD;//波特率9600TL1=0XFD;SM0=0;SM1=1;//方式1,10位异步收发REN=1;//数据接收允许RI=0;TI=0;TR1=1;ES=1;EA=1;}voidsend_listtable(uchar*list)//串口发送程序,将list数据存入缓存,并触发发送{ucharlislength=0;if(SendFlag==STOP)//数据发送完标志{do{table_send[lis

9、length]=list[lislength];}while(list[lislength++]!='');//结束标志SendFlag=BEGIN;//发送开始标志,且标志着发送没有结束TI=1;}}voidreceive_listtable()//读取串口缓存数据{/

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。