2. 移远RM500 AT指令串口读取

该Python脚本用于查找特定类型的串口(如QuectelUSBAT,DM,NMEAPort),初始化串口并发送AT命令,同时进行周期性的网络Ping测试。它使用多线程分别执行串口通信和网络诊断任务,并将结果记录到日志文件rm500_qeng.txt中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import serial
import serial.tools.list_ports
import time
from datetime import datetime
import subprocess  #subprocess代替os操作
import threading
import sys
from pythonping import ping
import os


def portlist():
    Port_at = ["AT", "DM", "NMEA"]
    plist = list(serial.tools.list_ports.comports())
    if len(plist) == 0:
        print("无可用的串口")
    else:
        for i in range(0,len(plist)):
            #print(plist[i].name,":",plist[i])
            if "Quectel USB AT Port" in str(plist[i]):
                Port_at[0] = str(plist[i].name)
##                print("找到AT串口 = ", plist[i].name)
            if "Quectel USB DM Port" in str(plist[i]):
                Port_at[1] = str(plist[i].name)
##                print("找到DM串口 = ", plist[i].name)
            if "Quectel USB NMEA Port" in str(plist[i]):
                Port_at[2] = str(plist[i].name)
##                print("找到NMEA串口 = ", plist[i].name)
    return Port_at


#定义serial log()子程序,循环写命令和读数据
def serial_log():
    time_start = datetime.now()
    time_step = 1
    CMD1 = 'AT+QENG="servingcell"\r\n'
    Port_at = portlist()
    if Port_at != "AT":
        ser_at = serial.Serial(str(Port_at[0]), 115200, timeout=0.1)
        ser_at.write("AT+CFUN = 0 \r\n".encode())
        time.sleep(1)
        ser_at.write("AT+CFUN = 1 \r\n".encode())
        time.sleep(1)
        print("初始化完成!")
    while True:
        try:            
            tmp_str = ser_at.readline().decode('utf-8').rstrip()
            # 写命令:
            time_interval = datetime.now() - time_start
            tmp_str = ser_at.readline().decode('utf-8').rstrip()
            if time_interval.total_seconds() >= time_step:
                ser_at.write(CMD1.encode())
                time_start = datetime.now()
            # 读数据
            if "+QENG: " in tmp_str :
                print(tmp_str)
                localtime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
                f = open('rm500_qeng.txt','a')
                f.write(localtime + "," + tmp_str + "\n")
                f.close()
        except serial.SerialException:
            print("serial.SerialException")
            time.sleep(1)


#定义ping_log()子程序,读取ping数据
def ping_log():
    IP_addr = "8.8.8.8"
    ping_count = 4
    while True:
        localtime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        process = ping(IP_addr, size=32, count=4, timeout=1)
        ping_avg = str(process.rtt_avg_ms)
        print("ping_avg = ",ping_avg)
        f = open('rm500_qeng.txt', 'a')
        f.write(localtime + ",ping_avg:" + ping_avg+'\n')
        f.close()
        time.sleep(1)



#程序初始化
f = open('rm500_qeng.txt','w')   #定义log存放文件
localtime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print(localtime)

#生成线程实例
threads = []  #定义启动的线程集合
t1 = threading.Thread(target=ping_log(), args=())  
threads.append(t1)

t2 = threading.Thread(target=serial_log(), args=())  
threads.append(t2)

if __name__ == '__main__':
    
    for t in threads:
        t.start()
        print("线程启动:",t)
    for t in threads:
        t.join()
    print("退出线程")
    

target后面带参数不用带括号

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值