python收发can采坑总结 (jetson xavier)

项目原因需要使用python进行can的收发,将操作进行记录

之前在stm32和k60上用C收发过can,本来以为会很顺利,然而还是踩了很多坑

测试设备:

天准xavier Ubuntu18.04 python3.6

先给一个比较官方的链接(python_can)

SocketCAN — python-can 4.0.0 documentation

天准官方也给出了比较详细的命令行测试命令

 sudo ip -details link show can0 可以查看can的详细信息

python_can数据发送代码

import can
import time

def msg_send(bus,msg,state_byte,speed,speed_brush,speed_wind,life_count):
    speed_byte = speed.to_bytes(2,'big')
    # print(state_byte+speed_byte)
    speed_byte3 = speed_brush + 16*speed_wind
    byte3 = speed_byte3.to_bytes(1,'big')

    byte4 = (0).to_bytes(1,'big')
    byte5 = (0).to_bytes(1,'big')
    byte6 = (0).to_bytes(1,'big')

    byte7 = life_count.to_bytes(1,'big')
    msg.data = state_byte + speed_byte + byte3 + byte4 + byte5 + byte6 + byte7
    print(msg)
    bus.send(msg)

python 接收数据代码

import can

def msg_recive(bus):
    msg = bus.recv()
    print(msg)
    # msg = can.Message(arbitration_id=0x1808DA28, data=[1, 5, 6, 53, 4, 51, 6, 6], extended_id=False)

    # if(msg.arbitration_id == 0x1808DA28):
    if(msg.arbitration_id == 0x180828DA):
        data = msg.data
        print(msg.data)

        for i in range(8):
            print(data[i])

can_bus = can.interface.Bus(channel = 'can0', bustyp = 'socketcan_ctypes')

while(True):
    msg_recive(can_bus)

1. 采坑1 :循环发送的话会导致buffer问题

Traceback (most recent call last):
  File "/home/nvidia/.local/lib/python3.6/site-packages/can/interfaces/socketcan/socketcan.py", line 679, in _send_once
    sent = self.socket.send(data)
OSError: [Errno 105] No buffer space available

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/nvidia/can_test/socket_can.py", line 40, in <module>
    producer(10)
  File "/home/nvidia/can_test/socket_can.py", line 29, in producer
    bus.send(msg)
  File "/home/nvidia/.local/lib/python3.6/site-packages/can/interfaces/socketcan/socketcan.py", line 658, in send
    sent = self._send_once(data, msg.channel)
  File "/home/nvidia/.local/lib/python3.6/site-packages/can/interfaces/socketcan/socketcan.py", line 681, in _send_once
    raise can.CanError("Failed to transmit: %s" % exc)
can.CanError: Failed to transmit: [Errno 105] No buffer space available

改大buffer可以作为解决问题的一种暂时方案,但主要问题在于数据传输有问题,才会造成buffer阻塞。

(要注意在每次发送前,清空一次can buffer)

可以先尝试改大缓存,如果仍然报错,需要查找根本原因。
进入 root账户,在路径 /sys/class/net/can0下执行 echo 4096 > tx_queue_len

使用如下py脚本进行测试

每次重启后,再发都会稳定死在 第11次发送

 使用win10PC,pcan软件连接can卡分析can数据,发现接收端没有收到数据,换了个can卡之后问题解决。(排查硬件故障也是软件的一部分工作啦)

采坑2 :用python应该多探索库函数,而不是和C一样啥都想自己写

比如我最初写的这个很蠢的代码 (os.system是最初测试用的,小问题)

def byte2hex(byte):
    if(byte < 16):
        ret = '0' + hex(byte)[2:]
    else:
        ret = hex(byte)[2:]
    return ret


def send_can(distance,move_dis,life_count):
    time1 = time.time()
    byte1 = abs(int(distance) % 256)
    byte2 = int(abs(int(distance) / 256))
    if distance < 0:
        byte2 = int(byte2 + 128) #处理负数
    byte3 = abs(int(move_dis) % 256)
    byte4 = int(abs(int(move_dis) / 256))
    if move_dis < 0:
        byte4 = int(byte4 + 128)
    # byte5 = 
    # byte6 = 
    # byte7 = 
    can_id = '180828DA#'

    str0 = '0A'  #根据手册的状态分情况转一下十六进制
    # str1 = hex(byte1)[2:]
    # str2 = hex(byte2)[2:]
    # str3 = hex(byte3)[2:]
    # str4 = hex(byte4)[2:]
    str1 = byte2hex(byte1)
    str2 = byte2hex(byte2)
    str3 = byte2hex(byte3)
    str4 = byte2hex(byte4)
    str5 = '00'
    str6 = '00'
    str7 = hex(life_count)[2:]

    str_all = str7 + str6 + str5 + str4 + str3 +str2 + str1 +str0

    send_cmd = 'cansend can0 '+ can_id + str_all
    
    # os.system(send_cmd)
    #time1 = time.time()
    subprocess.call(send_cmd, shell=True)
    time2 = time.time()
    print("use subproces : ",time2 - time1)

    time1 = time.time()
    os.system(send_cmd)
    time2 = time.time()
    print("use system : ",time2 - time1)
  
