以上部分我们在上一章已经完成。
这一章我们完成剩余部分的内容。
暂停接收的有多种方法可以处理,我这里采用最简单的方式:直接关闭串口.
转到暂停接收的槽函数:
void MainWindow::on_pB_SuspendR_clicked()
{
if(ui->pB_SuspendR->text()==tr("暂停接收区"))
{
if(my_serialport->isOpen())
{
my_serialport->close();
ui->pB_SuspendR->setText(tr("继续接收区"));
}
}
else if(ui->pB_SuspendR->text()==tr("继续接收区"))
{
if(!my_serialport->isOpen())
{
my_serialport->open(QIODevice::ReadWrite);
ui->pB_SuspendR->setText(tr("暂停接收区"));
}
}
}
十六进制显示功能如何实现? 首先得接收数据,接收到数据后我们在进行数据的转换处理。
自定义一个槽函数my_ReadUart(),作数据接收处理。
注意:自定义函数的声明和定义。
在mainwindow.h
class MainWindow : public QMainWindow
{
...
private slots:
void my_ReadUart();//这里先定义串口接收数据槽函数
...
}
然后回到mainwindow.cpp,定义函数
void MainWindow::my_ReadUart()
{
QByteArray requestData;
static int flg=0;
requestData = my_serialport->readAll(); // 获取串口数据
if(requestData!= NULL)
{
if(!flg)
{
flg = 1;
ui->textBrowser->clear(); // 清除数据
}
cData = GetTemp_Uart(requestData);
if(ui->cB_Hex_R->isChecked()) // 判断checkbox 十六进制接收 是否选中
{
requestData = requestData.toHex();// 调用toHex()可直接转换
}
// 计算获取的数据长度 并显示
rxNum +=QString(requestData).length();
ui->lb_Rx->setNum(rxNum);
ui->textBrowser->append(tr(requestData));
OncbxChanged(); // 自动清除处理函数
}
requestData.clear();
}
同样的思路,串口数据发送的处理也就有了,记得函数声明哦。
static int txNum=0;
void MainWindow::SerialSendData()
{
if(ui->cB_Hex_S->isChecked())
{
my_serialport->write(ui->textEdit->toPlainText().toLatin1().toHex()); //十六进制的数据发送:
}
else
{
my_serialport->write(ui->textEdit->toPlainText().toLatin1());
my_serialport->write("\r\n");
}
rxNum += ui->textEdit->toPlainText().toLatin1().length();
ui->lb_Tx->setNum(rxNum);
}
自动发送的的处理,先将spinbox设定的时间转为整数后调用发送函数。
首先,在构造函数 定义一个发送对象,去默认初始化定时发送函数,
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{
....
timerSend = new QTimer(this);
timerSend->setInterval(1000);
connect(timerSend, SIGNAL(timeout()), this, SLOT(SerialSendData()));
.....
}
void MainWindow::on_cB_Auto_S_stateChanged(int arg1) // checkbox “自动发送”的槽函数
{
int time;
if(!arg1) //停止发送
{
timerSend->stop();
ui->spinBox->setEnabled(true);
}
else
{
time = ui->spinBox->text().toInt(); // 获取spinbox设定时间
if (time > 0)
{
timerSend->setInterval(time);
timerSend->start(time);
}
else
{
QMessageBox::warning(this, "警告", "时间必须大于0");
}
ui->spinBox->setEnabled(false);
}
}
基本这两章的任务就完成了。
下几章实现串口温度,AD数据读取,并用波形显示。
【没有C币可用,希望大大们打赏打赏,在此答谢!!!】