我在两台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.dumps
和pickle.loads
在发送方对Message对象进行腌制,并在接收方对其进行腌制。CAN总线的所有功能(例如仲裁,错误帧等)都无法在UDP连接上进行模仿。
关于python - 在Python中通过UDP发送CAN帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63257492/