c 语言中对串口操作的函数,基于C语言编程实现串口通讯接口的设计和应用分析…

前言

1 RS232串行接口

1.1 RS232接口简介

RS232串行接口属于个人计算机(PC)及电信应用领域中最为成功的串行数据标准。它被定义为一种在低速率串行通信中增加通信距离的单端标准,是目前PC机与通信工业中应用最广泛的一种串行接口嗍。现在的Pc机一般至少有两个串行口COMI和COM2.新一代的汁算机主要以9引脚的D型接头接出所有的RS232通信信 及控制线(有的计算机的COM2仍为25引脚)。

1.2 RS232串口引脚说明(见表1)

表1引脚缩写功能说明

2 C语言串口通信软件实现

2.1测试中的硬件设备。

2.1.1单机测试方式

如果单机仅仅拥有一个RS232串口,可将RS232连接线的第2引脚(RD)与第3引脚(TD)短路,那么由第3引脚的输出信 就会被发送到第2引脚而送到同一串行端}1的输入缓冲区,即可将数据读入,进入测试过程。

如果单机拥有COMl和COM2口两个RS232串口,那么请选择1 3节表2中的串口连接方式,进入测试过程。

2.1.2近距离两台设备通信测试方式

如果要在两台PC计算机之间,一台嵌入式系统主控机和一台PC计算机之间,或者上位机和下位机之间进行串口通信,那么请选择1.3节表2中的RS232串口方式连接两台设备,进入测试过程。

2.1.3远距离两台通信测试方式

RS232标准规定,若不使用Modem,在码元畸变小于4%的情况下,Dte和DCE通信两端之间最大传输距离为15 m.若距离较远,须附加调制解调器(Modem)。其连接方式如图1所示。

图2数据通信的流程图

2.2.2 C语言函数具体实现串口通信软件过程

1)初始化串口函数。

参数说明:

ComPortAddr 串口端口地址(coMl口是03F8H COM2口是02F8H)

IntVectNum 中断处理 (一般选择0X0b)

Baud 波特率

Data 数据位

STop 停止位

Parity 奇偶校验位

void Init-COM(int ComPortAddr,unsigned char IntVectNum,im Baud,unsigned char Data,unsigned char Stop,unsigned char Parity)

{

unsigned char High,Low;

int f.

comportaddr=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,0x80);

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 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 outport(Port8259+1,maskb&0xf7);/*INT3*/

}

2)握手信 控制。

该函数引入递归调用的方式,很好的解决了以往串口通信过程中,在握手信 方面选择发送指定特定字符(例如“样”)所带来的误传送问题,大大提高了串口通信的成功率。

void wait(char ch)

{

if(ReceiveChar(COM232)==ch)return;//确定对方已经成功接受或者发送,就返回空

else

{

SendChar(ch);//把接受或者发送出去的字符重新发送;

wait(ch); //递归调用,直到对方确定接受或者发送成功为止;

)

)

3)向串行口发送一个字符

该函数的思想是先申请占有中断,后进行发送数据通信;

int SendChar(unsigned char Char)

{

do

{

printf(“send waiting》》》》》》》》》n”):

//在屏幕上提示用户正在等待中断进行。

}while((inportb(comportaddr+5)&0x20)==O);//检查发送端数据线是否准备好

outportb(comportaddr,Char://发送数据到缓冲区

return(Char);//返回发送完成的字符

}

4)从串行口接受一个字符

该函数的思想是先取得中断控制,后面进行接收数据通信;

int ReceiveChar(int port)

{

do{

printf(“receive waiting》》》》》》》》n”);

∥在屏幕上提示用户正在等待中断进行。

}

while((inportb(eomportaddr+5)&0x01)==0);//检查接收端数据线是否准备好

return(inportb(pONt);//从接收数据缓冲区取数据

}

3 实例

在企业产品测试平台和嵌入式控制系统之间,约定通信双方的协议相同,首先嵌入式EMB主控机通过串El把控制消息发送给产品测试平台,让产品测试平台根据发送来的指令进行相关操作:同时在产品测试平台上的测试结果信息,测试每个单项目的相关信息也通过串口传输数据到嵌入式EMB主控机;嵌入式EMB主控机把测试相关的有效信息进行整理后,通过 络上传到Server,Server把企业所有生产线的嵌入式EMB主控机发送来的信息进行整理和分析,在企业资源管理系统ERP上共享,让企业的高级管理人员实时监视企业生产的进行情况,大大提高企业的办公效率,其整体工作原理图如图3所示。

373b1b53d914fd2796b691b11631cbac.png

图3企业生产整体工作原理图

4结论

文章知识点与官方知识档案匹配,可进一步学习相关知识C技能树函数与程序结构函数的声明与定义113983 人正在系统学习中 相关资源:GLONASS卫星位置计算与程序实现_葛奎_glonass_卫星位置__matlab…

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年4月15日
下一篇 2021年4月15日

相关推荐