文章内容主要分为以下几个部分:
1.基本信息的解释
2.获取基本的串口信息(端口号,波特率,数据位,停止位,校验位,流控位)
3.在没有串口的条件下使用虚拟串口工具,串口调试助手
4.对传来的信息进行解析
5.对传来的数据进行显示
引用文章(链接):串口参数详解:波特率,数据位,停止位,奇偶校验位
串口:
波特率
数据位
停止位
奇偶校验位
比特率
QT += serialport
QSerialPort serial;
foreach(const QSerialPortInfo &Info, QSerialPortInfo::availablePorts()) { //读取串口信息
serial.setPort(Info);
//如果串口是可以读写方式打开的
if( serial.open(QIODevice::ReadWrite) ) {
//在comboBox那添加串口号
ui->devicesComboBox->addItem(Info.portName());
//然后自动关闭等待人为开启(通过那个打开串口的PushButton)
serial.close();
}
}
void MainWindow::initBaudrateComboBox() {
ui->baudrateComboBox->clear();
foreach(const qint32 var, QSerialPortInfo::standardBaudRates()) {
ui->baudrateComboBox->addItem(QString::number(var), QVariant::fromValue(var));
}
ui->baudrateComboBox->setCurrentText("9600");
}
void MainWindow::initStopbitsComboBox() {
ui->stopBitsComboBox->clear();
QMetaEnum stopBitsEnum = QMetaEnum::fromType<QSerialPort::StopBits>();
for (int i = 0; i < stopBitsEnum.keyCount(); i++) {
if (stopBitsEnum.value(i) != QSerialPort::UnknownStopBits) {
ui->stopBitsComboBox->addItem(stopBitsEnum.key(i), QVariant::fromValue(stopBitsEnum.value(i)));
}
}
}
void MainWindow::initDatabitsComboBox() {
ui->databitsComboBox->clear();
QMetaEnum dataBitsEnum = QMetaEnum::fromType<QSerialPort::DataBits>();
int defaultIndex = 0;
for (int i = 0; i < dataBitsEnum.keyCount(); i++) {
if (dataBitsEnum.value(i) != QSerialPort::UnknownDataBits) {
ui->databitsComboBox->addItem(dataBitsEnum.key(i), QVariant::fromValue(dataBitsEnum.value(i)));
if (dataBitsEnum.value(i) == QSerialPort::Data8) {
defaultIndex = i;
}
}
}
ui->databitsComboBox->setCurrentIndex(defaultIndex);
}
void MainWindow::initParityComboBox() {
ui->parityComboBox->clear();
QMetaEnum parityEnum = QMetaEnum::fromType<QSerialPort::Parity>();
for (int i = 0; i < parityEnum.keyCount(); i++) {
if (parityEnum.value(i) != QSerialPort::UnknownParity) {
ui->parityComboBox->addItem(parityEnum.key(i), QVariant::fromValue(parityEnum.value(i)));
}
}
}
void MainWindow::initControlComboBox() {
ui->controlComboBox->clear();
QMetaEnum flowEnum = QMetaEnum::fromType<QSerialPort::FlowControl>();
for (int i = 0; i < flowEnum.keyCount(); i++) {
if (flowEnum.value(i) != QSerialPort::UnknownFlowControl) {
ui->controlComboBox->addItem(flowEnum.key(i), QVariant::fromValue(flowEnum.value(i)));
}
}
}
//信号和槽,这个和socket通信很像
connect(&serialPort, &QSerialPort::readyRead, this, &MainWindow::readBytes);
//cpp
void MainWindow::readBytes() {
QByteArray bytes = serialPort.readAll();
}
//h
private slots:
void readBytes();
void MainWindow::on_sendPushButton_clicked() {
if (!serialPort.isOpen()) {
QMessageBox::warning(this, tr("设备错误"), tr("请打开设备后尝试"));
return;
}
QByteArray data = InputData(rawData, inputFormat);
if (serialPort.write(data)) {
QString outputText = OutputData(data, outputFormat, true);
//ui->textBrowser->append(outputText);
}
}
//输出格式处理
QString MainWindow::OutputData(QByteArray rawData, int format, bool tx) {
QString outputString = QString("[%1 %2]")
.arg(QDateTime::currentDateTime().toString("hh:mm:ss"))
.arg(tx ? QString("Tx") : QString("Rx"));
outputString = QString("%2").arg(outputString);
QString dataString;
if (format == MainWindow::OutputHex) {
dataString = rawData.toHex(' ');
} else if (format == MainWindow::OutputUtf8) {
dataString = QString::fromUtf8(rawData);
} else if (format == MainWindow::OutputAscii) {
dataString = QString::fromLatin1(rawData);
} else if (format == MainWindow::OutputSystem) {
dataString = QString::fromLocal8Bit(rawData);
}
dataString = QString("%2").arg(dataString);
outputString.append(dataString);
return outputString;
}
// 输入数据格式处理
QByteArray MainWindow::InputData(QString rawData, int format) {
QByteArray inputData;
if (format == MainWindow::InputHex) {
rawData = rawData.trimmed();
QStringList stringList = rawData.split(' ');
for (auto var : stringList) {
if (var.length()) {
quint8 byte = var.toInt(Q_NULLPTR, 16);
inputData.append(byte);
}
}
} else if (format == MainWindow::InputAscii) {
inputData = rawData.toLatin1();
} else if (format == MainWindow::InputSystem) {
inputData = rawData.toLocal8Bit();
}
return inputData;
}
消息解析(按字节)(这里消息解析的有点粗糙,以后如果有时间再修改一下这部分)
QString str = bytes.toHex(' ');//转换成字符串
QStringList strList = str.split(' ');//字符串分割,将每个字节的字符取出
QByteArray by1 = strList[beginNum + 30].toUtf8();
bool ok;
QVector <int> bytesList;//将字节转换成16进制数用来做之后的移位和整合操作
for(int i = 0; i < strList.size(); i++) {
bytesList.append(strList[i].toUtf8().toInt(&ok, 16));
}
创作不易,如果觉得还可以,请点赞支持一下。