RS485/232
接口说明
设备通过背板的两个DB9连接器支持RS232,RS485的双路串口,支持双RS485,双RS233,以及一路RS232和1一路RS485,带隔离(包括电源隔离).
注意
如无出厂前沟通或合同明确,默认设备的两个DB9设置为RS485串口模式,包含如下两个含义:
两个DB9的串口模式开关硬件上设置为OFF位,即均为RS485模式;
系统内核设备树默认为RS485,内核串口驱动以RS485模式工作;
COM1:(背板角度:右 ,内核设备 ttyTHS3@3110000)
模式控制开关为拨码2(底板角度:下排)OFF:RS485;ON:RS232COM2:(背板角度:左, 内核设备 ttyTHS1@3100000)
模式控制开关为拨码1(底板角度:上排)OFF:RS485;ON:RS232
电气特性
小技巧
每个COM接口有3个预留信号脚,可以用来扩展输出包括CAN以及GPIO例如PPS信号的输入和输出
COM接口DB公头信号线定义
PIN |
信号线 |
|---|---|
1 |
RS485_A |
2 |
RS485_B |
3 |
RS485_GND |
4 |
预留 or CAN_RX |
5 |
预留 or CAN_TX |
6 |
RS232_RXD |
7 |
RS232_TXD |
8 |
RS232_GND |
9 |
预留 or CAN_GND |
接口原理图
支持列表
标准RS485半双工,带隔离,支持终端匹配电阻120欧(可设置),当前最高支持4Mbps;
标准RS232串口,最高速率250Kbps;
注意
在实际应用中,最高速率或最远传输距离均受限于所使用的电缆、总线上的负载、节点数、网络拓扑等因素
RS485配置和使用
RS485配置说明
配置背板两个DB9为RS485串口输出模式
检查载板的串口输出模式切换开关双路为OFF状态
下图红色部分的模式切换开关,全部位于左侧OFF位

根据现场RS485连接拓扑,确认端接120欧匹配电阻是否使用
RS485终端匹配电阻120欧(下图红色拨码开关),注意:RS485串口出厂设置默认为端接120欧匹配电阻不使能。

端接120欧匹配电阻的控制开关含义:
COM1:(背板角度:右 ,内核设备 ttyTHS3@3110000)
拨码2(底板角度:下排)OFF:无端接电阻;ON:使能端接电阻120欧COM2:(背板角度:左, 内核设备 ttyTHS1@3100000)
拨码1(底板角度:上排)OFF:无端接电阻;ON:端接电阻120欧
设备上电启动后,检查内核输出,确认串口设备
nvidia@tegra-ubuntu:~$ sudo dmesg | grep serial
[ 0.103572] 31d0000.serial: ttyAMA0 at MMIO 0x31d0000 (irq = 117, base_baud = 0) is a SBSA
[ 0.235043] msm_serial: driver initialized
[ 3.558666] serial-tegra 3100000.serial: RX in PIO mode
[ 3.558674] serial-tegra 3100000.serial: TX in PIO mode
[ 3.558678] serial-tegra 3100000.serial: RS485 mode enabled at boot
[ 3.558683] serial-tegra 3100000.serial: rs485-delay-tx=10
[ 3.558688] serial-tegra 3100000.serial: rs485-delay-rx=5
[ 3.558775] serial-tegra 3100000.serial: Success to request RS485 GPIO 433
[ 3.558903] 3100000.serial: ttyTHS1 at MMIO 0x3100000 (irq = 112, base_baud = 0) is a TEGRA_UART
[ 3.559708] 3140000.serial: ttyTHS2 at MMIO 0x3140000 (irq = 113, base_baud = 0) is a TEGRA_UART
[ 3.561042] serial-tegra 3110000.serial: RX in PIO mode
[ 3.561052] serial-tegra 3110000.serial: TX in PIO mode
[ 3.561056] serial-tegra 3110000.serial: RS485 mode enabled at boot
[ 3.561059] serial-tegra 3110000.serial: rs485-delay-tx=10
[ 3.561062] serial-tegra 3110000.serial: rs485-delay-rx=5
[ 3.561123] serial-tegra 3110000.serial: Success to request RS485 GPIO 454
[ 3.561226] 3110000.serial: ttyTHS3 at MMIO 0x3110000 (irq = 197, base_baud = 0) is a TEGRA_UART
[ 9.129979] systemd[1]: Created slice Slice /system/serial-getty.
RS485自环测试
将设备的两个DB9串口通过自环线进行连接后,可以通过如下RS485自环测试代码进行测试
安装必要的依赖
sudo apt-get install python3-serial
赋予读取权限
sudo chmod 666 /dev/ttyTHS*
编辑和运行代码
import serial
import threading
import time
import logging
# 配置日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s: %(message)s'
)
# 串口配置参数
SERIAL_CONFIG = {
'baudrate': 96000, # 波特率
'bytesize': serial.EIGHTBITS, # 数据位
'parity': serial.PARITY_NONE, # 校验位
'stopbits': serial.STOPBITS_ONE, # 停止位
'timeout': 1 # 读超时(秒)
}
def serial_receiver(port):
""" RS485接收线程函数 """
try:
with serial.Serial(port=port, **SERIAL_CONFIG) as ser:
logging.info(f"接收串口 {port} 已连接")
while True:
data = ser.read(ser.in_waiting or 1)
if data:
timestamp = time.strftime("%Y-%m-%d %H:%M:%S")
# logging.info(f"收到数据 [{timestamp}]: {data.hex()} (HEX)")
hex_str = data.hex()
logging.info(f"收到数据 [{timestamp}]: HEX[{hex_str}] | STR[{data.decode('utf-8', errors='replace')!r}]")
except Exception as e:
logging.error(f"接收线程异常: {str(e)}")
finally:
logging.info(f"接收串口 {port} 已关闭")
def serial_sender(port):
""" RS485发送线程函数 """
try:
with serial.Serial(port=port, **SERIAL_CONFIG) as ser:
logging.info(f"发送串口 {port} 已连接")
counter = 1
while True:
msg = f"Test-message-from-{port}-#{counter}\r\n"
ser.write(msg.encode())
logging.info(f"已发送: {msg.strip()}")
counter += 1
time.sleep(2) # 每2秒发送一次
except Exception as e:
logging.error(f"发送线程异常: {str(e)}")
finally:
logging.info(f"发送串口 {port} 已关闭")
if __name__ == "__main__":
# 配置收发串口
RECEIVE_PORT = "/dev/ttyTHS1" # 接收用串口
SEND_PORT = "/dev/ttyTHS3" # 发送用串口
# 创建并启动线程
recv_thread = threading.Thread(
target=serial_receiver,
args=(RECEIVE_PORT,),
daemon=True
)
send_thread = threading.Thread(
target=serial_sender,
args=(SEND_PORT,),
daemon=True
)
recv_thread.start()
send_thread.start()
try:
logging.info("程序运行中,按 Ctrl+C 停止...")
while True:
time.sleep(0.1)
except KeyboardInterrupt:
logging.info("用户终止程序")
finally:
logging.info("测试程序已关闭")
RS232配置和使用
RS232配置说明
配置背板两个DB9为RS232串口输出模式,包括硬件设置和软件设置两部分
硬件:设置载板的串口输出模式拨码开关双路为ON状态
模式切换开关,全部打到左侧ON位(RS232)

