QT综合示例:QT串口通信

QT综合示例:QT串口通信

    • 0、界面:
    • 1、代码:

如果用qt写程序作为上位机,然后通过和usb和下位机通信的时候,就需要用到qt中的串口通信了。

0、界面:

在这里插入图片描述

1、代码:

1).pro 添加:

QT       +=serialport

2)主函数 main.cpp 添加:

#include "mywidget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);myWidget w;w.show();return a.exec();
}

3)myWidget.h 添加:

#ifdef WIN32
#pragma execution_character_set("utf-8")
#endif#ifndef MYWIDGET_H
#define MYWIDGET_H#include <QWidget>#include <QSerialPort>
#include <QSerialPortInfo>#include <QDebug>
#include <QMessageBox>namespace Ui {
class myWidget;
}class myWidget : public QWidget
{Q_OBJECTpublic:explicit myWidget(QWidget *parent = 0);~myWidget();void initUI();public slots:void receiveInfo();private slots:void on_m_OpenPortButton_clicked();void on_btn_Send_clicked();private:Ui::myWidget *ui;private:QStringList getPortNameList();  // 获取所有可用的串口列表QSerialPort* m_serialPort; 		// 串口类QStringList m_portNameList;     // 端口名列表private:void sendInfo(char* info,int len);void sendInfo(QString &info);void convertStringToHex(const QString &str, QByteArray &byteData);char convertCharToHex(char ch);
};#endif // MYWIDGET_H

4)myWidget.cpp 添加:

