Qt之AT指令解析

指令说明

执行指令

        AT+[CMD]\r\n
                |->OK\r\n
                |->ERR\r\n

查看某指令当前的值
        AT+[CMD]=?\r\n
                |->AT+[CMD]=n1,n2...\r\n

列出所有支持功能,rwx表示可读/可写/写执行
        AT+[CMD]?\r\n
                |->AT+[CMD]=<rwx>,<设置值1,设置值2,设置值3>\r\n        //可选择值
        例如:|->AT+[CMD]=<rwx>,<0,255,1>\r\n                       //数值范围0-255,间隔值为1

设置命令当前值
        AT+[CMD]=n1,n2...\r\n
                |->OK\r\n
                |->ERR\r\n

上报命令

|->AT+[cmd]=n1,n2...\r\n         //n1,n2..这些参数可以没有

错误命令

|->ERR=n\r\n       //n可以填入不同的错误码,进行返回

代码展示

configuart.cpp

#include "configuart.h"
#include "appdata.h"
#include <QFile>

#define UART_NAME           ("ttyS0")
#define UART_BAUD_RATE      (QSerialPort::Baud115200)

ConfigUart::ConfigUart(QObject *parent) :
    QObject(parent),
    m_uart(nullptr)
{
    initCmdDesc();

    m_uart = new QSerialPort(this);
    m_uart->setPortName(UART_NAME);
    if (!m_uart->open(QIODevice::ReadWrite)) {
        //该串口无法打开
        qDebug()<<"can't open "<< UART_NAME;
        return ;
    }

    m_uart->setBaudRate(UART_BAUD_RATE, QSerialPort::AllDirections);
    m_uart->setDataBits(QSerialPort::Data8);
    m_uart->setParity(QSerialPort::NoParity);
    m_uart->setStopBits(QSerialPort::OneStop);
    m_uart->setFlowControl(QSerialPort::NoFlowControl);

    QObject::connect(m_uart, &QSerialPort::readyRead, this, &ConfigUart::rxDataSlot);
}

void ConfigUart::sendPacket(const QString & cmd, const QString &data)
{
    QString outStr = "|->AT+"+cmd;
    if (!data.isEmpty())
    {
        outStr.append("=");
        outStr.append(data);
    }
    outStr.append("\r\n");
    m_uart->write(outStr.toLocal8Bit());
}

void ConfigUart::sendReply(bool ok, int code)
{
    QString outStr = (ok)?("|->OK"):("|->ERR");
    if (code > 0) {
        outStr.append("=");
        outStr.append(QString::number(code));
    }
    outStr.append("\r\n");
    m_uart->write(outStr.toLocal8Bit());
}

void ConfigUart::rxDataSlot()
{
    m_uartRxStr.append(m_uart->readAll());
    qDebug()<<"config rx="<<m_uartRxStr;

    if (m_uartRxStr.isEmpty())
        return ;

    do {
        int endIndex = m_uartRxStr.indexOf("\r\n", 0);
        if (endIndex == 0)
            break;
        int startIndex = m_uartRxStr.indexOf("AT+", 0, Qt::CaseInsensitive);
        if (startIndex >= endIndex) {
            m_uartRxStr.remove(0, startIndex);
            continue;
        }
        //remove AT+
        startIndex += 3;
        QString cmdStr = m_uartRxStr.mid(startIndex, endIndex-startIndex);
        if (cmdStr.endsWith("=?") == true)
            cmdParseGet(cmdStr.left(cmdStr.length() - 2));
        else if (cmdStr.endsWith("?") == true)
            cmdParseQuery(cmdStr.left(cmdStr.length() - 1));
        else if (cmdStr.contains("=") == true)
        {
            QStringList cmdList = cmdStr.split("=");
            if (cmdList.length() == 2)
            {
                bool ret = cmdParseSet(cmdList.at(0), cmdList.at(1));
                if (ret) sendReply(true);
            } else {
                sendReply(false, ERR_LEN);
            }
        }else{
            bool ret = cmdParseExecute(cmdStr);
            if (ret) sendReply(true);
        }
        m_uartRxStr.remove(0, endIndex+2);
    }while(m_uartRxStr.isEmpty() == false);
}

void ConfigUart::initCmdDesc()
{
    QFile cmdFile(":/new/prefix1/cmdDesc");
    bool ret = cmdFile.open(QIODevice::ReadOnly | QIODevice::Text);
    if (ret == false)
        return ;

    QTextStream in(&cmdFile);
    while(!in.atEnd())
    {
        QStringList tempList = in.readLine().split("=");
        m_cmdMap.insert(tempList.at(0), tempList.at(1));
        tempList.clear();
    }
    cmdFile.close();

    //qDebug()<<"des map = "<<m_cmdMap;
}

bool ConfigUart::cmdParseQuery(const QString &cmd)
{
    qDebug()<<"cmd query="<<cmd;
    QString descStr = m_cmdMap.value(cmd);
    if (descStr.isEmpty())
    {
        sendReply(false, ERR_NOT_CMD);
        return false;
    }

    if (descStr.contains("%") == true)
    {
        AppData * appData = AppData::getInstance();
        if (appData == nullptr)
            return false;
        QStringList cmdRandList;
        appData->getRangeValue(cmd, cmdRandList);
        descStr = descStr.arg(cmdRandList.join(","));
    }
    sendPacket(cmd, descStr);

    return true;
}