软件:设置系统上电后串口工作模式为RS232
编辑RS232模式切换代码:
#include <linux/serial.h>
#include <sys/ioctl.h>
#include <fcntl.h>
int main() {
int fd = open("/dev/ttyTHS3", O_RDWR);
if (fd < 0) return -1;
struct serial_rs485 rs485conf = {0};
rs485conf.flags = 0;
rs485conf.delay_rts_before_send = 0; // 用户自定义发送延时
rs485conf.delay_rts_after_send = 0; // 用户自定义接收延时
if (ioctl(fd, TIOCSRS485, &rs485conf) < 0) {
perror("ioctl failed");
close(fd);
return -1;
}
close(fd);
return 0;
}
编译模式切换代码
gcc -o rs232_mode_switch rs232_mode_switch.c
执行模式切换设置
# 将UART0对应的串口ttyTHS3设置为RS232模式
./rs232_mode_switch
将当前模式切换程序设置为开机启动
vim /etc/rc.local
#!/bin/bash -e
#
# rc.local
#
/usr/local/sbin/rs232_mode_switch
这样可以确保每次系统重启仍然将串口设置为RS232模式。
小技巧
用户也可以在RS232的串口收发程序中,按照rs232_mode_switch中的设置方法将串口设置为RS232
固定使用RS232串口的场景,请联系我司提供对应的镜像将内核固定为RS232收发模式
RS232自环测试
制作一个自环线的DB9线缆,连接到COM1接口(内核对应ttyTHS3)
编辑和运行如下代码
import serial
ser = serial.Serial(
port='/dev/ttyTHS3',
baudrate=9600,
timeout=1
)
test_data = b"Jetson RS232 Test\n"
ser.write(test_data)
response = ser.readline()
print("Sent:", test_data.decode().strip())
print("Received:", response.decode().strip())
ser.close()
常见说明
Q1 串口设备赋予读权限
串口程序收发提示无访问权限时,请注意赋予权限
sudo chmod 666 /dev/ttyTHS*
Q2 RS485的收发Delay时延配置
设备树中的默认配置为:
delay_rts_before_send 默认为10us;
delay_rts_after_send 默认为5us;
注意:单位为us,微秒