#include "mywidget.h"
#include "ui_mywidget.h"myWidget::myWidget(QWidget *parent) :QWidget(parent),ui(new Ui::myWidget)
{ui->setupUi(this);m_serialPort = new QSerialPort();this->setWindowTitle("QSerialPort");// 设置默认选项ui->m_OpenPortButton->setText("打开串口");ui->cBox_PortName->addItems(getPortNameList());ui->cBox_DataBits->setCurrentIndex(1);ui->cBox_BaudRate->setCurrentIndex(2);
}myWidget::~myWidget()
{delete ui;m_serialPort->close();delete m_serialPort;
}// 1、获得有效串行端口
QStringList myWidget::getPortNameList()
{QStringList m_serialPortName;foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts()){m_serialPortName << info.portName();//QMessageBox::information(this,tr("提示"),tr("serialPortName: %1").arg(info.portName()),QMessageBox::Ok);//qDebug()<<"serialPortName:"<<info.portName();}return m_serialPortName;
}// 2、连接、断开
void myWidget::on_m_OpenPortButton_clicked()
{if(m_serialPort->isOpen())//如果串口已经打开了 先给他关闭了{
//        m_serialPort->flush();
//        m_serialPort->clear();m_serialPort->close();}else{//当前选择的串口名字m_serialPort->setPortName(ui->cBox_PortName->currentText());//用ReadWrite 的模式尝试打开串口if(!m_serialPort->open(QIODevice::ReadWrite)){QMessageBox::warning(this,tr("提示"),tr("串口打开失败!"),QMessageBox::Ok);return;}// 串口设置:m_serialPort->setFlowControl(QSerialPort::NoFlowControl);   //无流控制// 1、波特率和读写方向switch(ui->cBox_BaudRate->currentIndex()){case 0:m_serialPort->setBaudRate(QSerialPort::Baud2400,QSerialPort::AllDirections);break;case 1:m_serialPort->setBaudRate(QSerialPort::Baud4800,QSerialPort::AllDirections);break;case 2:m_serialPort->setBaudRate(QSerialPort::Baud9600,QSerialPort::AllDirections);//9600 比特率break;case 3:m_serialPort->setBaudRate(QSerialPort::Baud19200,QSerialPort::AllDirections);break;case 4:m_serialPort->setBaudRate(QSerialPort::Baud57600,QSerialPort::AllDirections);break;case 5:m_serialPort->setBaudRate(QSerialPort::Baud115200,QSerialPort::AllDirections);break;default:break;}// 2、数据位switch(ui->cBox_DataBits->currentIndex()){case 0:m_serialPort->setDataBits(QSerialPort::Data6);//6 bit 数据位break;case 1:m_serialPort->setDataBits(QSerialPort::Data7);//7 bit 数据位break;case 2:m_serialPort->setDataBits(QSerialPort::Data8);//8 bit 数据位break;default:break;}// 3、停止位switch(ui->cBox_StopBits->currentIndex()){case 0:m_serialPort->setStopBits(QSerialPort::OneStop);//1 bit停止位break;case 1:m_serialPort->setStopBits(QSerialPort::OneAndHalfStop); //1.5 bit停止位break;case 2:m_serialPort->setStopBits(QSerialPort::TwoStop); //2 bitbreak;default:break;}// 4、校验位switch(ui->cBox_Parity->currentIndex()){case 0:m_serialPort->setParity(QSerialPort::EvenParity);break;case 1:m_serialPort->setParity(QSerialPort::OddParity);break;default:m_serialPort->setParity(QSerialPort::NoParity);break;}connect(m_serialPort,SIGNAL(readyRead()),this,SLOT(receiveInfo()));}ui->m_OpenPortButton->setText(m_serialPort->isOpen()?tr("关闭串口") : tr("连接串口"));ui->m_OpenPortButton->setStyleSheet(m_serialPort->isOpen()?"color: red;":"color: black;");
}// 3、信息接收
void myWidget::receiveInfo()
{QByteArray info = m_serialPort->readAll();//qDebug()<<"receive info:"<<info;if(!info.isEmpty()){QString str = ui->textEdit_receive->toPlainText();str+=tr(info);ui->textEdit_receive->clear();ui->textEdit_receive->append(str);}info.clear();//    QByteArray hexData = info.toHex();
//    //这里面的协议 你们自己定义就行  单片机发什么 代表什么 我们这里简单模拟一下
//    if(hexData == "0x10000")
//    {
//        //do something
//    }
//    else if(hexData  == "0x100001")
//    {
//        //do something
//    }
}// 4、发送按钮
void myWidget::on_btn_Send_clicked()
{m_serialPort->write(ui->textEdit_send->toPlainText().toLatin1());
}//写两个函数 向单片机发送数据:
// 信息发送函数一:
void myWidget::sendInfo(char* info,int len)
{for(int i=0; i<len; ++i){printf("0x%x\n", info[i]);}m_serialPort->write(info,len);//这句是真正的给单片机发数据 用到的是QIODevice::write 具体可以看文档
}// 信息发送函数二:
void myWidget::sendInfo(QString &info)
{QByteArray sendBuf;if (info.contains(" ")){info.replace(QString(" "),QString(""));//我这里是把空格去掉,根据你们定的协议来}qDebug()<<"Write to serial: "<<info;convertStringToHex(info, sendBuf); //把QString 转换 为 hexm_serialPort->write(sendBuf); //这句是真正的给单片机发数据 用到的是QIODevice::write 具体可以看文档
}// 基本和单片机交互数据都是16进制的
// Qstring 转为16进制的函数
void myWidget::convertStringToHex(const QString &str, QByteArray &byteData)
{int hexdata,lowhexdata;int hexdatalen = 0;int len = str.length();byteData.resize(len/2);char lstr,hstr;for(int i=0; i<len; ){//char lstr,hstr=str[i].toLatin1();if(hstr == ' '){i++;continue;}i++;if(i >= len)break;lstr = str[i].toLatin1();hexdata = convertCharToHex(hstr);lowhexdata = convertCharToHex(lstr);if((hexdata == 16) || (lowhexdata == 16))break;elsehexdata = hexdata*16+lowhexdata;i++;byteData[hexdatalen] = (char)hexdata;hexdatalen++;}byteData.resize(hexdatalen);
}//另一个 函数 char 转为 16进制
char myWidget::convertCharToHex(char ch)
{/*0x30等于十进制的48,48也是0的ASCII值,,1-9的ASCII值是49-57,,所以某一个值-0x30,,就是将字符0-9转换为0-9*/if((ch >= '0') && (ch <= '9'))return ch-0x30;else if((ch >= 'A') && (ch <= 'F'))return ch-'A'+10;else if((ch >= 'a') && (ch <= 'f'))return ch-'a'+10;else return (-1);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/491053.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB GUI如何制作下拉列表

MATLAB在GUI中可以实现下图所示的下拉列表&#xff1a; 方法&#xff1a; 在MATLAB中输入guide打开一个现有的GUI或者新建一个GUI放置一个弹出式菜单&#xff0c;如图所示双击新建的弹出式菜单&#xff0c;打开检查器&#xff0c;点击检查器的“string”菜单栏右侧的按钮&…

如果每个人都是一个粒子…… | 从物理学中寻找社会规律

来源&#xff1a;环球科学人类的许多社会行为似乎是难以捉摸的&#xff0c;包括经济、交通、个人选择。不少科学家尝试从物理的角度解释人类社会&#xff0c;他们将人比作粒子&#xff0c;每个个体之间的行为、选择都会互相影响。就像物理粒子会受到不同类型的力的控制&#xf…

猎豹MFC--文件对话框CFileDialog

如下叫做打开文件对话框&#xff1a;CFileDialog类在对话框上添加文本框&#xff0c;接收回车键设置&#xff0c;多行&#xff0c;编辑修改ID&#xff0c;垂直滚动条 水平滚动条 属性设置。添加菜单资源&#xff1a;这个菜单是给主窗口使用的&#xff0c;所以在主窗口对话框属…

MATLAB的GUI界面不显示XY坐标轴

在GUI中创建一个坐标轴&#xff0c;默认会显示XY坐标&#xff0c;如下图&#xff1a; 如何关闭XY坐标轴呢&#xff1f; 首先在打开GUI界面&#xff0c;双击该坐标轴&#xff0c;在Xcolor和Ycolor中选择白色&#xff0c;将坐标轴设置为白色&#xff1a; 然后在xticklabel和ytic…

机器人工作原理的超详细解析,生动、形象!

来源&#xff1a;笑看国际风云很多人一听到“机器人”这三个字脑中就会浮现“外形酷炫”、“功能强大”、“高端”等这些词&#xff0c;认为机器人就和科幻电影里的“终结者”一样高端炫酷。其实不然&#xff0c;在本文中&#xff0c;我们将探讨机器人学的基本概念&#xff0c;…

数字图像处理:图像变换的基本模型

数字图像处理&#xff1a;图像变换的基本模型 一、常用图象的变换模型 变换模型是指根据待匹配图像与背景图像之间几何畸变的情况&#xff0c;所选择的能最佳拟合两幅图像之间变化的几何变换模型。可采用的变换模型有如下几种:刚性变换、仿射变换、透视变换和非线形变换等&am…

Nginx 的线程池与性能剖析【转载】

正如我们所知&#xff0c;NGINX采用了异步、事件驱动的方法来处理连接。这种处理方式无需&#xff08;像使用传统架构的服务器一样&#xff09;为每个请求创建额外的专用进程或者线程&#xff0c;而是在一个工作进程中处理多个连接和请求。为此&#xff0c;NGINX工作在非阻塞的…

Halcon算子学习:XLD几种边缘连接函数

Halcon算子学习&#xff1a;XLD几种边缘连接函数 1.union_cotangential_contours_xld (Contours : UnionContours : FitClippingLength, FitLength, MaxTangAngle, MaxDist, MaxDistPerp, MaxOverlap, Mode : ) 根据输入的轮廓的端点处的局部曲率&#xff0c;连接曲率满足一定…

交换机与路由器大战已结束,超大规模计算公司胜出

来源&#xff1a;云头条作者&#xff1a;Timothy Prickett Morgan是The Next Platform的联合创始人兼合作编辑。很难说会先发生什么&#xff1a;交换和路由将合并&#xff0c;还是说会出现两种功能兼具的独立网络操作系统。Arrcus去年7月推出了一种可在商用芯片上同时提供交换功…

MATLAB的GUI中给坐标轴四周加上边框

在MATLAB的GUI中如何为坐标轴四边加上方框&#xff0c;效果如下图&#xff1a; 首先打开一个GUI文件&#xff0c;建立一个坐标轴&#xff0c;如下图所示&#xff1a; 双击该坐标轴&#xff0c;在弹出的检查器中&#xff0c;在Box那一栏后面勾上&#xff0c;如下图所示&#xff…

Halcon学习笔记:Halcon标定步骤-3d_coordinates.hdev示例

Halcon标定步骤 1.设置相机内部参数的初始值 StartCamPar : [0.016,0,0.0000074,0.0000074,326,247,652,494] set_calib_data_cam_param (CalibDataID, 0, ‘area_scan_division’, StartCamPar) 1.1 相机型号 &#xff08;1&#xff09;面阵&#xff08;2&#xff09;线阵…

马斯克的脑机接口能如愿以偿吗?

来源&#xff1a;都世民科学网博客摘要&#xff1a;本文主要讨论马斯克的脑机接口设备更新的要点&#xff0c;他发布的计划真能如愿以偿吗&#xff1f;可能会出现什么问题&#xff0c;将如何应对&#xff1f;是能治病&#xff0c;还是导致新的疾病&#xff1f;关键词&#xff1…

MATLAB的GUI如何清空坐标轴的图像

下面这两句即可实现清空GUI中的坐标轴 axes(handles.axes1); %指定需要清空的坐标轴 cla reset; 但假如你之前的坐标轴四周是有边框的&#xff0c;而且是没有坐标刻度和坐标值的&#xff0c;如下图所示&#xff0c;你会发现通过上面这两句代码虽然清空了坐标轴的内容&#xf…

Halcon学习笔记:1D Measuring一维测量_fuse.hdev灯丝测量示例

Halcon学习笔记&#xff1a;1D Measuring一维测量_fuse.hdev灯丝测量示例 一.基本概念 基本流程为&#xff1a; 获取图像对图像进行灰度值标定 &#xff08;针对相机获取的图像灰度和输入能量之间的非线性关系&#xff0c;获得相机对输入能量的线性函数&#xff09;排列感兴趣…

尘埃落定!苹果 10 亿美元入局 5G,Intel 挥别 9 年基带业务

来源&#xff1a; 雷锋网 雷锋网消息&#xff0c;2019 年 7 月 25 日&#xff0c;苹果公司和 Intel 共同宣布&#xff0c;双方已经正式达成收购协议&#xff0c;Apple 将收购 Intel 智能手机调节解调器业务的绝大部分&#xff0c;收购价格正是此前《华尔街日报》爆料出的 10 亿…

[原创]android使用代码生成LayerDrawable的方法和注意事项

为了有更好的UI体验&#xff0c;一般我们会把button、textview等控件的背景设置上阴影。传统的做法是美工提供一张具有阴影效果的nine patch图&#xff0c;然后将其在xml文件中添加到background属性。这种做法没有问题&#xff0c;不过缺乏灵活性。 图1.使用代码生成的具有“阴…

数字图像处理:四连通域与八连通域

四连通域与八连通域 1、所谓四连通区域或四邻域&#xff0c;是指对应像素位置的上、下、左、右&#xff0c;是紧邻的位置。共4个方向&#xff0c;所以称之为四连通区域&#xff0c;又叫四邻域。 2、所谓八连通区域或八邻域&#xff0c;是指对应位置的上、下、左、右、左上、右…

深度学习奠基人特伦斯:美国学界已经找到了解释人工智能“黑盒子”的方法...

&#xff08;图片来源&#xff1a;壹图网&#xff09;来源&#xff1a;今日头条经济观察网 记者 宋笛 “是的&#xff0c;目前美国数学家已经找到了解释深度学习黑盒子的方法&#xff0c;但是还没有发表&#xff0c;所以我不能透露更多。”7月25日 &#xff0c;美国“四院院士”…

vs2013配置opencv2.4.9后出现找不到opencv_core249d.dll和opencv_highgui249d.dll问题

问题&#xff1a;vs2013配置opencv2.4.9后&#xff0c;运行程序&#xff0c;出现找不到opencv_core249d.dll和opencv_highgui249d.dll问题 解决办法&#xff1a;首先将opencv_core249d.dll&#xff1b;opencv_highgui249d.dll;opencv_imgproc249d.dll三个文件从“OpenCV的安装…

Halcon算子学习:图像阈值分割-threshold、binary_threshold、dyn_threshold算子

Halcon算子学习&#xff1a;图像阈值分割算子前言1.threshold-全局固定阈值分割2.Binary Threshold-自动全局阈值分割3.dyn_threshold-局部动态阈值分割小结&#xff1a;4.var_threshold算子-均值和标准偏差局部阈值分割5.dual_threshold-双重阈值分割&#xff08;有符号图像的…