前言
这篇文章继续介绍 自制串口助手。了解更多请阅读:串口助手(上):布局、图标、串口显示与实时时间
一、串口接收数据
- 默认接收,换行,hex显示
串口接收数据时,可以选择 “接收时间”, ” HEX显示”, “自动换行”。
在 Qt 中,通过 QSerialPort 的 read( ) 函数可以实现串口的读取数据。
QSerialPort 会在串口有数据收到时发出 readyRead( ) 信号,可以在其槽函数里进行数据的接收。
// 连接信号与槽
connect(serial, SIGNAL(readyRead()), this, SLOT(receiveData()));
void Widget::receiveData()
{
QByteArray data = serial->readAll(); // readAll() 读取串口缓冲区的所有数据
bytesReceive += QString(data).size(); // size() 获取接收数据的字节大小
qDebug() << bytesReceive;
// 检查读取是否成功
if (data.isEmpty())
{
qDebug() << "Failed to read the data from serial port";
return;
}
// 处理数据
if(ui->checkBox_7->isChecked()) // toHex() 转换为 hex
{
QString hexString = data.toHex(' ');
ui->plainTextEdit->insertPlainText(hexString);
}
else if(ui->checkBox_10->isChecked()) // appendPlainText()换行
{
ui->plainTextEdit->appendPlainText(QString(data));
}
else if(ui->checkBox->isChecked()) // 接收时间
{
// currentDateTime ()获取当前时间
QDateTime currentTime = QDateTime::currentDateTime();
// 显示接收时间
QString strDateTime = currentTime.toString(QString("【") + "yyyy-MM-dd hh:mm:ss" + QString("】 "));
ui->plainTextEdit->insertPlainText(strDateTime);
ui->plainTextEdit->insertPlainText(QString(data));
}
else
{
ui->plainTextEdit->insertPlainText(QString(data)); // 默认数据接收,
}
ui->label_13->setText("Received: " + QString::number(bytesReceive));
}
注意:
appendPlainText(const QString &text ) : 将带有文本的新段落附加到文本编辑的末尾。
insertPlainText ( const QString &text) : 在当前光标位置插入文本的便利插槽。
setPlainText(const QString &text): 将文本编辑的文本更改为字符串文本。将删除任何以前的文本。
- 清空接收区数据
使用 clear( ) 函数可以清空接受区的数据。
ui->plainTextEdit->clear();
- 保存接受区数据
使用 文件对话框类QFileDialog 中的静态函数 getSaveFileName 函数 ,返回用户选择要保存的文件路径 ( filename )。
创建一个 QFile 对象 ( file ),以写入模式( QIODevice::WriteOnly ) 打开文件。
使用 QTextStream 创建一个数据流 ( out ),将文件与数据流关联。
使用了 QPlainTextEdit 的 toPlainText( ) 函数来获取 接受区 中的所有纯文本数据。
使用数据流将 接受区中的文本写入到文件中。
详细代码:
/*得到要保存的的文件名*/
QString filename = QFileDialog::getSaveFileName(this, "另存为", "C:/", tr("Text Files(*.txt)"));
/*判断文件名是否为空,文件是否保存成功*/
if(!filename.isEmpty())
{
QFile file(filename);
if(file.open(QIODevice::WriteOnly))
{
QTextStream out(&file); //数据流 写数据进文件
out << ui->plainTextEdit->toPlainText();
file.close(); // 关闭文件
}
}
效果展示:
二、串口发送数据
- 默认发送
使用 QSerialPort 类的 write( ) 函数进行发送。
write( ) 返回值 是 实际写入的字节数.
write(const char *data);
void Widget::sendData()
{
QString data = ui->lineEdit_9->text(); // 获取要发送的文本
// 由于data 是QString ,需要转换为 const char *
QByteArray byteArray = data.toUtf8(); // 1.将QString -> QByteArray
const char *data1 = byteArray.data(); // 2.获取 QByteArray 的数据指针
int Send = serial->write(data1); // 3.发送数据,返回写发送的字节数
bytesSend += Send; // 累计发送数据的个数
ui->label_14->setText("Send: " + QString::number(bytesSend));
}
按下 “ 发送” 按钮,发送数据:
void Widget::on_send_clicked()
{
sendData();
}
- 定时发送
通过自己设置的时间间隔来定时发送数据。
定时发送 需要依靠于定时器类 QTimer 。
// 创建定时器对象
QTimer timer2;
timer2.setInterval(ui->ms_time->text().toInt()); // toInt将字符串转换为int类型。获取,设置时间间隔。
timer2.start(); // 启动定时器
// 连接信号与槽,到达时间间隔则进入 timerSend 槽函数
connect(&timer2,SIGNAL(timeout()),this,SLOT(timerSend()));
void Widget::timerSend() // 定时发送数据
{
if(ui->checkBox_11->isChecked())
{
timer2.setInterval(ui->ms_time->text().toInt()); //更新右下角时间
sendData();
}
}
效果如下图:
三、串口助手优化
- 设置组合框当前内容。
当 组合框 中有多个选项卡时,可以使用 setCurrentIndex( ) 函数来选择当前显示的选项卡。
参数 index 要显示的选项卡的索引值,选项卡的索引值从 0 开始计数。
void setCurrentIndex(int index);
- 未检测到串口,弹出警告。
使用 QMessageBox 类的 静态成员函数 warning 来弹出消息对话框。
QMessageBox::warning(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = QMessageBox::Ok, QMessageBox::StandardButton defaultButton = QMessageBox::NoButton)
其中:
parent:指定该对话框所属的父组件,通常传入 this 即可,代表当前组件。
title:警告对话框的标题。
text:警告对话框的内容(警告信息)。
buttons:指定对话框上出现的按钮。默认情况下只会显示 OK 按钮。可以选择其他的按钮,如 Yes、No、Cancel、Apply、Close 等。
defaultButton:指定哪个按钮应该被默认选中。默认情况下不会有默认选中的按钮。
- 载入文件
如果我们使用多文本发送数据,可以点击 ” 载入”,即可将保存好的文本在文本框中显示,直接发送即可。
// 1.打开文件对话框选择要打开的文件,并返回其路径
QString fileName = QFileDialog::getOpenFileName(this, "打开列表", "C:/Users/w/Desktop/test1", tr("Text Files(*.txt)"));
// 2. 根据路径创建 QFile 对象
QFile file(fileName);
QString one = "";
QString two = "";
// 3. 以可读可写的模式打开文件
if (file.open(QIODevice::ReadOnly | QIODevice::Text))
{
// 4.创建一个数据流 in,将文件与数据流关联
QTextStream in(&file);
// 5. 数据流读出数据
in >> one;
in >> two;
// 6. 将文本显示在文本框中
ui->lineEdit->setText(one);
ui->lineEdit_2->setText(two);
// 关闭文件
file.close();
}
总结
大家可以在此基础上 对自制的 串口助手 加以改进和开发。
————————————————
原文链接:https://blog.csdn.net/wuyiyu_/article/details/131095564