Linux驱动-基于QT控制LED灯

环境搭建

  • 平台
    韦东山100ask imax6ull pro && 大象嵌入式开发板
  • Build Root
    使用Build root编译image,具体配置可参考《嵌入式Linux应用开发完全手册-IMX6ULL开发板(从零移植篇-预览版)-V0.1.pdf》,使用buildroot后仅需要配置menuconfig即可自动编译出完整的镜像,而且各种安装包也可以在output/build目录下拿到,有了它就不需要再为编译各种库坑了。我的理解是,解决环境问题其实并不能帮助我们成长太多,而这又会占用很多时间。成熟的公司,比如芯片原厂都会有很成熟的编译环境,也会有专门的部门来负责各种系统集成。各个驱动模块的team只需要解决好自己模块内的事情,这样总体效率就很高。
  • QT Creator
    我使用的方法是直接在Windows端安装QT Creator,建立工程写代码,然后再将项目文件拷贝到ubuntu Linux下做交叉编译,具体操作见:Linux驱动-基于Buildroot构建系统镜像后实现基于QT项目开发之环境配置

LED驱动程序

固定的驱动框架编写代码即可,根据设备资源的获取方法的差异导致有几种不同的驱动框架,驱动部分都一样(file_operation实现等)

基于总线设备模型

01_all_series_quickstart
|----| 05_嵌入式 Linux 驱动开发基础知识\source
|----| |----| 02_led_drv\04_led_drv_template_bus_dev_drv

基于设备树

01_all_series_quickstart
|----| 05_嵌入式 Linux 驱动开发基础知识\source
|----| |----| 02_led_drv\05_led_drv_template_device_tree

编写代码

代码地址: git clone https://gitee.com/runluo/Linux_QT_LED_Demo.git
首先设计UI,QT Create会自动转化为cpp文件,然后再加入 你自己的业务逻辑 到 QT项目中。
我很简单的画了一个界面用来控制LED灯的亮灭
在这里插入图片描述

在工程项目中添加一个名为 led 的类,新增 led.c 和 led.h 文件

在这里插入图片描述
这里有一个问题就是驱动程序使用 C 语言,而在UI中是 CPP 语言,我们要有方法来将C函数嵌入到CPP语言中。

首先看led.h中,使用extern “C” {C文件头}
在这里插入图片描述
再看在led.c中,在C语言的前面加上 ::
在这里插入图片描述
UI中的业务逻辑
当点击 RatioButton 后,LED灯亮灭
在槽函数中,调用我们之前创建 Led 类中的函数,进而通过ioctl 来调用驱动程序。
在这里插入图片描述
这个小Demo搭起来之后,其实可以继续完善,做出很多好玩的初学Demo。

测试

在板子上安装LED驱动程序后,执行应用程序即可
insmod led_driver.ko
./TEST
点击UI界面可以看到板子上的LED0灯有亮灭

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
首先,您需要将QT串口通信库添加到您的QT项目中。然后,您需要配置串口参数,例如波特率、数据位、停止位和校验位。接下来,您可以使用串口发送指令来控制单片机上的LED。 在单片机端,您需要编写一个程序来接收串口指令并控制LED。您可以使用单片机的UART串口模块来接收指令,并使用输出端口来控制LED的开关。 下面是一个简单的示例代码,可以在QT端发送指令来控制单片机上的LEDQT端代码: ```c++ QSerialPort serial; serial.setPortName("COM1"); serial.setBaudRate(QSerialPort::Baud9600); serial.setDataBits(QSerialPort::Data8); serial.setParity(QSerialPort::NoParity); serial.setStopBits(QSerialPort::OneStop); serial.open(QIODevice::ReadWrite); // 发送控制指令 char cmd[] = {0x01}; // 控制LED亮 serial.write(cmd, sizeof(cmd)); ``` 单片机端代码: ```c #include <reg52.h> sbit LED = P0^0; // LED连接的输出端口 void main() { unsigned char cmd; TMOD = 0x20; // 定时器1工作在模式2,8位自动重载 TH1 = 0xFD; // 波特率9600,定时器1初值 SCON = 0x50; // 串口工作在模式1,8位数据,无校验位,1位停止位 TR1 = 1; // 启动定时器1 TI = 1; // 发送允许位置1 while(1) { if(RI) // 接收到一个字符 { cmd = SBUF; // 读取接收到的字符 RI = 0; // 清除接收中断标志 if(cmd == 0x01) // 控制LED亮 { LED = 1; } else if(cmd == 0x02) // 控制LED灭 { LED = 0; } } } } ``` 上述代码仅作为示例,实际项目中需要根据具体情况进行修改和完善。同时,需要注意串口通信的稳定性和可靠性,避免数据丢失或错误。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值