目录
实现串口模块的配置(1)
完成了基本的界面设计后,我们就要着手实现功能。下来的几章我们看串口数据收发的功能怎么实现。
首先我需要阐明的是,由于做嵌入式开发,相信大部分人学习的是C语言,而QT用的是C++,那么用C语言的知识能否完成这个上位机的工作呢?我的回答是可以的。
逐步来分析整个实现过程:
一、先列举需要思考的问题:
- 怎么实现点击刷新按钮后,串口工具可以自动发现可用的COM口,并将com口显示在Combobox1?
- 如何添加所有可用的波特率?同样给其他Combobox添加相关的值?
- 如何在点击“打开”按钮后,串口 即可使用,同时所有Combobox置为不可用状态,按钮字体转变为“关闭”?
- 如何在点击“清空接收区”按钮后,将接收区的数据清除?
- 如何在点击“暂停接收区”按钮后,接收不再接收数据?
- 如何实现自动清除功能?十六进制显示功能?
- 如何实现十六进制发送功能?自动发送功能,发送可按照间隔时间发送?
- 如何在点击“清空”按钮后,将Rx:Tx:的值显示为0?
二、所有的问题要由简单到复杂逐一解决
1、先从Combobox入手,选中后双击,点击左下角“+”号,就可以直接在界面添加参数列表,所有Combobox操作方式一样。
2、处理简单的按钮问题:怎么实现点击“打开”按钮后变为“关闭”:
这里就要从代码入手,怎么办?通过网络大概可以了解到对按钮的动作要进行事件响应,QT通过“槽”机制实现,选中按钮,转到槽,在弹出的窗口中我们可以看到关于槽的函数:
可以推断按钮的点击可以是clicked();确定后看会是什么结果。
QT自动帮我们定义了一个函数:
-
void MainWindow::on_pB_Open_clicked()
-
-
{
-
-
}
为了便于调用函数,我们对所有控件进行重命名,它跟生成的函数名是相关的。
至于MainWindow:: 部分显然是C++的语法,暂时不需要去理解,只知道人家就是这样用的,不乱该改就行。
那么on_pB_Open_clicked()这个函数的声明在哪里,搜一下,就知道:
-
class MainWindow :
public QMainWindow
-
-
{
-
-
Q_OBJECT
-
-
-
-
public:
-
-
explicit MainWindow(QWidget *parent = 0);
-
-
~MainWindow();
-
-
private slots:
-
-
-
void on_pB_Open_clicked();
-
-
}
整个结构还是C++的用法,那么可以推知:其他生成的函数也是在private slots:槽部分声明的。如果我们自定义一个槽函数也可以放到这里,知道这些足够。
我们的功能必然在这个函数体内来是实现,通过网络得知QT对空间的操作是通过ui变量来操作的,输入“ui->”QT编译器自动获取按钮的对象名称。下来的问题就是如何获取按钮的text属性“打开”,然后再改为“关闭”, ui->pB_Open->text()就可以。
if(ui->pB_Open->text()==tr("打开")) 这样就可以实现,
-
if(ui->pB_Open->text()==tr(
"打开"))
-
-
{
-
-
ui->pB_Open->setText(tr(
"关闭"));
-
-
}
-
-
else
-
-
{
-
-
ui->pB_Open->setText(tr(
"打开"));
-
-
}
以上就是最简单的实现代码,可以运行看看效果。
Combobox的操作就是 …->setEnabled(false); …->setEnabled(true);
其他一些简单的槽函数都可以实现,比如清零、清空等操作。
3、串口调试工具要实现串口操作,就需要Qserialport 模块,这个直接可以通过网络知道。
如何在系统上获取可用串行端口的列表呢?
实现步骤:
1)打开.pro文件;添加一行:QT += serialport
2)mainwindow.h 头文件里边添加
-
#include
<QtSerialPort/QSerialPort>
-
#include
<QtSerialPort/QSerialPortInfo>
-
3)在private:创建串口对象比如QSerialPort *my_serialport;
-
和ui对象在同一个作用域。ui能在哪调用my_serialport就能在哪调用。
-
有了串口对象就可以使用它的资源。
4)去“打开”按钮的槽函数void MainWindow::on_pB_Open_clicked()
加入一下两句:
my_serialport= new QSerialPort();
my_serialport->setPortName(ui->cB_COM->currentText());
就可以获取当前可用的串口列表。
但是在这之前我们先要通过“刷新”按钮查找系统里的串口。去它的槽函数通过foreach()实现查找:
-
foreach (
const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
-
-
{
-
-
QSerialPort serial;
-
-
serial.setPort(info);
-
-
if (serial.open(QIODevice::ReadWrite))
-
-
{
-
-
ui->cB_COM->clear();
-
-
ui->cB_COM->addItem(info.portName());
-
-
ui->textBrowser->append(tr(
"检测到端口列表:"));
-
-
ui->textBrowser->append(info.portName());
-
-
ui->textBrowser->append(info.description());
-
-
ui->textBrowser->append(info.manufacturer());
-
-
-
ui->cb_BaudRate->setCurrentIndex(Baud9600);
//默认9600
-
-
serial.close();
-
-
}
-
-
else
-
-
{
-
-
ui->textBrowser->append(tr(
"未检测端口列表:"));
-
-
}
-
-
}
打开串口之后就可以做一些其他操作:
-
if (my_serialport->open(QIODevice::ReadWrite))
-
-
{
-
-
ui->cB_COM->clear();
// 清除列表
-
-
ui->cB_COM->addItem(my_serialport->portName());
//添加端口
-
-
ui->textBrowser->append(tr(
"检测到端口:"));
// 在接收文本区显示信息
-
-
ui->pB_Open->setText(tr(
"关闭"));
// 将按钮的“打开”改为“关闭”
-
-
-
-
}
-
-
else
-
-
{
-
-
ui->textBrowser->append(tr(
"未检测端口:"));
-
-
}
其余的就是 设置波特率的值,数据位,校验位等。
-
my_serialport->setBaudRate(ui->cb_BaudRate->currentText().toInt());
-
-
-
switch(ui->cB_Parity->currentIndex())
-
-
{
-
-
-
case
0: my_serialport->setParity(QSerialPort::NoParity);
break;
-
-
case
1: my_serialport->setParity(QSerialPort::OddParity);
break;
-
-
case
2: my_serialport->setParity(QSerialPort::EvenParity);
break;
-
-
case
3: my_serialport->setParity(QSerialPort::SpaceParity);
break;
-
-
case
4: my_serialport->setParity(QSerialPort::MarkParity);
break;
-
-
-
default:
break;
-
-
-
}
-
-
switch(ui->cB_Data->currentIndex())
-
-
{
-
-
-
case
0: my_serialport->setDataBits(QSerialPort::Data8);
break;
-
-
case
1: my_serialport->setDataBits(QSerialPort::Data7);
break;
-
-
case
2: my_serialport->setDataBits(QSerialPort::Data6);
break;
-
-
case
3: my_serialport->setDataBits(QSerialPort::Data5);
break;
-
-
case
4: my_serialport->setDataBits(QSerialPort::Data4);
break;
-
-
-
default:
break;
-
-
-
}
-
-
-
switch(ui->cb_stop->currentIndex())
-
-
{
-
-
-
case
0: my_serialport->setStopBits(QSerialPort::OneStop);
break;
-
-
case
1: my_serialport->setStopBits(QSerialPort::OneAndHalfStop);
break;
-
-
case
2: my_serialport->setStopBits(QSerialPort::TwoStop);
break;
-
-
-
default:
break;
-
-
-
}
其余的流控制、RTS、DTR等以后根据需要可以添加。
运行一下,看看结果.
刷新
打开
下一章我们继续其他问题的处理。【没有C币可用,希望大大们打赏打赏,在此答谢!!!】
转载:https://blog.csdn.net/xiaoeleis/article/details/117361344