bool ConfigUart::cmdParseExecute(const QString &cmd)
{
    qDebug()<<"cmd execute="<<cmd;
    AppData * appData = AppData::getInstance();
    if (appData == nullptr)
        return false;
    if (cmd == "ReadyPwrOff" || cmd == "picture" || cmd == "PrintScreen")
    {
        emit cmdExecuteSign(cmd);
        return false;
    }
    else{
        sendReply(false, ERR_NOT_CMD);
        return false;
    }

    return true;
}

bool ConfigUart::cmdParseSet(const QString &cmd, const QString &data)
{
    qDebug()<<"cmd set="<<cmd<<"data="<<data;
    AppData * appData = AppData::getInstance();
    if (appData == nullptr)
        return false;
    if (cmd == "recorde")
    {
        emit cmdSetSign(cmd, data);
        return false;
    }
    else if (cmd == "RealTime")
    {

    }else{
        sendReply(false, ERR_NOT_CMD);
        return false;
    }

    return true;
}

bool ConfigUart::cmdParseGet(const QString &cmd)
{
    qDebug()<<"cmd get="<<cmd;
    AppData * appData = AppData::getInstance();
    if (appData == nullptr)
        return false;
    if (cmd == "recorde")
    {

    }
    else if (cmd == "RedGain" ||
             cmd == "GreenGain" || cmd == "BlueGain")
    {
        QString tempStr;
        appData->getSettingValue(cmd, tempStr);
        if (tempStr.isEmpty())
        {
            sendReply(false, ERR_NOT_CMD);
            return false;
        }
        sendPacket(cmd, tempStr);
    }
    else if (cmd == "RealTime")
    {

    }else{
        sendReply(false, ERR_NOT_CMD);
        return false;
    }

    return true;
}

configuart.h

#ifndef CONFIGUART_H
#define CONFIGUART_H

#include <QObject>
#include <QDebug>
#include <QtSerialPort/QtSerialPort>
#include <QtSerialPort/QSerialPortInfo>

#include "configs.h"

class ConfigUart : public QObject
{
    Q_OBJECT
public:
    enum errCode_e{
        ERR_NULL = 0,
        ERR_LEN,            //数据长度错误
        ERR_DATA,           //数据错误
        ERR_NOT_CMD,        //命令错误
        ERR_NOT_STORAGE,    //没有存储设备
        ERR_STORAGE_FULL,    //存储设备已满
    };

    explicit ConfigUart(QObject *parent = nullptr);

    void sendPacket(const QString & cmd, const QString & data);
    void sendReply(bool ok, int code = -1);

signals:
    void cmdExecuteSign(const QString & cmd);
    void cmdSetSign(const QString & cmd, const QString & data);

private slots:
    void rxDataSlot(void);

private:
    void initCmdDesc(void);
    bool cmdParseQuery(const QString & cmd);
    bool cmdParseExecute(const QString & cmd);
    bool cmdParseSet(const QString &cmd, const QString &data);
    bool cmdParseGet(const QString & cmd);

private:
    QSerialPort *           m_uart;
    QString                 m_uartRxStr;
    QMap<QString, QString>  m_cmdMap;
};

#endif // CONFIGUART_H

cmdDesc

ReadyPwrOff=<x>,<Prepare before shutting down,e.g.stop recording,etc>
recorde=<rw>,<start,stop>
picture=<x>,<taking pictures>

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Qt中执行Linux指令有两种常用的方法:使用QProcess类和使用system()函数。这两种方法都可以调用Linux命令行,并获取命令的执行结果。 使用QProcess类可以实现进程间通信,包括调用外部程序并获取程序的信息。您可以使用QProcess的start()方法来启动一个bash进程,并使用write()方法写入Linux指令。在写入指令时,需要注意在指令末尾添加换行符(\n)。这样可以确保指令能够被正确执行。然后,您可以使用QProcess的readAllStandardOutput()方法来获取命令的输出结果。 另一种方法是使用system()函数来执行Linux指令。您可以直接在代码中使用system("指令")的形式来执行Linux指令。然而,需要注意的是,system()函数无法直接获取命令的返回值。它只能返回一个整数值,一般来说,返回值为0表示命令执行成功。但无法确定命令的执行结果。所以,如果您需要根据命令的执行结果做出相应的判断,建议使用QProcess类。 以下是使用QProcess类和system()函数执行Linux指令的示例代码: 使用QProcess类: ``` QProcess process; process.start("bash"); process.write("ls\n"); // 执行ls指令 process.write("systemctl start firewalld.service\n"); // 执行启动firewalld服务的指令 process.closeWriteChannel(); // 关闭写通道 process.waitForFinished(); // 等待命令执行完毕 QString output = process.readAllStandardOutput(); // 获取命令的输出结果 ``` 使用system()函数: ``` system("ls"); system("systemctl start firewalld.service"); // 可以写任意数量的命令 int result = system("指令"); // 执行Linux指令并返回值 if (result == 0) { // 指令执行成功 } else { // 指令执行失败 } ``` 请注意,无论使用哪种方法,都需要确保您的程序具有足够的权限来执行所需的Linux指令

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kk电子粉丝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值