RS485/232

接口说明

设备通过背板的两个DB9连接器支持RS232,RS485的双路串口,支持双RS485,双RS233,以及一路RS232和1一路RS485,带隔离(包括电源隔离).

注意

如无出厂前沟通或合同明确,默认设备的两个DB9设置为RS485串口模式,包含如下两个含义:

  1. 两个DB9的串口模式开关硬件上设置为OFF位,即均为RS485模式;

  2. 系统内核设备树默认为RS485,内核串口驱动以RS485模式工作;

serial

  • COM1:(背板角度:右 ,内核设备 ttyTHS3@3110000)
    模式控制开关为拨码2(底板角度:下排)OFF:RS485;ON:RS232

  • COM2:(背板角度:左, 内核设备 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

  • 接口原理图

USB

支持列表

  • 标准RS485半双工,带隔离,支持终端匹配电阻120欧(可设置),当前最高支持4Mbps;

  • 标准RS232串口,最高速率250Kbps;

注意

在实际应用中,最高速率或最远传输距离均受限于所使用的电缆、总线上的负载、节点数、网络拓扑等因素

RS485配置和使用

RS485配置说明

配置背板两个DB9为RS485串口输出模式

  1. 检查载板的串口输出模式切换开关双路为OFF状态

下图红色部分的模式切换开关,全部位于左侧OFF位

rs485mode

  1. 根据现场RS485连接拓扑,确认端接120欧匹配电阻是否使用

RS485终端匹配电阻120欧(下图红色拨码开关),注意:RS485串口出厂设置默认为端接120欧匹配电阻不使能。

rs485-120欧

端接120欧匹配电阻的控制开关含义:

  • COM1:(背板角度:右 ,内核设备 ttyTHS3@3110000)
    拨码2(底板角度:下排)OFF:无端接电阻;ON:使能端接电阻120欧

  • COM2:(背板角度:左, 内核设备 ttyTHS1@3100000)
    拨码1(底板角度:上排)OFF:无端接电阻;ON:端接电阻120欧

  1. 设备上电启动后,检查内核输出,确认串口设备

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自环测试代码进行测试

  1. 安装必要的依赖

sudo apt-get install python3-serial
  1. 赋予读取权限

sudo chmod 666 /dev/ttyTHS* 
  1. 编辑和运行代码

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串口输出模式,包括硬件设置和软件设置两部分

  1. 硬件:设置载板的串口输出模式拨码开关双路为ON状态

模式切换开关,全部打到左侧ON位(RS232)

rs232mode

  1. 软件:设置系统上电后串口工作模式为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自环测试

  1. 制作一个自环线的DB9线缆,连接到COM1接口(内核对应ttyTHS3)

  2. 编辑和运行如下代码

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,微秒