UART串口通信

现在的传感器和执行器种类越来越多,需要和控制器传输的数据也是多种多样,只用GPIO来控制和读取的话,只有0和1的状态,未免还是有点麻烦,各种各样的通信方法也层出不穷,UART串口通信绝对是最为常用的一种。

串口通信原理

串行通信是一种通讯协议,也可以简称为串口,可以理解为数据是串成一串的,所以也就只能一位一位的发送,这样传输的速度虽然受到了限制,但是对硬件线路的要求小,只需要一对传输线,一个发送,一个接收,就可以实现双向通信了。
一般情况下,串口模块发送数据的管脚叫做TX,接收数据的管脚叫做RX。发送端发过去的数据,需要对方串口模块的接收端来接收,所以一侧发送端的TX需要连接到另外一侧的接收端RX,接收和发送在两方看来是相对的,所以我们接线的时候,要记住永远是TX引脚连接到RX引脚,接反了数据就传输不了了。

硬件连接

接下来,我们就尝试通过一个串口模块来实现电脑和旭日X3Pi的串口通信。
在接线方面,我们先交叉连接串口模块和旭日X3Pi的RX、TX,同时为了让两边具有相同的参考电平,还要将两者的GND连接到一起,然后再把串口模块连接到电脑就可以了。


运行示例程序

接下来就可以运行串口通信的例程了。

```bash
$ sudo python3 test_serial.py ``` 实物接线完成后,在旭日X3派的终端中输入指令启动例程,很快就可以在终端中看到串口向外发送的数据了。
在串口连接的电脑中打开一个串口软件,用来接收和发送数据,设置好端口和波特率,就能看到旭日X3派发过来的数据了。我们再使用电脑的串口软件尝试下发送数据给旭日X3派,输入1234,点击发送,可以看到,X3Pi的终端这边也成功的接收到了数据并且打印出来了。

代码解析

test_serial.py:

```python
#!/usr/bin/env python3

import sys
import os
import time

# 导入python串口库
import serial
import serial.tools.list_ports

def serialTest():
    print("List of enabled UART:")
    os.system('ls /dev/tty[a-zA-Z]*')
    uart_dev= input("请输入需要测试的串口设备名:")
    baudrate = input("请输入波特率(9600,19200,38400,57600,115200,921600):")
    try:
        ser = serial.Serial(uart_dev, int(baudrate), timeout=1) # 1s timeout
    except Exception as e:
        print("open serial failed!\n")

    print(ser)

    print("Starting demo now! Press CTRL+C to exit")

    while True:
        test_data = "AA55"
        write_num = ser.write(test_data.encode('UTF-8'))
        print("Send: ", test_data)
        
        received_data = ser.read(write_num).decode('UTF-8')
        if received_data :
            print("Recv: ", received_data)

        time.sleep(1)

    ser.close()
    return 0


if __name__ == '__main__':
    if serialTest() != 0:
        print("Serial test failed!")
    else:
        print("Serial test success!")
```
X3Pi这边如果要使用串口,直接使用serial库就可以了,这里我们先调用系统的库,打印出当前有哪些串口,然后手动输入选择串口的设备名,再输入串口的波特率,就可以进项串口的初始化了,初始化成功之后就会进入循环。



循环中,X3Pi会每隔一秒发送一次AA55,同时还会判断是否接收到了数据,如果接收到了数据也会打印出来。