MAVLink 与 RFD868x 的通信不可靠

问题描述 投票:0回答:1

我正在开发一个带有 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])

这里我以正确的顺序启动了程序,但它没有检测到任何东西,(当然它也没有发送任何东西)

我不知道,这个错误的原因是什么。如果有人可以提供帮助,我将非常感激!

python-3.x communication serial-communication mavlink
1个回答
0
投票

错误不在代码中,而是设置错误。

如果您想将 RFD868x 与树莓派的 GPIO 串行端口一起使用,您必须启用串行接口,并且必须禁用串行登录外壳

raspi-config
.

Interface Options
Serial Port中的sudo raspi-config命令之后,应使用以下设置:

我希望我帮助了别人。

© www.soinside.com 2019 - 2024. All rights reserved.