手把手教你编写你的第一个上位机(如何编写上位机)-凯发备用官网

大家好,我是zhengn,本次来教大家编写一个基于qt的简单的上位机

学习一个新的东西我们都从最基础的实例开始,比如学习c语言我们会从编写一个hello程序开始、学习嵌入式我们从点灯开始。同样的,我们也从编写一个简单的基于qt的上位机来体会体会上位机开发及认识认识qt

我们本次实现的上位机的功能很简单:上位机通过串口来控制开发板上的一个led的亮灭。界面如:

演示视频:

在开始编写上位机之前我们先来一起搭建一下qt开发环境(不然就不是手把手了,哈哈)。qt的两种开发环境:

  • 使用vs qt
  • 使用qt creator

这里我们选择直接使用qt_creator的方式。

qt creator是一个用于qt开发的轻量级跨平台集成开发环境。

qt creator可带来两大关键益处:

  • 提供首个专为支持跨平台开发而设计的集成开发环境 (ide),并确保首次接触qt框架的开发人员能迅速上手和操作。
  • 即使不开发qt应用程序,qt creator也是一个简单易用且功能强大的ide。

下面我们来一起安装qt creator。

我们需要先注册一个qt账号,后面安装qt creator的时候会用到。注册账号的地址为:

https://www.qt.io/zh-cn/

我们在windows上进行开发,安装windows版本的qt creator。下载地址:

https://download.qt.io/new_archive/qt/5.11/5.11.3/

下载得到qt-opensource-windows-x86-5.11.3.exe。然后双击安装,第二步需要输入账号密码,把我们上面注册好的账号密码填入即可。

接下来还需要选择安装组件,根据自己需要进行选择安装,我安装的组件如:

安装完成之后我们桌面上并没有qt creator的快捷方式,需要自己创建。找到qt creator的安装路径,然后把qt creator发送到桌面快捷方式即可。如:

我们创建一个简单的c 工程来验证一下qt creator是否安装成功。

qt creator搭建好之后我们接下来开始编写我们的上位机。

编写这个简单的上位机我们需要经过一下几个步骤:

  • 上位机界面设计
  • 上位机逻辑代码编写。
  • 添加上位机图标。
  • 上位机程序的打包。
  • 上位机测试验证。

这里需要注意的一点是:工程名及工程路径不要有中文字符

另外,qt中有三种基类,这里我们选择qwidget类。qt的三个基类如:

  • qmainwindow类:提供一个带有菜单条,工具条和一个状态条的主应用程序窗口。
  • qwidget类:所有用户界面对象的基类,窗口部件是用户界面的一个基本单元,它从窗口系统接收鼠标,键盘和其他消息,并在屏幕上绘制自己。
  • qdialog类:对话框窗口的基类,对话框窗口主要用于短期任务和用户进行短期通讯的顶级窗口,qdialog可以是模态对话框或者是非模态对话框。

我们创建的工程如:

其中,项目文件.pro文件是用来告诉qmake关于为这个应用程序创建makefile所需要的细节。例如,一个源文件和头文件的列表、任何应用程序特定配置。例如,一个必需链接的额外库或者一个额外的包含路径、都应该放到项目文件中。

qt 一个可视化的界面设计工具:qt 设计器(qt designer)。我们双击.ui文件就可以进入qt designer,在qt designer中我们可以通过拖动控件的方式来设计我们的界面,整个界面如:

我们从左侧的控件区把我们需要的控件拖动到界面编辑区中,我们这个简单地上位机用到的控件如:

这里需要注意的是波特率这个下拉框需要双击设置一些备选配置,如:

大家可以在左边的控件区找到这三种控件拖动到界面编辑器进行修改、布局即可。

其中,布局可通过如下组件调整:

这几个组件的功能如:

具体的用法大家可以自己去实操一下。

另外,我们需要给我们使用的控件重新命名,在右侧的对象管理区进行操作。命名为有意义的名字,因为后面编写代码会用到。有意义的名字利于编写易懂的代码。比如我们修改的名字如:

最后,控件的属性可根据需要在属性区进行调整。

serial_led.pro文件添加串口库:

qt = core gui serialport

widget.h文件包含串口头文件:

#include #include

  • qserialport 类提供了操作串口的各种接口。
  • qserialportinfo 是一个辅助类,可以提供计算机中可用串口的各种信息。

widget.h的widget类中添加一个qserialport成员:

在widget构造函数中创建一个串口对象并搜索所有可用串口:

