第一:串口通信基本原理
1、同步通信(SYNC-synchronous data communication)
同步通信有时钟信号来做同步,在约定的通信速率下,发送端和接收端的时钟信号频率和相位始终保持一致(同步),这样就保证了通信双方在发送和接收时具有完全一致的定时关系;
同步串行通信SPI(Serial Peripheral Interface串行外围设备接口简称),SPI总线系统是一种同步串行的外设接口,它可以是MCU与各种外围设备以串行方式进行通信以交换信息。
2、异步通信(ASYNC-asynchronous data communication)
以字符为单位进行传输,字符之间没有固定的时间间隔要求,而每个字符中的各位则固定的时间传送。异步通信中,收发双方去的同步是通过在字符格式中设置起始位和停止位的方式来实现的。具体来说就是,在一个有效字符正式发送之前,发送器先发送一个起始位,然后发送有效字符位,在字符结束时再发送一个停止位,起始位和停止位构成一帧。停止位和下一个起始位之间是不定长的空闲位,并且规定起始位为低电平(逻辑值为0),停止位和空闲位都是高电平(逻辑值为1),这样就保证了起始位开始处一定会有一个下跳沿,由此就可以标志一个字符传输的起始;根据起始位和停止位就很容易的实现了字符的界定和同步。
异步串行通信UART(无时钟信号)(UniverSal Asynchronous Receiver/Transmitter),即通用异步接收/发送;
UART包含TTL电平和RS232电平,TTL电平是3.3V的,RS232是负逻辑电平,它定义+3 ~ +15为低电平,而-15 ~ -3为高电平,通常PC机串口与单片机串口通信需要电平转换芯片,例如:MAX232;
显然,采用异步通信时,发送端和接收端可以由各自的时钟来控制数据的发送和接收,这两个时钟源彼此独立,可以互不同步
第二:鸿蒙UART API分析
UartInit()
unsigned int UartInit (WifiIotUartIdx id, const WifiIotUartAttribute * param, const WifiIotUartExtraAttr * extraAttr )
功能描述:
配置一个UART设备。 参数:
名字 | 描述 |
id | UART端口号. |
param | 表示基本UART属性 |
extraAttr | 表示扩展UART属性 |
UartWrite()
int UartWrite (WifiIotUartIdx id, const unsigned char * data, unsigned int dataLen )
功能描述:将数据写入UART设备
参数:
名字 | 描述 |
id | UART端口号. |
data | 表示指向要写入数据的起始地址的指针 |
dataLen | 表示读取数据的长度 |
UartRead()
int UartRead (WifiIotUartIdx id, unsigned char * data, unsigned int dataLen )
功能描述:
从UART设备读取数据。
参数:
名字 | 描述 |
id | UART端口号. |
data | 表示指向要读取数据的起始地址的指针 |
dataLen | 表示读取数据的长度 |
第三:硬件设计
本实例使用鸿蒙开发板的UART作为测试,如原理图所示第 18 和 19 脚分别为 TXD 和 RXD ,连接了主控芯片的 GPIO_6 和 GPIO_5 ,所以在编写软件的时候需要将 GPIO_6 和 GPIO_5 分别复用为 TXD 和 RXD 。
第四:软件设计
这部分代码为UART初始化的代码,首先要在 uart_attr
结构体这配置波特率、数据位、停止位、奇偶检验位,然后通过 UartInit()
函数对串口1进行配置。
WifiIotUartAttribute uart_attr = { .baudRate = 9600, /* baud_rate: 9600 */ .dataBits = 8, /* data_bits: 8bits */ .stopBits = 1, .parity = 0, }; /* Initialize uart driver */ ret = UartInit(WIFI_IOT_UART_IDX_1, &uart_attr, NULL); if (ret != WIFI_IOT_SUCCESS) { printf("Failed to init uart! Err code = %d\n", ret); return; }
这部分的代码主要实现通过 UartWrite()
函数在串口1发送一串数据,然后通过 UartRead()
函数将数据都回来,并通过 debug
串口打印出来。
UartWrite(WIFI_IOT_UART_IDX_1, (unsigned char *)data, strlen(data)); // 通过串口1发送数据 UartRead(WIFI_IOT_UART_IDX_1,uart_buff_ptr,UART_BUFF_SIZE); // 通过串口1接收数据 printf("%s",uart_buff_ptr);
第五:编译调试
修改BUILD.gn
修改 applications\BearPi\BearPi-HM_Nano\sample
路径下 BUILD.gn 文件,指定 uart_example
参与编译。
#"B1_basic_led_blink:led_example", #"B2_basic_button:button_example", #"B3_basic_pwm_led:pwm_example", #"B4_basic_adc:adc_example", #"B5_basic_i2c_nfc:i2c_example", "B6_basic_uart:uart_example",
第六:运行结果
示例代码编译烧录代码后,按下开发板的RESET按键, 将开发板上E53接口的UART_TX和UART_RX用杜邦线短接
通过串口助手查看日志,串口1实现自发自收。
======================================= *************UART_example************** ======================================= Uart1 read data:Hello, BearPi! ======================================= *************UART_example************** ======================================= Uart1 read data:Hello, BearPi!