指令说明
执行指令
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>