本帖最后由 Firefly搬运工 于 2022-10-28 14:53 编辑
在ROC-RK3568-PC开发板上,有一个专门的RJ45控制接口,提供一个RS485和两个RS232。
我手头上,刚好有RS485的设备,所以正好可以测试一下。
测试过程,可以查看视频:
先来张全家福:
我的RS485设备,是一个读卡器,读到卡以后,会通过RS485发送卡号信息,卡拿开后,也会发送卡离开的信息。 根据官方的介绍,ROC-RK3568-PC开发板的RS485所在控制接口位置如下:
具体的线序,可以参考下图:
这个RJ45控制接口的连接线和接头,需要在官方购买,所以我专门下单,购买了一个。就是图中,一头为RJ45接口,另一头为黑绿接口的连接线和接头。
为了方便呈现效果,我还连接了一个SSD1306的OLED显示屏,用于读卡信息的呈现。该OLED使用I2C接口,具体接线参考下图:
旁边还有一个带有小屏幕的黑块块,那是一个数控电源,给读卡器提供5V供电。
所以以下的操作,均在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 --upgrade luma.oled
- 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,然后执行: 具体执行结果如下:
实物测试情况,如下:
|