// 微信公众号:嵌入式大杂烩widget::widget(qwidget *parent) :    qwidget(parent),    ui(new ui::widget){    qstringlist serialnameport;    ui->setupui(this);    this->setwindowtitle("serial_led");    /* 创建一个串口对象 */    serialport = new qserialport(this);    /* 搜索所有可用串口 */    foreach (const qserialportinfo &inf0, qserialportinfo::availableports()) {        serialnameport<serialbox->additems(serialnameport);}

信号和槽是用于对象之间的通信,它是qt的核心机制。

当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。如果有对象对这个信号感兴趣,想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调

这里,我们点击打开串口按钮会发出clicked信号,此时对应槽函数on_openbutton_clicked会被调用。下面我们来实现这个槽函数:

// 微信公众号:嵌入式大杂烩void widget::on_openbutton_clicked(){    /* 串口设置 */    serialport->setportname(ui->serialbox->currenttext());    serialport->setbaudrate(ui->baudratebox->currenttext().toint());    serialport->setdatabits(qserialport::data8);    serialport->setstopbits(qserialport::onestop);    serialport->setparity(qserialport::noparity);    /* 打开串口提示框 */    if (true == serialport->open(qiodevice::readwrite))   {        qmessagebox::information(this, "提示", "串口打开成功");   }    else   {        qmessagebox::critical(this, "提示", "串口打开失败");   }}

这里我们写死数据位、停止位、求校验位;增加提示框。其中使用qmessagebox需要包含如下头文件:

#include

按照上面打开串口槽函数的方法编写关闭串口点灯灭灯槽函数:

void widget::on_closebutton_clicked(){    serialport->close();}void widget::on_onbutton_clicked(){    serialport->write("onn");    qdebug("onn");}void widget::on_offbutton_clicked(){    serialport->write("offn");    qdebug("offn");}

以上就是上位机逻辑代码的编写。

在网上找一个相关的.ico后缀的图标下载放到我们的工程路径下,如:

图标下载网址如:

  • https://www.iconfont.cn/
  • https://www.iconfont.cn/

然后在我们的serial_led.pro文件中添加如下一行代码:

rc_icons = led.ico

我们上面运行的上位机都是在qt creator中编译运行的,如果我们需要把编写好的可执行文件发送给别人使用的话还需要进行打包。

上面我们的工程是debug版本的:

打包之前,我们先把工程修改为release版本

然后在我们工程目录下得到:

此时,双击release文件夹下的serial_led.exe文件是会报错的,报错原因是找不到一些相关的动态库:

我们新建一个文件夹保存我们的打包文件,如:

把build-serial_led-desktop_qt_5_11_1_mingw_32bit-releaserelease路径下的serial_led.exe文件拷贝至serial_led_packet文件夹中:

打开qt for disktop工具:

执行如下命令进入打包目录:

cd /d d:qtqt_prjserial_ledserial_led_packet

然后执行如下命令进行打包:

windeployqt serial_led.exe

此时,serial_led_packet文件夹中的serial_led.exe文件就可以双击运行了:

此时就完成了程序的打包。此时我们把这一整个文件夹压缩发送给别人使用了。另外,我们也可以借助一些工具把这些文件打包成一个整体的.exe文件,这里不再介绍。

上位机我们写好了,接下来编写下位机代码来测试一下。

我们点击上位机的点灯灭灯按钮,则会通过串口分别发送onnoffn,我们编写下位机代码进行接收,然后操控led灯即可。

下位机是小熊派iot开发板,测试代码如:

// 微信公众号:嵌入式大杂烩int main(void){  /* user code begin 1 */  /* user code end 1 */  /* mcu configuration----------------------------------------------------------*/  /* reset of all peripherals, initializes the flash interface and the systick. */  hal_init();  /* user code begin init */  /* user code end init */  /* configure the system clock */  systemclock_config();  /* user code begin sysinit */  /* user code end sysinit */  /* initialize all configured peripherals */  mx_gpio_init();  mx_dma_init();  mx_usart1_uart_init();  /* user code begin 2 */  printf("welcome to uart1 test!rn");  /* user code end 2 */  /* infinite loop */  /* user code begin while */  while (1) {  /* user code end while */  /* user code begin 3 */ if(hal_uart_receive(&huart1, &rdata, 1, 0)==hal_ok) {      if (usart_rx_buf_index > usart1_rx_buf_len - 1)     {        usart_rx_buf_index = 0;     }            if (rdata == 0x0a)     {        if (strcmp((char*)usart1_rx_buf, "on") == 0)       {          hal_gpio_writepin(led_gpio_port, led_pin, gpio_pin_set);       }        else if (strcmp((char*)usart1_rx_buf, "off") == 0)       {          hal_gpio_writepin(led_gpio_port, led_pin, gpio_pin_reset);       }        usart_rx_buf_index = 0;        memset(usart1_rx_buf, 0, usart1_rx_buf_len);     }      else     {        usart1_rx_buf[usart_rx_buf_index ] = rdata;     } } }  /* user code end 3 */}

