#没有用串口助手发数据,但是有数据发过来触发了readyread信号。
#我打开软件之后,点了两下发送(输入框无内容),然后点了打开串口,然后又点了两下发送(输入框无内容 ,结果他竟然触发了readyread信号。 串口参数是com5,110 6 1,none,none(初始化的参数,没有做过更改)。
#笔记本电脑没有连接外设(只用充电器和蓝牙鼠标)
#打印出来的消息是

代码:
#include "stdafx.h"
#include "AitThermometer.h"
#include <QSerialPortInfo>
AitThermometer::AitThermometer(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
m_Port = new QSerialPort();
m_Timer = new QTimer();
connect(ui.Send, SIGNAL(clicked()), this, SLOT(SendData()));
connect(ui.OpenPort, SIGNAL(clicked()), this, SLOT(OpenPort()));
connect(ui.ClosePort, SIGNAL(clicked()), this, SLOT(ClosePort()));
connect(ui.refresh, SIGNAL(clicked()), this, SLOT(refreshSerialList()));
connect(m_Port, SIGNAL(readyRead()), this, SLOT(ReadData()));
connect(m_Timer, &QTimer::timeout, this, &AitThermometer::ParseData);
Init();
}
AitThermometer::~AitThermometer()
{
}
void AitThermometer::SendData(QByteArray data)
{
if (!m_Port->isOpen()) {
m_Port->open(QIODevice::ReadWrite);
if (!m_Port->isOpen()) {
PrintText(QSFL8("串口打开失败"),1);
return;
}
}
m_Port->write(data);
PrintText(data, 1);
}
void AitThermometer::SendData(QString data)
{
SendData(data.toLocal8Bit());
}
//# 按钮发送数据
void AitThermometer::SendData()
{
QString str = ui.textEdit->toPlainText();
QByteArray data;
if (ui.checkBox->isChecked()) {
data += "\r\n";
}
if (ui.checkBox_2->isChecked()) {
data = QByteArray::fromHex(str.toLocal8Bit());
SendData(data);
}
else {
data = str.toLocal8Bit();
SendData(data);
}
}
void AitThermometer::ReadData()
{
wholedata =m_Port->readAll();
m_Timer->start(30);//30ms未收到数据就开始解析
}
//# 解析数据
void AitThermometer::ParseData()
{
QByteArray data = wholedata.toHex(' ').toUpper();//转16进制转大写
PrintText(QSFL8(data), 2);
quint8 func = quint8(wholedata[1]);
switch (func) {
case 0x03:
if (wholedata.size() == 9) {
{
uint32_t rawValue = 0;
rawValue |= (uint32_t(quint8(wholedata[3])) << 24);// 拼接第 1 字节(最高位)
rawValue |= (uint32_t(quint8(wholedata[4])) << 16);// 拼接第 2 字节
rawValue |= (uint32_t(quint8(wholedata[5])) << 8);// 拼接第 3 字节
rawValue |= (uint32_t(quint8(wholedata[6])));
std::memcpy(&m_Temp, &rawValue, sizeof(float));
}
}
break;
default:
break;
}
wholedata.clear();
m_Timer->stop();
PrintText(QSFL8("温度=%1").arg(m_Temp), 2);
}
void AitThermometer::Init()
{
{
refreshSerialList();
ui.DataBits->addItem(QString::number(6), QSerialPort::Data6);//数据位
ui.DataBits->addItem(QString::number(7), QSerialPort::Data7);
ui.DataBits->addItem(QString::number(8), QSerialPort::Data8);
ui.StopBits->addItem(QString::number(1), QSerialPort::OneStop);//停止位
ui.StopBits->addItem(QString::number(1.5), QSerialPort::OneAndHalfStop);
ui.StopBits->addItem(QString::number(2), QSerialPort::TwoStop);
ui.Parity->addItem("None", QSerialPort::NoParity);//校验
ui.Parity->addItem("Even", QSerialPort::EvenParity);
ui.Parity->addItem("Odd", QSerialPort::OddParity);
ui.FlowControl->addItem("None", QSerialPort::NoFlowControl);//流控制
ui.FlowControl->addItem("RTS/CTS (Hardware)", QSerialPort::HardwareControl);
ui.FlowControl->addItem("XON/XOFF (Software)", QSerialPort::SoftwareControl);
}
}
//# 保存串口参数
void AitThermometer::SavePort()
{
}
//# 打印消息
void AitThermometer::PrintText(QString str, int type)
{
QDateTime Time = QDateTime::currentDateTime();
ui.textBrowser->append(QString("<font color=\"gray\">%1:</font>").arg(Time.toString("yyyy-MM-dd-hh-mm-ss")));
if (type == 1) {
ui.textBrowser->append(QString("<font color=\"green\">%1</font>").arg(str));
}
else {
ui.textBrowser->append(QString("<font color=\"blue\">%1</font>").arg(str));
}
}
bool AitThermometer::OpenPort()
{
if (m_Port->isOpen()) {
m_Port->close();
}
m_Port->setPortName(QString(ui.PortNum->currentText()));
m_Port->setBaudRate(ui.BaudRate->currentData().toInt());
/*
ui.FlowControl->addItem("None", QSerialPort::NoFlowControl);//流控制
currentText拿的是None,currentData拿的是QSerialPort::NoFlowControl
*/
m_Port->setDataBits((QSerialPort::DataBits)ui.DataBits->currentData().toInt());
m_Port->setStopBits((QSerialPort::StopBits)ui.StopBits->currentData().toInt());
m_Port->setFlowControl((QSerialPort::FlowControl)ui.FlowControl->currentData().toInt());
m_Port->setParity((QSerialPort::Parity)ui.Parity->currentData().toInt());
m_Port->open(QIODevice::ReadWrite);//读写模式
if(!m_Port->isOpen()) {
PrintText(QSFL8("串口打开失败"), 1);
return false;
}
else {
PrintText(QSFL8("串口打开成功"), 1);
return true;
}
}
void AitThermometer::ClosePort()
{
m_Port->close();
}
//# 刷新
void AitThermometer::refreshSerialList()
{
ui.PortNum->clear();//串口号
for (const QSerialPortInfo &info :QSerialPortInfo::availablePorts())
{
ui.PortNum->addItem(info.portName());
}
ui.BaudRate->clear();//波特率
for (const qint32 baud: QSerialPortInfo::standardBaudRates()) {
ui.BaudRate->addItem(QString::number(baud),baud);
}
}