- 串口配置
- 串口接收数据
- 引入第三方库QCustomPlot
- 动态绘图
串口接收数据
串口接收数据用到QSerialPort::readyRead,每当有新数据可从设备的当前读取通道读取时,该信号就会发出一次。只有当新数据可用时,才会再次发出。
connect(mySerialPort,&QSerialPort::readyRead,this,&Widget::dealreadyRead);
信号:readyRead;槽函数:void Widget::dealreadyRead()。其中,槽函数中即为我们对接收信号的处理解析代码,利用readAll进行读取操作。
widget.h
public:
explicit Widget(QWidget *parent = 0);
~Widget();
void dealreadyRead();
double recivedata;
QDateTime current_date_time;
QString current_date;
private:
Ui::Widget *ui;
QByteArray temp;
widget.c
void Widget::dealreadyRead()
{
if(true == mIsOpen)
{
current_date_time = QDateTime::currentDateTime(); //获取当前系统时间
double t = (double)(QDateTime::currentMSecsSinceEpoch()) / 1000.0;//动态绘图用到
current_date = current_date_time.toString("yyyy.MM.dd hh:mm:ss.zzz");//时间格式
temp = mySerialPort->readAll(); //读取串口数据
if(ui->sixteen->isChecked() == false) //sixteen 判断是否勾选十六进制的复选框
{
ui->textEdit->append(current_date.append(temp));
}
else //十六进制显示
{
QDataStream out(&temp,QIODevice::ReadWrite);
while(!out.atEnd())
{
qint8 outChar = 0;
out>>outChar;
QString str = QString("%1").arg(outChar&0xFF,2,16,QLatin1Char('0'));//十六进制
ui->textEdit->insertPlainText(str.toUpper());
ui->textEdit->insertPlainText(" ");
ui->textEdit->moveCursor(QTextCursor::End);
}
}
QString data = QString(temp);
QString strs;
for(int j = 0; j < data.length(); j++)
{
if(data[j] >= '0' && data[j] <= '9')
strs.append(data[j]);
}
recivedata = strs.toDouble();
//draw(t,recivedata); //绘制曲线函数
}
}
接收数据保存至指定路径下的代码设置void Widget::on_save_data_clicked()
widget.h
private slots:
void on_save_data_clicked(); //按键转到槽
widget.c
void Widget::on_save_data_clicked()
{
QString textFile = QFileDialog::getSaveFileName(this,tr("Save txt"),".数据.txt",tr("text (*.txt)")); //选择路径
QFile file(textFile);//文件命名
if(!file.open(QFile::WriteOnly | QFile::Text)) //检测文件是否打开
{
QMessageBox::information(this, "Error Message", "Please Select a Text File!");
return;
}
QTextStream out(&file); //分行写入文件
out << ui->textEdit->toPlainText();
}
本节主要针对串口接收数据处理和数据保存的代码分析,下图是工程界面的布局图以及每个控件对应的对象名称,仅供参考学习。感谢分享和关注,可以留言一起交流。