前言:
最近在学习嵌入式qt开发,然后跟着教程编写了一个简单的串口上位机程序,在编写的时候还算比较顺利,但在调试的时候花了点功夫,折腾了一下午。最后还是理清了思路,解决了问题,特写此博客进行记录和总结。
串口上位机界面设计:
整个软件的界面我都是用ui来设计的,其实也可以用代码,但是想了想有好多布局相互嵌套比较麻烦。最后就使用了ui界面来设计。
ui界面设计
串口上位机程序功能设计:
然后像串口对象初始化,槽函数,一些逻辑关系都用代码来实现,头文件就只有一些变量、槽的定义。
头文件
#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//lcd屏的分辨率是1024X600
this->setFixedSize(QSize(1024, 600));
//new 一个QSerialPort对象
serialPort = new QSerialPort(this);
//通过foreach语句将windows或imx6ull可用串口识别出来,并添加至对应的下拉选择框
QStringList serialList;
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()){
serialList += info.portName();
}
ui->comboBox->addItems(serialList);
//设置串口的信号与槽
connect(serialPort, SIGNAL(readyRead()), this, SLOT(readData()));
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_radioButton_clicked(bool checked)
{
//点击“打卡串口”button之后的一些串口配置操作,和一些逻辑关系
if(checked){
//设置串口端
serialPort->setPortName(ui->comboBox->currentText());
//设置波特率
serialPort->setBaudRate(ui->comboBox_2->currentText().toInt());
//设置停止位
serialPort->setStopBits(QSerialPort::StopBits(ui->comboBox_4->currentText().toInt()));
//设置数据位
serialPort->setDataBits(QSerialPort::DataBits(ui->comboBox_6->currentText().toInt()));
//设置校验位
switch(ui->comboBox_5->currentIndex()){
case 0:
serialPort->setParity(QSerialPort::Parity::NoParity);
break;
case 1:
serialPort->setParity(QSerialPort::Parity::EvenParity);
break;
case 2:
serialPort->setParity(QSerialPort::Parity::OddParity);
break;
case 3:
serialPort->setParity(QSerialPort::Parity::SpaceParity);
break;
case 4:
serialPort->setParity(QSerialPort::Parity::MarkParity);
break;
default:
break;
}
serialPort->setFlowControl(QSerialPort::NoFlowControl);
if(!serialPort->open(QSerialPort::ReadWrite)){
QMessageBox::about(this, "串口打开错误提示", "可能被占用了");
return;
}
//打开串口之后其他的选择按钮设置成不可用
ui->comboBox->setEnabled(false);
ui->comboBox_2->setEnabled(false);
ui->comboBox_4->setEnabled(false);
ui->comboBox_5->setEnabled(false);
ui->comboBox_6->setEnabled(false);
ui->radioButton->setText("关闭串口");
}
else{
serialPort->close();
ui->comboBox->setEnabled(true);
ui->comboBox_2->setEnabled(true);
ui->comboBox_4->setEnabled(true);
ui->comboBox_5->setEnabled(true);
ui->comboBox_6->setEnabled(true);
ui->radioButton->setText("打开串口");
}
}
void Widget::readData()
{
//将串口中的数据打印到textBrowser中
ui->textBrowser->insertPlainText(serialPort->readAll());
}
void Widget::on_pushButton_clicked()
{
//点击“发送”button之后,将textEdit中的内容写入串口
serialPort->write(ui->textEdit->toPlainText().toUtf8());
}
void Widget::on_pushButton_2_clicked()
{
//清屏操作
ui->textEdit->clear();
ui->textBrowser->clear();
}
在windows端编写好程序之后,将工程文件发送到ubuntu进行qmake、make最后通过scp将ARM的可执行文件发送到开发板,接下来就是验证了
我用的是正点原子出厂的系统,所以在验证的时候需要使用到一个串口来连接到开发板执行编写好的上位机程序,所以一个串口就被占用了,正点原子教程视频就用开发板的另一个串口来进行测试
正点原子教程测试方式