演示如文章开头所见。

以上就是手把手教你编写一个简单的点灯上位机的内容,虽然实现的功能很简单,但是qt上位机开发的步骤基本就是这些步骤,通过这个基础实例把这些套路摸透我们就可以接着进行后续更多qt程序地开发学习了。

另外,zhengn也是qt开发新手,文章中如有错误,欢迎指出,谢谢大家!

码字不易。原创不易。如果文章对你有帮助,麻烦帮忙转发分享,谢谢!

私信回复关键词:serial_led,可获取本文上下位机工程(我看到的话会第一时间发给你)。

凯发备用官网的版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2023年5月3日 上午9:23
下一篇 2023年5月3日 上午9:33

相关推荐

  • 基层党支部书记怎么当?茂名供电局九天三期封闭培训打造过硬党建工作队伍

    6月3日至19日,南方电网广东茂名供电局举办2019年党支部书记轮训班。培训班分三期,每期三天,对茂名供电系统内职能部门、班站所各级党(总)支部书记共188人进行封闭式培训,旨在提…

    科研百科 2023年10月14日
    154
  • 近日,贵州省中医药管理局下达了《2024年度中医药、民族医药科学技术研究课题计划及经费的通知》,绥阳县中医医院疼痛科医师唐飞申报的“芍药甘草汤联合雷火灸治疗koa的疗效观察”项目获…

    科研百科 2024年4月20日
    43
  • 国企工程项目部管理制度汇编,表格拿来直接用!32万字word可下载(建筑公司工程部管理制度范本)

    文件下载方式在最后 …… 共789页,完整版下载方式见下方 需要此ppt 的同学可先关注然后私信我哦 更多精彩内容可前往凯发备用官网主页了解更多

    2022年9月17日
    284
  • 政策指引 │ 凝聚多方合力 推进科研诚信建设(科研诚信建设举措)

    自治区党委提出要实施好诚信建设工程,是全面贯彻党的二十大精神的具体实践,是贯彻落实习近平总书记考察内蒙古重要讲话精神作出的重大部署。自治区将“诚信建设工程”纳入经济发展和民生改善的…

    科研百科 2024年4月15日
    85
  • l风险提示 8:企业在合同中未明确约定税务条款,诱发税务风险。 l彭律师建议:买卖合同是企业经营中常见的经济合同之一,以买卖合同为例,分别从买方和卖方的角度解析合同签订时的涉税审查…

    科研百科 2022年11月20日
    226
  • 系统集成项目管理工程师(系统集成项目管理工程师容易考吗)

    主要针对计算机,系统集成项目管理工程师也称之为软考, 无需资历、学历、工作年限等要求,年满18周岁即可。就从报考条件与考试难易程度来看,它也是相对容易 一、从事it行业的年轻人很多…

    科研百科 2022年10月12日
    219
  • 项目经理在项目管理中会遇到许多问题,其中最令人头痛的莫过于项目计划执行不到位,进度难以跟踪,项目延期严重。这些问题导致项目计划看似存在,但实际上与无计划相差无几。 对于项目团队内部…

    科研百科 2024年4月25日
    62
  • 庆阳市基层党建工作综述(庆阳市基层党建工作综述报告)

    每日甘肃网讯(记者李彬)据陇东报报道:群众富不富,关键看干部,干部强不强,组织要培养。2015年以来,我市把基础保障作为基层党建的“硬支撑”,创新组织设置,加强阵地建设,强化基本保…

    科研百科 2023年2月1日
    351
  • 低代码平台和二次开发的区别

    低代码平台和二次开发的区别 随着科技的不断发展,软件开发领域也在不断进步。低代码平台和二次开发是近年来备受关注的两种开发方式。虽然它们都是为了简化开发流程和提高效率,但在实际应用中…

    科研百科 2024年3月1日
    60
  • web的发展日新月异,这也使得web开发者不得不加快脚步,学习新的技术和编程语言。尤其是对于那些大量流量入口的网站来说,跟上技术发展趋势更是尤为重要。为了使得web开发人员能够更加…

    科研百科 2024年5月19日
    53
网站地图