python-3.x 与RFD868x的MAVLink通信不可靠

pgvzfuti  于 2023-03-24  发布在  Python
关注(0)|答案(1)|浏览(143)

我正在使用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])

这里我已经按正确的顺序启动了程序,但是它没有检测到任何东西,(当然它也没有发送任何东西)
我不知道是什么原因造成了这些错误。如果有人能帮助我,我将非常感激!

nukf8bse

nukf8bse1#

错误不在代码中,而是设置错误。
如果你想使用RFD868x与树莓派的GPIO串行端口,你必须启用串行接口,并必须禁用raspi-config中的串行登录shell。
接口选项串行端口中执行sudo raspi-config命令后,应使用以下设置:

我希望我帮助了别人。

相关问题