前言
`
串口通讯(Serial Communication)是指外设和计算机间,通过数据信号线、地线等,按位进行传输数据的一种通讯方式。其通讯协议可分层为协议层和物理层。串口也是“串行接口”的简称,即采用串行通信方式的接口。串行通信将数据字节分成一位一位的形式在一条数据线上逐个传送,其特点是通信线路简单,但传输速度较慢。因此串口广泛应用于嵌入式、工业控制等领域中对数据传输速度要求不高的场合。
一、域格模组uart
1.串口通信的原理
模组两个引脚是专门用来做 UART 串行通信的,它们分别叫做 RXD 和 TXD,由它们组成的通信接口就叫做串行接口,简称串口。
下面是模组和DTE进行 UART 串口通信,接线如下图所示。
三根通信线:TX、RX、GND
任何通信都要有信息传输载体,或者是有线的或者是无线的。
串口通信是有线通信,是通过串口线来通信的。
串口线最少需要两根(GND和信号线),可以实现单工通信;也可以使用3根通信线(TX、RX、GND),来实现全双工通信。
一般开发板都会引出SOC上串口引脚直接输出的TTL电平的接口,用的是插针式插座,每个串口引出的都有3根通信线(TX、RX、GND),可以用这些插座直接连接外部的TTL电平的串口设备。
2.uart相关使用原理
整个串口控制器包含transmitter和receiver两部分,receiver由接收缓冲区和接收移位寄存器构成。当有人通过串口线向我发送信息时,信息通过Rx通信线进入我的接收移位寄存器中,然后接收移位寄存器自动移位并将该二进制位保存入我的接收缓冲区,接收完一帧数据后receiver会产生一个中断给CPU,CPU收到中断后即可知道receiver接收满了一帧数据,就会来读取这帧数据。
transmitter由发送缓冲区和发送移位寄存器构成。我们要发送信息时,首先将信息进行编码(一般用ASCII码)成二进制流,然后将一帧数据(一般是8位)写入发送缓冲区(从这里以后程序就不用管了,剩下的发送部分由硬件自动完成),最后发送移位寄存器会自动从发送缓冲区中读取一帧数据,然后自动移位(移位的目的是将一帧数据的各个位分别拿出来)将其发送到Tx通信线上
二、openCPU下使用方法
1.配置USART为115200 Bits/sec
代码如下:
USARTdrv->Control(ARM_USART_MODE_ASYNCHRONOUS |
ARM_USART_DATA_BITS_8 |
ARM_USART_PARITY_NONE |
ARM_USART_STOP_BITS_1 |
ARM_USART_FLOW_CONTROL_NONE, 115200);
2.串口收发
代码如下(示例):
#if(RTE_UART_RX_IO_MODE == POLLING_MODE) //判断接收是否是轮询模式
USARTdrv->Receive(recBuffer, 1);
USARTdrv->Send(recBuffer, 1);
#elif (RTE_UART_RX_IO_MODE == IRQ_MODE) || (RTE_UART_RX_IO_MODE == DMA_MODE)//判断接收是否是IRQ模式或者DMA模式
USARTdrv->Receive(recBuffer, RECV_BUFFER_LEN);
while((isRecvTimeout == false) && (isRecvComplete == false));
if(isRecvTimeout == true)
{
USARTdrv->Send(recBuffer, USARTdrv->GetRxCount());
isRecvTimeout = false;
}
else
{
isRecvComplete = false;
USARTdrv->Send(recBuffer, RECV_BUFFER_LEN);
}
3.串口收发
选择串口模式
#define RTE_UART0_TX_IO_MODE DMA_MODE
#define RTE_UART0_RX_IO_MODE DMA_MODE
//#define USART0_RX_TRIG_LVL (30)
#define RTE_UART1_TX_IO_MODE DMA_MODE
#define RTE_UART1_RX_IO_MODE DMA_MODE
#define RTE_UART2_TX_IO_MODE DMA_MODE
#define RTE_UART2_RX_IO_MODE DMA_MODE
三组uart口开关
#define RTE_UART0 1
#define RTE_UART1 1
#define RTE_UART2 1
除了PAD 复用要配置对,下面代码选择的与 SWD共用的 UART,以UART2为例:
#define RTE_UART2_RX_BIT 9
#define RTE_UART2_RX_FUNC PAD_MuxAlt3
#define RTE_UART2_TX_BIT 10
#define RTE_UART2_TX_FUNC PAD_MuxAlt3
具体想要用哪个 pin作为 UART2 的配置见数据手册