python - 在Python中通过UDP发送CAN帧

标签 python linux sockets udp can-bus

我在两台Linux机器之间建立了UDP套接字连接,并且可以轻松发送例如b"Hello, World!"。但是现在我需要发送以下CAN帧

from can import Message
send_msg = Message(data=[1, 2, 3, 4, 5])
因此,如果我打印send_msg,它将显示:
Timestamp:        0.000000    ID: 00000000    X                DLC:  5    01 02 03 04 05
我想将此打印在接收端。我正在使用的发送和接收结束代码如下:
发送:
import socket

UDP_IP = "10.140.189.249"
UDP_PORT = 5005
from can import Message
send_msg = Message(data=[1, 2, 3, 4, 5])

print(send_msg)
MESSAGE = send_msg

print("UDP target IP: %s" % UDP_IP)
print("UDP target port: %s" % UDP_PORT)
print("message: %s" % MESSAGE)

sock = socket.socket(socket.AF_INET, # Internet
                     socket.SOCK_DGRAM) # UDP
sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))
在这里,我知道MESSAGE = send_msg是错误的。
接收
import socket

UDP_IP = "0.0.0.0"
UDP_PORT = 5005

sock = socket.socket(socket.AF_INET, # Internet
                     socket.SOCK_DGRAM) # UDP
sock.bind((UDP_IP, UDP_PORT))

while True:
    rec_msg, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
    print("received message: %s" % rec_msg)
请指教

最佳答案

由于UDP连接的物理层和CAN连接的本质层是完全不同的,因此您无法通过UDP发送CAN帧。当然可能的是发送CAN帧的有效负载并在接收侧组装CAN消息:即在发送方:

sock.sendto(b“12345“, (UDP_IP, UDP_PORT))
在接收端:
msg = Message(data=bytearray(recv_msg))
您很可能不仅要传输CAN帧的数据,还希望传输ID和其他字段。
另一种可能是使用pickle.dumpspickle.loads在发送方对Message对象进行腌制,并在接收方对其进行腌制。
CAN总线的所有功能(例如仲裁,错误帧等)都无法在UDP连接上进行模仿。

关于python - 在Python中通过UDP发送CAN帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63257492/

相关文章:

linux - 如何使用grep/awk对多行进行聚合平均?

python - 在 Python 中刷新套接字

javascript - 使用 socket.io 解析 cookie

python - 检查大量字符串是否存在的有效方法

python - 在 QGraphicsScene 选择更改后为所选项目切换 QPen

python - 如何获取外键的相关名称?

php - 在 Linux 中使用 PHP 的 posix_kill() 导致奇怪的行为

linux - 在 Bash 上调用命令变量

c - UDP套接字的源端口和目标端口?

python - Tkinter : Syntax highlighting for Text widget