当前位置:主页 > 行业产品 >

如何采用串口通信的连接方式和C语言编程实现串

发布时间:19-09-28 阅读:957

0媒介

串行通信在通讯领域被广泛利用,标准的RS232接口已成为谋略机、外设、互换机和许多通讯设备的标准接口。虽然近年来跟着USB口的日趋盛行,RS232接口串口作为一种传统的串口通信口有被取代的趋势。然而因为它具有较高的性价比和传输的靠得住性Ⅲ。在传输速度要求不是很高的环境下,串口通信仍旧具有其自身的上风。同时RS232标准广泛利用于微型谋略机系统和大年夜型系统中,RS232标准还具有连线简单、通讯间隔长等优点,本文将着熏先容串口通信的连接要领以及使用C说话编程实现串口通讯,着末以实际的工程项目利用,验证了该通讯要领的靠得住性。

1 RS232串行接口

1.1 RS232接口简介

RS232串行接口属于小我谋略机(PC)及电信利用领域中最为成功的串行数据标准。它被定义为一种在低速度串行通信中增添通信间隔的单端标准,是今朝PC机与通信工业中利用最广泛的一种串行接口嗍。现在的Pc机一样平常至少有两个串行口COMI和COM2.新一代的汁算机主要以9引脚的D型接头接出所有的RS232通信旌旗灯号及节制线(有的谋略机的COM2仍为25引脚)。

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

表1引脚缩写功能阐明

1.3串口连接器的连接要领

串口连接器是两个串行接口的连接器,RS232串口存在9针和25针两种形式,根据连接的针数,串口通信连接要领主要分为:1)无握手连接要领;2)全握手连接要领;3)轮回握手回送要领。本文开拓的软件运行在全握手连接要领下,该连接要领如表2所示。

表2全握手连接

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所示。

图1 远间隔串口通信连接要领

2.2 C说话的串口通信软件实现

2.2.1串口通信软件流程图

图2数据通信的流程图

2.2.2 C说话函数详细实现串口通信软件历程

因为I/O串行通信口的速率远远低于CPU的速率,在查询事情要领时,CPU长光阴处于等待状态,其效率异常低,晦气于CPU的资本使用。办理这一抵触的有师法子是采取中断的通信要领,即当通信口自身筹备停其时,主动提出中断申请,一旦CPU相应此申请,便停息履行的事情,转向中断办事子法度榜样,与外设进行数据的互换,数据互换完成后返回到主法度榜样中的断点继承履行未完成的义务,这样就避免了CPU资本的挥霍㈨。

为此必须对异步通信适配器以及中断节制器进行节制。作为系统的外设,异步通信适配器和中断节制器都有其对应的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 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所示。

图3企业临盆整体事情道理图

4结论

本文所阐述的RS232串口通信软件,在详细实践中结合功能必要,综合斟酌繁杂程度、机动性等身分,选择了相宜的措施,实现了串口通信历程,同时在产品测试平台和嵌入式节制系统之间,该软件获得了充分的利用,有效地提升了企业的临盆事情效率。

滥觞;电子工程网



上一篇:张嘉倪孟美岐同框看秀 一个优雅一
下一篇:杨子疑似携前妻陶虹爬山 颜值身材不输圈内小花