while True:
	send_can(distance111,move_dis111,life_count111)

<think>好的,我需要回答用户关于Jetson平台上的串口通信方法和配置的问题。首先,用户提到了几个引用资料,我需要先仔细阅读这些引用,从中提取有用的信息。 引用[1]提到Jetson TX2的串口通信教程,包括硬件连线和软件调试,还涉及在Win10和Linux端的配置。引用[2]讨论了Jetson Xavier NX的485串口接口和发送YOLO检测结果的应用。引用[3]详细说明了Jetson Nano的UART使用,包括引脚位置和连接方法。引用[4]则关于如何设置开机自动权限,修改/dev/ttyTHS1的权限。 用户的问题集中在Jetson平台的串口通信方法,可能涉及配置步骤、权限问题、硬件连接和示例代码。需要整理这些信息,分步骤说明,确保结构清晰。同时,根据系统级指令,要使用正确的中文回答,生成相关问题,并正确引用资料。 首先,硬件连接部分需要明确不同Jetson设备的UART引脚位置,比如TX2、Xavier NX和Nano的引脚可能有差异。然后软件配置部分需要包括权限设置,因为Linux系统下串口设备通常需要root权限,用户可能遇到权限问题,引用[4]提到了通过systemd服务在启动时自动设置权限,这个点很重要。软件调试部分可能需要示例代码,比如Python的serial库使用,但用户提供的引用中没有具体代码,可能需要结合一般串口通信方法补充。此外,引用[3]提到使用USB转串口模块,这也是常见的情况,需要说明驱动安装和配置步骤。 需要注意,用户引用的资料中有部分是关于不同型号Jetson设备的,需要统一整理为通用的步骤,同时指出不同型号的可能差异。例如,不同型号的UART设备名称可能不同,如ttyTHS1、ttyS0等,需要指出如何确认具体设备名称。 在生成回答时,需要按照逻辑顺序:硬件连接→软件配置(包括权限)→示例代码→调试方法→常见问题。每个部分引用对应的资料作为支持,例如在权限设置部分引用[4],在硬件连线部分引用[1]和[3]。 另外,用户可能对如何在代码中实现串口通信感兴趣,需要提供一个简单的Python示例,使用pyserial库,并解释参数设置。同时,要提醒用户注意波特率、数据位等配置与实际设备匹配。 最后,生成的相关问题需要围绕用户可能进一步的需求,比如性能优化、多串口使用、开机自启动配置、特定应用场景(如与Arduino通信)以及故障排除等。</think>### Jetson平台串口通信配置与使用教程 Jetson系列开发板(如TX2、Xavier NX、Nano)的串口通信配置主要分为**硬件连接**、**权限设置**、**软件调试**三部分,以下是详细步骤: --- #### **1. 硬件连接** Jetson设备的UART引脚位置因型号而异(需参考对应开发板文档): - **Jetson Nano**:UART接口位于40Pin GPIO的第8(TX)、10(RX)引脚[^3]。 - **Jetson Xavier NX**:默认启用UART1(`/dev/ttyTHS1`),支持RS-485扩展[^2]。 - **连接方式**:使用USB转TTL模块或直接连接其他设备的UART引脚,需确保**TX-RX交叉连接**,共地(GND)[^1]。 --- #### **2. 软件配置与权限设置** **步骤1:确认串口设备** - 通过命令`ls /dev/tty*`查看可用串口设备,常见名称如`ttyTHS1`(NX/Xavier)、`ttyS0`(Nano)[^2]。 **步骤2:修改串口权限** - 临时权限: ```bash sudo chmod 777 /dev/ttyTHS1 # 替换为实际设备名 ``` - **开机自动设置权限**(推荐): 创建systemd服务文件(如`serial_permission.service`),添加以下内容[^4]: ```ini [Unit] Description=Set UART Permission [Service] ExecStart=/bin/bash -c "chmod 777 /dev/ttyTHS1" [Install] WantedBy=multi-user.target ``` --- #### **3. 编写串口通信程序(Python示例)** 使用`pyserial`库实现数据收发: ```python import serial # 配置串口参数 ser = serial.Serial( port='/dev/ttyTHS1', # 设备名 baudrate=115200, # 波特率 bytesize=8, # 数据位 parity='N', # 校验位 stopbits=1 # 停止位 ) # 发送数据 ser.write(b'Hello Jetson!\n') # 接收数据 data = ser.readline() print(f"Received: {data.decode()}") ser.close() ``` --- #### **4. 调试与常见问题** - **无数据收发**:检查接线是否正确(TX-RX交叉)、波特率是否一致。 - **权限拒绝**:确保已通过`chmod`或systemd服务设置权限[^4]。 - **多串口扩展**:使用USB转串口模块(如CP2102)时,需安装驱动并识别为`/dev/ttyUSB0`[^3]。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值