我正在使用RFD868x模块开发一个通信系统,该系统支持mavlink。我正在使用python编写pymavlink程序。首先,我使用以下代码测试系统:
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条消息到达,然后通信冻结。)
我不想只和一个方向通信,所以我写了一个代码来发送和读取数据。
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])
这里我已经按正确的顺序启动了程序,但是它没有检测到任何东西,(当然它也没有发送任何东西)
我不知道是什么原因造成了这些错误。如果有人能帮助我,我将非常感激!
1条答案
按热度按时间nukf8bse1#
错误不在代码中,而是设置错误。
如果你想使用RFD868x与树莓派的GPIO串行端口,你必须启用串行接口,并必须禁用
raspi-config
中的串行登录shell。在接口选项和串行端口中执行
sudo raspi-config
命令后,应使用以下设置:我希望我帮助了别人。