资源描述:
《【原创】串行通信编程.pdf》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、1.引言在微机测控技术领域,串行通信以其控制简单、经济实用等特点得到了广泛的应用。编制一个好的串行通信程序就成了当务之急。为了能灵活的处理各种串行通信情况,需要熟悉各种编程技术、掌握各种编程技巧,从而针对各种操作系统编制适合现场的高效串行通信程序。2.串行通信基础串行通信是计算机和外设之间进行数据通信的主要方式之一,它适合传输距离比较短的情况。串行通信的传送方式有单工方式、半双工方式和全双工方式。它有两种基本的通信方式:异步通信和同步通信。不同的通信方式要有相应的通信协议才能保证有效的数据传输。计算机中管理串行通信IO控制的芯片是可
2、编程串行异步通信控制器8250,通过对8250的编程,可以控制串行数据传送数据格式和速度,它还可以与调制解调器配合进行远距离通信。8250发送或接收数据之前,必须先进行初始化,即对它的一些内部寄存器写入控制字,从而规定传输的波特率、数据格式、信号检测的要求、是否允许中断、采用何种校验方式等。通过读写8250的内部寄存器来实现对串行通信的控制。8250的10个内部寄存器的端口地址及读写情况如下。端口地址(COM1)端口地址(COM2)输入输出寄存器名称0x3f80x2f8输出发送保持寄存器(THR)0x3f80x2f8输入接收数据寄存
3、器(RBR)0x3f80x2f8输出波特率因子低字节LSB(DR)0x3f90x2f9输出波特率因子高字节MSB(DR)0x3f90x2f9输出中断允许寄存器(IER)0x3fa0x2fa输入中断标识寄存器(IIR)0x3fb0x2fb输出线路控制寄存器(LCR)0x3fc0x2fc输出MODEM控制寄存器(MCR)0x3fd0x2fd输入线路状态寄存器(LSR)0x3fe0x2fe输入NODEM状态寄存器(MSR)8250异步通信编程的一般步骤如下:1)设定通信的协议,如波特率、校验方式、数据格式、数据字节长度等;2)读取通信线路
4、的状态,判断是否允许通信;3)开始通信。在具体通信时,通信方式可能会采用查询、中断(包括硬中断和软终端)。以下介绍运用各种编程语言的串行通信编程。3.在DOS下实现串行通信DOS下编程可以用汇编语言或者C。PC机的中断调用利用BIOS的14h中断功能,它可以实现串行口初始化,发送数据字符、接收数据字符和读取串行口状态。在调用BIOS串行口通信管理程序进行发送或接收时,只是返回部分串口的状态信息,多数情况下,出口参数AH中含有串口线路状态寄存器中的信息,该出口参数的第7位为超时标志。另一个入口参数DX是串口号。中断调用号AH功能ALD
5、X00H初始化串行口初始化参数代码01H向通信口写一个字符待写入的字符0:COM102H从通信口读一个字符待读取的字符1:COM203H读取串行口状态在实际应用中,可通过BIOS的其他调用,如10h(显示操作),13h(磁盘操作),16h(键盘操作)等来实现读取键盘输入或磁盘读取和屏幕显示或磁盘写入。另外,也可以用DOS功能调用21h来实现,但是通过DOS访问串口不是一个好办法,因为它对端口的状态不提供反馈信息,只是对端口盲目的读写,所以一般不采用在TC中也可以实现对BIOS的调用,同时辅以查询或中断等异步技巧达到好的接受效果。RE
6、GS的定义格式如下:UnionREGS{structWORDREGSx;structBYTEREGSh;}其中,结构WORDRESG和BYTEREGS定义如下:structWORDREGS{unsignedintax,bx,cx,dx,si,di,cflag,flags;};structBYTEREGS{unsignedcharal,ah,bl,bh,cl,ch,dl,dh;};中断调用函数为int86(intnum,unionREGS*in_regs,unionREGS*out_regs)其中各个参数含义如下所示:num:调用的中
7、断号;in_regs:调用中断前CPU的各寄存器的入口值;out_regs:中断返回后CPU的各寄存器的出口值;实例:1)初始化unionREGSr;r.x.dx.=port;r.h.ah=0;r.h.al=ctrlword;int86(0x14,&r,&r);2)字符发送unionREGSr;r.x.dx.=port;r.h.ah=1;r.h.al=ch;int86(0x14,&r,&r);3)字符接收unionREGSr;r.x.dx.=port;r.h.ah=2;int86(0x14,&r,&r);ch=r.h.al;4)状态
8、检测unionREGSr;unsignedcharstatus;r.x.dx.=port;r.h.al=ctrlword;int86(0x14,&r,&r);status=r.h.ah;利用C++提供的端口操作函数,例如在TurboC