QByteArray WorkThread::getAtCmdResponse() { if (nullptr == serialPort) {return "";} QByteArray resp; while (serialPort->waitForReadyRead(20)) { qApp->processEvents(); resp += readSerialPort(); } qDebug()<<resp; return resp; }
时间: 2024-04-02 19:35:21 浏览: 160
这段代码是用来获取AT指令的响应的,首先判断QSerialPort对象是否为nullptr,如果是就返回一个空的QByteArray。然后定义一个QByteArray类型的resp变量,用来存储AT指令的响应。接着进入一个while循环,首先调用waitForReadyRead()函数等待串口有数据可读,如果等待时间超过20ms就退出循环。在等待期间,调用qApp->processEvents()函数可以处理一些其他的事件,比如界面的刷新等。等待期间如果有数据可读,就调用readSerialPort()函数读取所有可用的数据,并将其追加到resp变量中。最后输出resp变量的内容,并将其返回。需要注意的是,waitForReadyRead()函数也可能会阻塞程序,直到串口有数据可读为止。
相关问题
QByteArray WorkThread::readSerialPort() { if (nullptr == serialPort) {return "";} qint64 byteLen = serialPort->bytesAvailable(); if(byteLen < 0) { return ""; } return serialPort->readAll(); }
这段代码是用来读取串口数据的,先判断QSerialPort对象是否为nullptr,如果是就返回一个空的QByteArray。然后获取可用的字节数,如果小于0也返回一个空的QByteArray。最后调用QSerialPort的readAll()函数读取所有可用的数据,并将其封装到一个QByteArray对象中返回。这里需要注意,readAll()函数可能会阻塞程序,直到读取到数据为止。
bool WorkThread::checkAt() { QByteArray cmd = "at\r\n"; serialPort->readAll(); sendSerialData(cmd); QByteArray resp = removeResponseCmd(getAtCmdResponse(),cmd.simplified()).trimmed(); QByteArray ver; if (resp.indexOf(RESULT_OK) != -1) { return true; } else { return false; } }
这段代码实现了一个函数checkAt,作用是向串口发送AT指令,并检查返回结果是否为OK。具体实现步骤如下:
1. 定义一个QByteArray类型的变量cmd,赋值为"at\r\n",表示要发送的AT指令。
2. 调用serialPort的readAll函数,清空串口的缓冲区。
3. 调用sendSerialData函数,向串口发送AT指令。
4. 调用getAtCmdResponse函数,获取串口返回的数据,并存储在QByteArray类型的变量resp中。
5. 调用removeResponseCmd函数,去除resp中的指令响应信息,并将结果保存在QByteArray类型的变量resp中。
6. 使用trimmed函数去除resp中的空格,将结果保存在QByteArray类型的变量ver中。
7. 如果ver中包含RESULT_OK(一般为"OK")字符串,则返回true,表示AT指令执行成功。否则返回false,表示AT指令执行失败。
在这段代码中,还需要对sendSerialData、getAtCmdResponse、removeResponseCmd等函数进行进一步的了解,才能更好地理解checkAt函数的实现。
阅读全文