Chinaunix首页 | 论坛 | 博客
  • 博客访问: 44974
  • 博文数量: 15
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 110
  • 用 户 组: 普通用户
  • 注册时间: 2014-10-31 09:11
个人简介

每天一小步,日久一大步,将自己从2007年开始的,逐渐归类,分享。

文章分类
文章存档

2015年(14)

2014年(1)

我的朋友

分类: LINUX

2015-03-13 14:19:49

通用异步串行通讯(UART,以下简称:串口通讯),是一般嵌入式工程控制系统中使用非常普遍的一种通讯方式,又主要是以TTL电平、RS232、RS485或RS422总线方式为最多。所以,一般从事工控行业的IT工程师,需撑握串口通讯的一般应用方法,包括接口总线的硬件及通讯协议的软件。但还是有不少的工程师对此不了解,因此该技术文章对串口通讯应用相关的硬件及软件进行一些描述。

串口设备在一般的PC机、单片机、ARM处理器等常用的CPU都有,且有些芯片多达好几个串口。串口通讯是按“字节”进行数据传输,每一个字节的传输由这几个位元素组成:起始位、数据位、校验位、停止位。其中,数据位由应用程序填装,校验位是通过应用程序设置相应的控制寄存器设置,为可选位。设置好校验并填装好要发送的数据后,串口控制器会自动生成数据通讯的波形。因此在通讯波形中就会根据校验设置,增加或不增加校验波形时钟。串口通讯的时序如下所示:

空闲:通讯线上没有任何数据在通讯,这时通讯电平为高电平(均以TTL进行说明)

起始位:通讯电平由高电平变为低电平,表示开始

数据位:开始位以后,接就是数据位,且低位在前,高位在后。(根据不同的控制器,通讯位可设置为7位、8位、9位,具体的要视应用而确定)

校验位:根据数据位的高电平个数及校验设置要求,在该位出现一个高电平或低电平

停止位:通讯电平由低电平变为高电平后且通讯位数据位已达到指定个数,则表示停止通讯。

串口通讯的各通讯电平距离说明:

TTL:最长安全通讯距离视控制器而定,一般不要超过30cm

RS232:最长安全通讯距离不要超过2M

RS485/RS422:最长安全通讯距离不能超过1KM

如果两个通讯设备在同一个PCB基板或很近的两个板卡之间,可以使用TTL电平进行通讯,如同一机箱内的两个单片机微控制系统。

如果两个通讯设备相距很近,但没有在同一系统中,可以使用RS232进行通讯,如控制系统与PC机之间。

如两个通讯设备之间距离非常远,则必须使用RS485或RS422方式进行通讯,如室外环境控制与检测设备与控制室的服务器或管理器之间的通讯。

串口通讯的基本硬件连接方式:

TTL连接:

RS232连接:

RS485连接:

RS422连接:

电路连接说明:

使用TTL或RS232进行串口通讯时,需要共地处理,即两个系统的地线需要连接在一起,且最好想办法尽可能减小信号线受到外界的干扰,以保证通讯的可靠。由于RS482和RS422使用的是差分信号进行通讯,所以不需要也没必要共地。

但是,由于RS485和RS422的通讯距离比较长,因此受到外界环境的共模干扰信号也比较严重,特别是冲击波类型的信号,因此,在RS485和RS422的通讯线一定要使用双绞线,且连接线的最端口位置,需要增加TVS、放电管等对冲击脉冲信号及弱小雷电信号的过滤,对RS485和RS422驱动芯片进行保护。由于使用这种通讯方式的特殊性,因此有必要将通讯驱动部份与系统部份隔离,典型的隔离方法就是使用光电隔离。

串口通讯应用软件:

无论使用TTL、RS232、RS485、RS422,都需要应用软件对通讯数据进行打包、发送、数据接收、组装、解析,都需要针对自己的应用,编排有利于自己的数据包格式及协议。通常情况下,会相对地设置通讯主机及从机。如远程数据采集系统的应用中,数据服务器是主机,数据采集终端为从机。通讯主机主动发出数据请求,从机等待并接收到有效数据或指令后进行相应处理或回应。因此数据发送过程及数据接收过程则成了串口通讯编程中的重要工作。

对于大多数应用中,可以按如下的编程思路:

数据发送:

准备工作:

需要一个全局的数据发送BUFF及发送数据的计数变量,且需要将串口初始化为可使用数据发送状态,关闭串口发送中断。

1、 组装要发送的数据,并装入数据发送BUFF中,同时统计好数据发送的字节数,放入发送数据的计数变量中。

2、 设置并打开串口的发送中断。

3、 串口中断服务代码中,检查是否为发送中断。如果是,则检查是否为发送FIFO为空,确认后,向串口发送的FIFO中放入一定的数据量(该数据量是根据相应的发送FIFO数量而定,如STM32F103,一次只能放一个字节。),同时重新统计要发送的数据个数。如这时发送的数据个数变为0,表示要发送的数据已发送完毕,则关闭串口的发送中断。

    数据接收:

准备工作:

同样,需要一个全局的数据接收BUFF及接收到数据总字节数的计数变量,并初始化串口为可接收数据状态,同时打开串口接收中断(如是类似于WinCE系统,它有一个数据接收线程,即类似于数据接收中断)。

1、 当中断产生时,检查是否为数据接收中断状态,如果是,则从控制器的数据接收BUFF中读取数据并存入全局的数据接收BUFF,同时统计接收个数。

2、 对当前所接收到的数据或接收到的数据个数进行判断,根据通讯协议的约定,判断本次的数据包是否接收完毕(有些简单的通讯协议,是根据一个特定的字符来进行判断,较为完整点的通讯协议,每一个通讯包可能都有不同的数据长度,这时可以解读数据包中的标识符来判断所接收的数据长度)。如果没有接收完毕,最好是启动一个超时检查定时器(时间一般为3-5个字节通讯所花的时间)或重新装载定时器的值,退出中断代码。如接收完毕,则向特定的数据BUFF或功能函数发消息,并关闭超时检查定时器。同时清理全局的数据接收BUFF及计数变量,为下一个数据包做准备。

3、 如果超时检查定时器产生中断,则说明通讯数据出了错,这时需要清理全局的数据接收BUFF及计数变量,为下一个数据包做准备,并关闭定时器。

用这种方式进行数据发送的好处就是简单可靠。主要的应用程序中,需要数据发送时,只需要组装好数据并打开发送中断即可,然后数据发送的整个过程,均由中断服务代码完全。在实际代码编写中,数据的接收及处理,要比数据的发送复杂得多!因为在接收数据时,要拼装数据、判断数据是否接收完成、校验数据、解析数据。为了数据的可靠,一般在通讯数据中,都会加入CRC16校验码。如我们所设计的步进电机控制系统,在通讯数据中包含如下元素:起始数据、指令数据、设备地址、有效数据长度、数据、CRC16校验码。

阅读(2354) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~