基于C语言的RS232串行接口通信设计与实现_第1页
免费预览已结束,剩余1页可下载查看

下载本文档

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

文档简介

1、基于c语言的rs232串行接口通信设计与实现 图2数据通信的流程图 2.2.2 c语言函数详细实现串口通信软件过程 因为i/o串行通信口的速度远远低于cpu的速度,在查询工作方式时,cpu长时光处于等待状态,其效率十分低,不利于cpu的资源利用。解决这一冲突的有效方法是实行中断的通信方式,即当通信口自身预备就绪时,主动提出中断申请,一旦cpu响应此申请,便暂停执行的工作,转向中断服务子程序,与外设举行数据的交换,数据交换完成后返回到主程序中的断点继续执行未完成的任务,这样就避开了cpu资源的铺张。为此必需对异步通信适配器以及中断控制器举行控制。作为系统的外设,异步通信适配器和中断控制器都有其对

2、应的i/o口地址,所以本文采纳c语言函数库中的寻址函数outportb()和函数inportb()对上述芯片举行挺直读写操作。其控制包括对中断控制器地址的编程,允许irq3,irq4中断,同时置modem控制寄存器地址为有效,这样即可实现中断方式的通信。按照图2的串口通信流程图,其详细实现串口通信的过程如下:1)初始化串口函数。参数解释:comportaddr 串口端口地址(coml口是03f8h com2口是02f8h)intvectnum 中断处理号(普通挑选0x0b)baud 波特率data 数据位stop 停止位parity 奇偶校验位void init-com(int comport

3、addr,unsigned char intvectnum,im baud,unsigned char data,unsigned char stop,unsigned char parity)unsigned char high,low;int portaddr=comportaddr;intvectnum=intvectnum;charslnbuf=0;circln=0;circout=0;/*set baud rate设置波特率*/f=(baud/100):f=1152/t;high=f/256;low=f-high*256;outportb(comportaddr+3,0x8

4、0);outportb(comportaddr,low);outportb(comportaddr+l,high);/*set data bits,stop bits,and parity设置数据位。停止位。校验*/data=(data-5)|(stop-1)*4);if(parity=2)data=data|0x18;else if(parity=1)data=data|0x8;outportb(comportaddr+3,data);/*set mcr(dtr,rts=0,outl,out2=1)设置modem控制位*/outportb(comportaddr+4,0xob);/*set

5、input data ready interrupt mode设置输入数据中断模式*/outportb(comportaddr+1,ox01);/*set oc interrupt vector设置中断源*/disable ();oldasyncint=getvect(intvectnum);setvect(imvectnum,asyncint);enable ();/*open interrupt打开中断*/maskb=inp(port8259+1);if(intvectnum一0x0c)outport(port8259+1,maskb&oxef);/*int4*/else outp

6、ort(port8259+1,maskb&0xf7);/*int3*/2)握手信号控制。该函数引入递归调用的方式,很好的解决了以往串口通信过程中,在握手信号方面挑选发送指定特定字符(例如“样”)所带来的误传送问题,大大提高了串口通信的胜利率。void wait(char ch)if(receivechar(com232)=ch)return;/确定对方已经胜利接受或者发送,就返回空elsesendchar(ch);/把接受或者发送出去的字符重新发送;wait(ch); /递归调用,直到对方确定接受或者发送胜利为止;)3)向串行口发送一个字符该函数的思想是先申请占有中断,后举行发送数据通

7、信;int sendchar(unsigned char char)doprintf(“send waiting>>>>>>>>>n”):/在屏幕上提醒用户正在等待中断举行。while(inportb(comportaddr+5)&0x20)=o);/检查发送端数据线是否预备好outportb(comportaddr,char:/发送数据到缓冲区return(char);/返回发送完成的字符4)从串行口接受一个字符该函数的思想是先取得中断控制,后面举行接收数据通信;int receivechar(int port)doprintf(

8、“receive waiting>>>>>>>>n”);在屏幕上提醒用户正在等待中断举行。while(inportb(eomportaddr+5)&0x01)=0);/检查接收端数据线是否预备好return(inportb(pont);/从接收数据缓冲区取数据3 实例在企业产品测试平台和嵌入式控制系统之间,商定通信双方的协议相同,首先嵌入式emb主控机通过串el把控制消息发送给产品测试平台,让产品测试平台按照发送来的命令举行相关操作:同时在产品测试平台上的测试结果信息,测试每个单项目的相关信息也通过串口传输数据到嵌入式emb主控机;嵌入式emb主控机把测试相关的有效信息举行收拾后,

温馨提示

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

评论

0/150

提交评论