1、通用异步串行通讯接口一般应用方法通用异步串行通讯(UART,以下简称:串口通讯),是一般嵌入式工程控制系统中使用非常普遍的一种通讯方式,又主要是以 TTL 电平、RS232、RS485 或 RS422 总线方式为最多。所以,一般从事工控行业的 IT 工程师,需撑握串口通讯的一般应用方法,包括接口总线的硬件及通讯协议的软件。但还是有不少的工程师对此不了解,因此该技术文章对串口通讯应用相关的硬件及软件进行一些描述。串口设备在一般的 PC 机、单片机、ARM 处理器等常用的 CPU 都有,且有些芯片多达好几个串口。串口通讯是按“字节”进行数据传输,每一个字节的传输由这几个位元素组成:起始位、数据位、
2、校验位、停止位。其中,数据位由应用程序填装,校验位是通过应用程序设置相应的控制寄存器设置,为可选位。设置好校验并填装好要发送的数据后,串口控制器会自动生成数据通讯的波形。因此在通讯波形中就会根据校验设置,增加或不增加校验波形时钟。串口通讯的时序如下所示: 空闲:通讯线上没有任何数据在通讯,这时通讯电平为高电平(均以 TTL 进行说明) 起始位:通讯电平由高电平变为低电平,表示开始 数据位:开始位以后,接就是数据位,且低位在前,高位在后。(根据不同的控制器,通讯位可设置为 7 位、 8 位、9 位,具体的要视应用而确定) 校验位:根据数据位的高电平个数及校验设置要求,在该位出现一个高电平或低电平
3、 停止位:通讯电平由低电平变为高电平后且通讯位数据位已达到指定个数,则表示停止通讯。串口通讯的各通讯电平距离说明:TTL:最长安全通讯距离视控制器而定,一般不要超过 30cmRS232:最长安全通讯距离不要超过 2MRS485/RS422:最长安全通讯距离不能超过 1KM如果两个通讯设备在同一个 PCB 基板或很近的两个板卡之间,可以使用TTL 电平进行通讯,如同一机箱内的两个单片机微控制系统。如果两个通讯设备相距很近,但没有在同一系统中,可以使用 RS232 进行通讯,如控制系统与 PC 机之间。如两个通讯设备之间距离非常远,则必须使用 RS485 或 RS422 方式进行通讯,如室外环境控
4、制与检测设备与控制室的服务器或管理器之间的通讯。串口通讯的基本硬件连接方式:TTL 连接:RS232 连接:RS485 连接:RS422 连接:电路连接说明:使用 TTL 或 RS232 进行串口通讯时,需要共地处理,即两个系统的地线需要连接在一起,且最好想办法尽可能减小信号线受到外界的干扰,以保证通讯的可靠。由于 RS482 和 RS422 使用的是差分信号进行通讯,所以不需要也没必要共地。但是,由于 RS485 和 RS422 的通讯距离比较长,因此受到外界环境的共模干扰信号也比较严重,特别是冲击波类型的信号,因此,在 RS485 和RS422 的通讯线一定要使用双绞线,且连接线的最端口位
5、置,需要增加 TVS、放电管等对冲击脉冲信号及弱小雷电信号的过滤,对 RS485 和 RS422 驱动芯片进行保护。由于使用这种通讯方式的特殊性,因此有必要将通讯驱动部份与系统部份隔离,典型的隔离方法就是使用光电隔离。串口通讯应用软件:无论使用 TTL、RS232、RS485 、RS422,都需要应用软件对通讯数据进行打包、发送、数据接收、组装、解析,都需要针对自己的应用,编排有利于自己的数据包格式及协议。通常情况下,会相对地设置通讯主机及从机。如远程数据采集系统的应用中,数据服务器是主机,数据采集终端为从机。通讯主机主动发出数据请求,从机等待并接收到有效数据或指令后进行相应处理或回应。因此数
6、据发送过程及数据接收过程则成了串口通讯编程中的重要工作。对于大多数应用中,可以按如下的编程思路:数据发送:准备工作:需要一个全局的数据发送 BUFF 及发送数据的计数变量,且需要将串口初始化为可使用数据发送状态,关闭串口发送中断。1、 组装要发送的数据,并装入数据发送 BUFF 中,同时统计好数据发送的字节数,放入发送数据的计数变量中。2、 设置并打开串口的发送中断。3、 串口中断服务代码中,检查是否为发送中断。如果是,则检查是否为发送 FIFO 为空,确认后,向串口发送的 FIFO 中放入一定的数据量(该数据量是根据相应的发送 FIFO 数量而定,如 STM32F103,一次只能放一个字节。
7、),同时重新统计要发送的数据个数。如这时发送的数据个数变为 0,表示要发送的数据已发送完毕,则关闭串口的发送中断。数据接收:准备工作:同样,需要一个全局的数据接收 BUFF 及接收到数据总字节数的计数变量,并初始化串口为可接收数据状态,同时打开串口接收中断(如是类似于 WinCE系统,它有一个数据接收线程,即类似于数据接收中断)。1、 当中断产生时,检查是否为数据接收中断状态,如果是,则从控制器的数据接收 BUFF 中读取数据并存入全局的数据接收 BUFF,同时统计接收个数。2、 对当前所接收到的数据或接收到的数据个数进行判断,根据通讯协议的约定,判断本次的数据包是否接收完毕(有些简单的通讯协
8、议,是根据一个特定的字符来进行判断,较为完整点的通讯协议,每一个通讯包可能都有不同的数据长度,这时可以解读数据包中的标识符来判断所接收的数据长度)。如果没有接收完毕,最好是启动一个超时检查定时器(时间一般为 3-5 个字节通讯所花的时间)或重新装载定时器的值,退出中断代码。如接收完毕,则向特定的数据 BUFF 或功能函数发消息,并关闭超时检查定时器。同时清理全局的数据接收 BUFF 及计数变量,为下一个数据包做准备。3、 如果超时检查定时器产生中断,则说明通讯数据出了错,这时需要清理全局的数据接收 BUFF 及计数变量,为下一个数据包做准备,并关闭定时器。用这种方式进行数据发送的好处就是简单可靠。主要的应用程序中,需要数据发送时,只需要组装好数据并打开发送中断即可,然后数据发送的整个过程,均由中断服务代码完全。在实际代码编写中,数据的接收及处理,要比数据的发送复杂得多!因为在接收数据时,要拼装数据、判断数据是否接收完成、校验数据、解析数据。为了数据的可靠,一般在通讯数据中,都会加入CRC16 校验码。如我们所设计的步进电机控制系统,在通讯数据中包含如下元素:起始数据、指令数据、设备地址、有效数据长度、数据、CRC16 校验码。到此,串口通讯的基本使用方法(硬件、软件)已介绍完,如说得不对或不好,请指正,谢谢。