基于C语言的RS232串行接口通信设计与实现

发布者:BlissfulJoy最新更新时间:2015-06-19 来源: eepw关键字:C语言  RS232  串行接口通信 手机看文章 扫描二维码
随时随地手机看文章
  串行通信在通讯领域被广泛应用,标准的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所示。[page]

  表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 奇偶校验位[page]

  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,maskbOxef);/*INT4*/

  else outport(Port8259+1,maskb0xf7);/*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>>>>>>>>> ”):

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

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

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

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

  }

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

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

  int ReceiveChar(int port)

  {

  do{

  printf(“receive waiting>>>>>>>> ”);

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

  }

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

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

  }

  3 实例

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

 

  

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

  4结论

  本文所阐述的RS232串口通信软件,在具体实践中结合功能需要,综合考虑复杂程度、灵活性等因素,选择了合适的方法,实现了串口通信过程,同时在产品测试平台和嵌入式控制系统之间,该软件得到了充分的应用,有效地提升了企业的生产工作效率。

关键字:C语言  RS232  串行接口通信 引用地址:基于C语言的RS232串行接口通信设计与实现

上一篇:如何选择RS232/RS485/RS422转换器
下一篇:RS232-TTl-RS485转接口电路

推荐阅读最新更新时间:2024-05-02 23:45

AVR串口通信程序RS232头文件
下面是ATMEGA128的头文件 /************************这是串口0******************************/ /*串口0的初始化*/ void Uart0_init(void) { UCSR0B = 0x00; //禁止发送和接收 UCSR0A = 0x02; //倍速异步模式USX0=1 UBRR0L=(Crystal/8/Baud0-1)%256; //根据数据手册的计算法 UBRR0H=(Crystal/8/Baud0-1)/256; //如果不是倍速则(Crystal/16/Baud0-1) UCSR0B=(1 RXEN0)|(1 TXEN0)|(1 RX
[单片机]
PIC18F*K80程序存储器读写(c语言实现)
写程序存储器 #define tmpBuffer //是要写入的数据 #define ProgrammingBuffer //临时缓存 //写FlashBlock(一个块为64字节) void WriteFlashBlock(void) { uint8_t i; //将64字节读入RAM。 TBLPTRU = 0x00; TBLPTRH = HIGH_BYTE(ProgrammedPointer); TBLPTRL = LOW_BYTE(ProgrammedPointer); for (i = 0; i WRITE_BLOCK_SIZE; i++) { asm( tblrdposti
[单片机]
单片机C语言C51的运算符及表达式
1. 赋值运算符 赋值运算符“=”,在C51中,它的功能是将一个数据的值赋给一个变量,如x=10。利用赋值运算符将一个变量与一个表达式连接起来的式子称为赋值表达式,在赋值表达式的后面加一个分号“;”就构成了赋值语句,一个赋值语句的格式如下: 变量=表达式; 执行时先计算出右边表达式的值,然后赋给左边的变量。例如: x=8+9; /*将8+9的值赋绐变量x*/ x=y=5; /*将常数5同时赋给变量x和y*/ 在C51中,允许在一个语句中同时给多个变量赋值,赋值顺序自右向左。 2. 算术运算符 C51中支持的算术运算符有: + 加或取正值运算符 - 减或取负值运算符
[单片机]
pc上用C语言模拟51多任务的案例程序
#include stdio.h #include stdlib.h //任务槽个数.在本例中并未考虑任务换入换出,所以实际运行的任务有多少个, //就定义多少个任务槽,不可多定义或少定义 #define MAX_TASKS 5 //任务的栈指针 unsigned char *task_sp ; //最大栈深.最低不得少于2个,保守值为12. //预估方法:以2为基数,每增加一层函数调用,加2字节. //如果其间可能发生中断,则还要再加上中断需要的栈深. //减小栈深的方法:1.尽量少嵌套子程序 2.调子程序前关中断. #define MAX_TASK_DEP 12 unsigned char task_stac
[单片机]
农历转换函数(C语言版)
char *GetDayOf(PSYSTEMTIME pSt) { /*天干名称*/ const char *cTianGan = {"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"}; /*地支名称*/ const char *cDiZhi = {"子","丑","寅","卯","辰","巳","午", "未","申","酉","戌","亥"}; /*属相名称*/ const char *cShuXiang = {"鼠","牛","虎","兔","龙","蛇", "马","羊","猴","鸡","狗","猪"}; /*农历日期名*/ const char *cDayName = {"*","初一"
[单片机]
MSP430 C语言的关键字扩展
1.interrupt 用于中断函数。 定义如下: 语法: interrupt void 函数名() 或者 interrupt void 函数名() 参数:中断函数没有参数。中断函数需要指定中断向量。 返回:中断函数一般是void,没有返回。 说明:interrupt关键字声明了在处理器发生中断时调用;函数的参数必须为空 2.monitor 使函数进入原型(atomic)操作状态。 定义如下: 语法:monitor 函数类型 函数名(参数表) 参数:该函数可以有参数,也可以没有参数。 返回:函数可以有返回,也可以没有返回。 说明:monitor关键字使得在函数执行期间禁止中断,使函数执行不可中断;在其它所
[单片机]
浅谈单片机中C语言与汇编语言的转换
做了一单片机设计,要用C语言与汇编语言同时实现,现将这次设计的感受和收获,还有遇到的问题写下,欢迎感兴趣的朋友交流想法,提出建议。 单片机设计:基于51单片机的99码表设计 软件环境:Proteus8.0 + Keil4 要求:1,开关按一下,数码管开始计时。2,按两下,数码管显示静止。3,按三下,数码管数值清零。 C语言程序如下: #include reg51.h #define uint unsigned int #define uchar unsigned char uchar shi,ge,aa,keycount=0,temp; sbit anjian=P1^7; uchar code table ={0x3f,0x06
[单片机]
浅谈单片机中<font color='red'>C语言</font>与汇编语言的转换
串行通信RS232/RS485转换器
    摘要: 文章介绍了美国德州仪器公司生产的一种RS485接口芯睡SN75LBC184的主要特点和功能,给出了一种低成本、带光电隔离的RS232/RS485转换器的设计电路。该转换器电路结构简单,工作可靠,能满足大部分工业现场控制场合的使用要求。     关键词: RS232 RS485 串行通信 单片机 转换器 SN75LBC184 1 引言 以单片机为主体构成的分布式数据采集和控制系统,以附加电路结构简单、工作稳定可靠而被广泛应用在工业控制系统中。目前广泛使用的单片机产品(如Intel的8031、Armel的89C51、GMS97C51等系列单片机)芯片中都集成了串行通信接口。使用这些串行通信接口
[网络通信]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved