悟空建站seo服务,网站建设专家是干嘛的,徐州网站开发服务,湘潭网站建设 搜索磐石网络Qt串口编程Serial Port
思维导图在线高清查看#xff1a;https://www.helloimg.com/i/2025/01/26/6796301b157a0.png
资源简介
出厂系统配置
正点原子的 I.MX6U 开发板的出厂系统中#xff0c;已经预先配置了两路串口
串口分配 调试串口 UART1#xff1a;这一路串口被…Qt串口编程Serial Port
思维导图在线高清查看https://www.helloimg.com/i/2025/01/26/6796301b157a0.png
资源简介
出厂系统配置
正点原子的 I.MX6U 开发板的出厂系统中已经预先配置了两路串口
串口分配 调试串口 UART1这一路串口被指定为调试用途对应于系统中的设备节点 /dev/ttymxc0 通用串口 UART3另一路串口是 UART3对应于系统中的设备节点 /dev/ttymxc2
编程限制
由于 UART1 已经被用作调试串口因此在编程时我们无法使用它只能选择对 UART3 进行编程
应用实例
使用串口需要在 pro 项目文件中添加串口模块的支持 项目文件文件第一行添加的代码部分如下 QT core gui serialport 添加的 serialport 就是串口模块的支持
mainwindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H
#include #include #include #include #include #include #include #include #include #include #include #include
class MainWindow : public QMainWindow { Q_OBJECT
public: MainWindow(QWidget *parent nullptr); ~MainWindow();
private: /* 串口对象 */ QSerialPort *serialPort;
/* 用作接收数据 */
QTextBrowser *textBrowser;/* 用作发送数据 */
QTextEdit *textEdit;/* 按钮 */
QPushButton *pushButton[2];/* 下拉选择盒子 */
QComboBox *comboBox[5];/* 标签 */
QLabel *label[5];/* 垂直布局 */
QVBoxLayout *vboxLayout;/* 网络布局 */
QGridLayout *gridLayout;/* 主布局 */
QWidget *mainWidget;/* 设置功能区域 */
QWidget *funcWidget;/* 布局初始化 */
void layoutInit();/* 扫描系统可用串口 */
void scanSerialPort();/* 波特率项初始化 */
void baudRateItemInit();/* 数据位项初始化 */
void dataBitsItemInit();/* 检验位项初始化 */
void parityItemInit();/* 停止位项初始化 */
void stopBitsItemInit();private slots: void sendPushButtonClicked(); void openSerialPortPushButtonClicked(); void serialPortReadyRead(); }; #endif // MAINWINDOW_H
声明需要用到的变量方法及槽函数
mainwindow.cpp
#include “mainwindow.h” #include #include #include #include MainWindow::MainWindow(QWidget *parent) QMainWindow(parent) { /* 布局初始化 */ layoutInit(); /* 扫描系统的串口 */
scanSerialPort();/* 波特率项初始化 */
baudRateItemInit();/* 数据位项初始化 */
dataBitsItemInit();/* 检验位项初始化 */
parityItemInit();/* 停止位项初始化 */
stopBitsItemInit();}
void MainWindow::layoutInit() { /* 获取屏幕的分辨率Qt官方建议使用这 * 种方法获取屏幕分辨率防上多屏设备导致对应不上 * 注意这是获取整个桌面系统的分辨率 */ QList QScreen * list_screen QGuiApplication::screens();
/* 如果是ARM平台直接设置大小为屏幕的大小 */#if arm /* 重设大小 / this-resize(list_screen.at(0)-geometry().width(), list_screen.at(0)-geometry().height()); #else / 否则则设置主窗体大小为800x480 / this-resize(800, 480); #endif / 初始化 */ serialPort new QSerialPort(this); textBrowser new QTextBrowser(); textEdit new QTextEdit(); vboxLayout new QVBoxLayout(); funcWidget new QWidget(); mainWidget new QWidget(); gridLayout new QGridLayout();
/* QList链表字符串类型 */
QList QString list1;
list1串口号:波特率:数据位:检验位:停止位:;for (int i 0; i 5; i) {label[i] new QLabel(list1[i]);/* 设置最小宽度与高度 */label[i]-setMinimumSize(80, 30);/* 自动调整label的大小 */label[i]-setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);/* 将label[i]添加至网格的坐标(0, i) */gridLayout-addWidget(label[i], 0, i);
}for (int i 0; i 5; i) {comboBox[i] new QComboBox();comboBox[i]-setMinimumSize(80, 30);/* 自动调整label的大小 */comboBox[i]-setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);/* 将comboBox[i]添加至网格的坐标(1, i) */gridLayout-addWidget(comboBox[i], 1, i);
}/* QList链表字符串类型 */
QList QString list2;
list2发送打开串口;for (int i 0; i 2; i) {pushButton[i] new QPushButton(list2[i]);pushButton[i]-setMinimumSize(80, 30);/* 自动调整label的大小 */pushButton[i]-setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);/* 将pushButton[0]添加至网格的坐标(i, 5) */gridLayout-addWidget(pushButton[i], i, 5);
}
pushButton[0]-setEnabled(false);/* 布局 */
vboxLayout-addWidget(textBrowser);
vboxLayout-addWidget(textEdit);
funcWidget-setLayout(gridLayout);
vboxLayout-addWidget(funcWidget);
mainWidget-setLayout(vboxLayout);
this-setCentralWidget(mainWidget);/* 占位文本 */
textBrowser-setPlaceholderText(接收到的消息);
textEdit-setText(www.openedv.com);/* 信号槽连接 */
connect(pushButton[0], SIGNAL(clicked()),this, SLOT(sendPushButtonClicked()));
connect(pushButton[1], SIGNAL(clicked()),this, SLOT(openSerialPortPushButtonClicked()));connect(serialPort, SIGNAL(readyRead()),this, SLOT(serialPortReadyRead()));}
void MainWindow::scanSerialPort() { /* 查找可用串口 */ foreach (const QSerialPortInfo info, QSerialPortInfo::availablePorts()) { comboBox[0]-addItem(info.portName()); } }
void MainWindow::baudRateItemInit() { /* QList链表字符串类型 */ QList list; list“1200”“2400”“4800”“9600” “19200”“38400”“57600” “115200”“230400”“460800” “921600”; for (int i 0; i 11; i) { comboBox[1]-addItem(list[i]); } comboBox[1]-setCurrentIndex(7); }
void MainWindow::dataBitsItemInit() { /* QList链表字符串类型 */ QList list; list“5”“6”“7”“8”; for (int i 0; i 4; i) { comboBox[2]-addItem(list[i]); } comboBox[2]-setCurrentIndex(3); }
void MainWindow::parityItemInit() { /* QList链表字符串类型 */ QList list; list“None”“Even”“Odd”“Space”“Mark”; for (int i 0; i 5; i) { comboBox[3]-addItem(list[i]); } comboBox[3]-setCurrentIndex(0); }
void MainWindow::stopBitsItemInit() { /* QList链表字符串类型 */ QList list; list“1”“2”; for (int i 0; i 2; i) { comboBox[4]-addItem(list[i]); } comboBox[4]-setCurrentIndex(0); }
void MainWindow::sendPushButtonClicked() { /* 获取textEdit数据,转换成utf8格式的字节流 */ QByteArray data textEdit-toPlainText().toUtf8(); serialPort-write(data); }
void MainWindow::openSerialPortPushButtonClicked() { if (pushButton[1]-text() “打开串口”) { /* 设置串口名 / serialPort-setPortName(comboBox[0]-currentText()); / 设置波特率 / serialPort-setBaudRate(comboBox[1]-currentText().toInt()); / 设置数据位数 / switch (comboBox[2]-currentText().toInt()) { case 5: serialPort-setDataBits(QSerialPort::Data5); break; case 6: serialPort-setDataBits(QSerialPort::Data6); break; case 7: serialPort-setDataBits(QSerialPort::Data7); break; case 8: serialPort-setDataBits(QSerialPort::Data8); break; default: break; } / 设置奇偶校验 / switch (comboBox[3]-currentIndex()) { case 0: serialPort-setParity(QSerialPort::NoParity); break; case 1: serialPort-setParity(QSerialPort::EvenParity); break; case 2: serialPort-setParity(QSerialPort::OddParity); break; case 3: serialPort-setParity(QSerialPort::SpaceParity); break; case 4: serialPort-setParity(QSerialPort::MarkParity); break; default: break; } / 设置停止位 / switch (comboBox[4]-currentText().toInt()) { case 1: serialPort-setStopBits(QSerialPort::OneStop); break; case 2: serialPort-setStopBits(QSerialPort::TwoStop); break; default: break; } / 设置流控制 */ serialPort-setFlowControl(QSerialPort::NoFlowControl); if (!serialPort-open(QIODevice::ReadWrite)) QMessageBox::about(NULL, “错误”, “串口无法打开可能串口已经被占用”); else { for (int i 0; i 5; i) comboBox[i]-setEnabled(false); pushButton[1]-setText(“关闭串口”); pushButton[0]-setEnabled(true); } } else { serialPort-close(); for (int i 0; i 5; i) comboBox[i]-setEnabled(true); pushButton[1]-setText(“打开串口”); pushButton[0]-setEnabled(false); } }
void MainWindow::serialPortReadyRead() { /* 接收缓冲区中读取数据 */ QByteArray buf serialPort-readAll(); textBrowser-insertPlainText(QString(buf)); }
MainWindow::~MainWindow() { } 界面布局初始化设置第29~121行 界面布局初始化设置第29~121行 使用垂直布局和网格布局 查找系统可用的串口第123~130行 查找系统中可用的串口 将串口名添加到 comboBox[0] 中 波特率初始化第132~144行 预设常用波特率默认选项为115200 添加波特率到 comboBox[1] 中 数据位项初始化第146~155行 设置默认数据位为8 校验位项初始化第157~166行 默认设置为无校验位 停止位项初始化第168~177行 默认停止位为1 发送数据第179~184行 点击发送按钮时触发发送数据操作 打开或者关闭串口第186~256行 按设置的项使用 Qt 串口提供的方法如 setDataBits(QSerialPort::DataBits) 等 按第188~239行步骤设置串口参数后即可打开或关闭串口 读取数据第258~263行 从缓冲区中读取数据 将读取的数据显示到 textBrowser 中
程序运行效果