在ROC-RK3568-PC开发板上,有一个专门的RJ45控制接口,提供一个RS485和两个RS232。
我手头上,刚好有RS485的设备,所以正好可以测试一下。
先来张全家福:
我的RS485设备,是一个读卡器,读到卡以后,会通过RS485发送卡号信息,卡拿开后,也会发送卡离开的信息。
根据官方的接收,ROC-RK3568-PC开发板的RS485所在控制接口位置如下:
具体的线序,可以参考下图:
这个RJ45控制接口的连接线和接头,需要在官方购买,所以我专门下单,购买了一个。就是图中,一头为RJ45接口,另一头为黑绿接口的连接线和接头。
为了方便呈现效果,我还连接了一个SSD1306的OLED显示屏,用于读卡信息的呈现。该OLED使用I2C接口,具体接线参考下图:
旁边还有一个带有小屏幕的黑块块,那是一个数控电源,给读卡器提供5V供电。
本次实验,所使用的操作系统为Ubuntu,根据官方SDK和系统编译指导进行:2. 编译 Ubuntu 固件 — Firefly Wiki (t-firefly.com)
所以以下的操作,均在ROC-RK3568-PC开发板的Ubuntu系统中进行。
首先,要安装基本的工具和模块:
sudo apt-get install python-is-python3 python3-dev python3-pip libfreetype6-dev libjpeg-dev build-essential
sudo apt-get -y install python3-serial
sudo -H pip install
sudo apt-get -y install i2c-tools
sudo apt-get -y install minicom
其中:
- python3-serial:python串口模块
- luma.oled:python操控OLED模块
- i2c-tools:i2c工具
- minicom:串口终端工具
接好线以后,先检测了一下i2c设备:
i2cdetect -l
i2cdetect -r -y 1
从上图中,可以看到,地址为0x3c的设备已经找到,就是OLED了。
然后,再测试一下RS485的数据。
根据官方资料,RS485挂接设备点为/dev/ttyS4:
而我的RS485设备,发送的是16进制的数据,所以使用如下的命令,进行测试:
minicom -b 9600 -D /dev/ttyS4 -H
上述指令,表示波特率为9600,设备为/dev/ttyS4 ,-H表示打开HEX显示。
具体测试如下:
以上为放上卡,以及拿开卡,所收到的HEX数据。
现在,可以正常收到RS485设备的数据了,也可以找到OLED的I2C设备了,就可以正式编程了。
我的示例程序,使用Python,具体如下:
# -*- coding: UTF-8 -*-
import serial
from luma.core.interface.serial import i2c, spi
from luma.core.render import canvas
from luma.oled.device import ssd1306
# 创建 IIC 设备
oled = i2c(port=1, address=0x3C)
# 创建屏幕的驱动实例
device = ssd1306(oled)
with canvas(device) as draw:
draw.rectangle(device.bounding_box, outline="white", fill="black")
draw.text((30, 30), "RS485 Demo", fill="white")
RS485 = serial.Serial(
port='/dev/ttyS4',
baudrate = 9600,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS,
timeout=1
)
index =0
index_max = 99
data_type = 9
data = []
while True:
x = RS485.read()
if len(x)>0:
index = index + 1
data.append(x.hex())
if len(data)==4:
data_type = 1 if x[0] == 0x0b else 0
index_max = x[0] + 4
if index>=index_max:
# print(data)
print(data[4:-1])
with canvas(device) as draw:
draw.rectangle(device.bounding_box, outline="white", fill="black")
if data_type == 1:
card_info = data[7:-1]
draw.text((30, 5), "Card Info", fill="white")
draw.text((3, 30), "-".join(card_info), fill="white")
elif data_type == 0:
draw.text((30, 5), "Card Status", fill="white")
draw.text((50, 30), "Leave", fill="white")
index = 0
index_max = 99
data_type = 9
data = []
上述代码的逻辑如下:
- 初始化OLED
- 初始化RS485
- 读取数据,根据第4个字节判断类型:0x0b-放上卡,0x04-离开卡
- 根据类型,读取所需的数据,然后将对应的状态,显示到OLED上。
将代码保存到rs485_oled.py,然后执行:
python rs485_oled.py
具体执行结果如下:
实物测试情况,如下:
测试过程,可以查看视频: