前几天在做一个某个板子向橘子派用串口发送命令并执行linux系统指令的需求,过程算是坎坷,踩了数个坑。
首先我用的是橘子派 one plus 板子,此板子的ttyS0是用来接收控制指令,个人猜测它将读到的每个字符都是作为一个控制指令,因此这个端口不能用来发送字符串数据,想要发送字符串数据得需要ssyS3端口,也就是UART3端口,此端口不需要root权限。如图:
首先要先将线接对,RX对应11号引脚,TX对应13号引脚,GND对应25号引脚。
然后在 /boot/orangepiEnv.txt 中添加 overlays=uart3 就可以打开 uart3 的配置。然后重启系统,启动时,在 u-boot 的启动 log 中可以看到 UART 相关的 DT。(Env.txt文件名称可能不是和这个一样,但是肯定是*Env.txt类型的,大胆的加就行)。
此时端口读取程序就能打开ttyS3端口了。
端口通信发送程序因为有要求,必须用C写来交叉编译,这边借鉴了这个大佬的文章:
《Linux C》04 串口编程总结
对串口通信不了解的也可以先看看这个文章,我看了之后受益匪浅,感谢ZackAddy大佬的分享!
因为串口接收端不需要交叉编译,所以我用了更方便的python写的接收程序。
import threading
import serial
import time
import os
serial_port = "/dev/ttyS3" #端口名
baudrate = 57600 #设置波特率
sink_serial = serial.Serial(serial_port, baudrate) #打开端口
print("ready to receive!")
while True:
time.sleep(1)
try:
if sink_serial.isOpen():
#返回接收到的字节数,此方法只适合读取小块数据,当数据过大时,将会把数据分割成一块一块的
#读取大块数据的方法请用chunk直接读取块
serial_data_length = sink_serial.inWaiting()
if serial_date_length:
#读取**字节**到serial_data
serial_data = sink_serial.read(serial_date_length)
#源数据是以字节形式存在,用str转成字符串,去掉首字符b
serial_data = str(str(serial_data)[1:].replace("\'",""))
print("Run command: " + serial_data)
try:
#执行linux命令
os.system(serial_data)
except Exception as inner_e:
print(str(inner_e))
except Exception as e:
print(str(e))