我正在开发一个带有 RFD868x 模块的通信系统,它支持 mavlink。我正在用 pymavlink 在 python 中编写程序。首先我用这段代码测试系统:
import json
import time
from pymavlink import mavutil
my_dict = {
"lng": 12.34567898910,
"lat": 12.34567898910
}
# Establish connection to serial port
master = mavutil.mavlink_connection('/dev/serial0', baud=57600)
while True:
text = json.dumps(my_dict)
msg=master.mav.statustext_encode(
mavutil.mavlink.MAV_SEVERITY_INFO,
text.encode()
)
master.mav.send(msg)
print("sent")
time.sleep(1)
另一边:
import json
import time
from pymavlink import mavutil
# Establish connection to serial port
master = mavutil.mavlink_connection('com7', baud=57600)
print("begin")
while True:
msg = master.recv_match(blocking=True, timeout=.1)
if msg!=None:
if msg.get_type() != 'BAD_DATA':
print (msg)
有时我会收到一些 BAD_DATA 或 UNKNOW_DATA,但这些信息已发送。我不使用这种方言中的任何其他类型,因为它们的工作很糟糕(只有 1-2 条消息到达,然后通信就冻结了。)
Ofc,我想沟通的不仅仅是一个方向,所以我写了一个代码来发送和读取数据。
import json
import time
from pymavlink import mavutil
master = mavutil.mavlink_connection('/dev/serial0', baud=57600)
def send_message(dats:dict):
text = json.dumps(dats)
msg=master.mav.statustext_encode(
mavutil.mavlink.MAV_SEVERITY_INFO,
text.encode()
)
master.mav.send(msg)
print("sent")
time.sleep(.1)
my_dict = {
"lng": 12.34567898910,
"lat": 12.34567898910
}
t=time.time()
while True:
if time.time()-t>1:
send_message(my_dict)
t=time.time()
mess = master.recv_match(blocking=True, timeout=1)
if mess!=None:
print(mess)
send_message(my_dict)
另一边:
import json
import time
from pymavlink import mavutil
# Establish connection to serial port
master = mavutil.mavlink_connection('com7', baud=57600)
def cmdLong(dats:list):
cmd = master.mav.command_long_encode(
0,
0, # target component ID
mavutil.mavlink.MAV_CMD_USER_1, # command ID
0, # confirmation
dats[0], # parameter 1 (not used)
dats[1], # parameter 2 (not used)
dats[2], # parameter 3 (not used)
dats[3], # parameter 4 (not used)
dats[4], # parameter 5 (string)
dats[5], # parameter 6 (not used)
dats[6]
)
master.mav.send(cmd)
print("writed")
time.sleep(.1)
t=time.time()
print("begin")
while True:
print("Waiting for message...")
if time.time()-t>20:
cmdLong([0,0,0,0,0,0,0])
t=time.time()
msg = master.recv_match(blocking=True, timeout=1)
if msg!=None:
if msg.get_type() != 'BAD_DATA':
print (msg)
现在短信到达,直到发送命令消息。命令消息发送后,阅读器未检测到,通信被冻结。 在此之后,我用这段代码测试了主从类型的通信,但它也不起作用。
import json
import time
from pymavlink import mavutil
# Establish connection to serial port
master = mavutil.mavlink_connection('/dev/serial0', baud=57600)
def send_message(dats:dict):
text = json.dumps(dats)
msg=master.mav.statustext_encode(
mavutil.mavlink.MAV_SEVERITY_INFO,
text.encode()
)
master.mav.send(msg)
print("sent")
time.sleep(.1)
my_dict = {
"lng": 12.34567898910,
"lat": 12.34567898910
}
print("begin")
while True:
mess = master.recv_match(blocking=True, timeout=.1)
if mess!=None:
if mess.get_type() != 'BAD_DATA':
print(mess)
send_message(my_dict)
对方:
import json
import time
from pymavlink import mavutil
# Establish connection to serial port
master = mavutil.mavlink_connection('com7', baud=57600)
def cmdLong(dats:list):
cmd = master.mav.command_long_encode(
0,
0, # target component ID
mavutil.mavlink.MAV_CMD_USER_1, # command ID
0, # confirmation
dats[0], # parameter 1 (not used)
dats[1], # parameter 2 (not used)
dats[2], # parameter 3 (not used)
dats[3], # parameter 4 (not used)
dats[4], # parameter 5 (string)
dats[5], # parameter 6 (not used)
dats[6]
)
master.mav.send(cmd)
print("writed")
time.sleep(.1)
print("begin")
cmdLong([0,0,0,0,0,0,0])
while True:
msg = master.recv_match(blocking=True, timeout=.1)
if msg!=None:
if msg.get_type() != 'BAD_DATA':
print (msg)
cmdLong([0,0,0,0,0,0,0])
这里我以正确的顺序启动了程序,但它没有检测到任何东西,(当然它也没有发送任何东西)
我不知道,这个错误的原因是什么。如果有人可以提供帮助,我将非常感激!