橘子派串口通信实现方案

前几天在做一个某个板子向橘子派用串口发送命令并执行linux系统指令的需求,过程算是坎坷,踩了数个坑。
首先我用的是橘子派 one plus 板子,此板子的ttyS0是用来接收控制指令,个人猜测它将读到的每个字符都是作为一个控制指令,因此这个端口不能用来发送字符串数据,想要发送字符串数据得需要ssyS3端口,也就是UART3端口,此端口不需要root权限。如图:UART3端口示意图
首先要先将线接对,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))
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值