- 博客(58)
- 收藏
- 关注
原创 工业互联项目设计思路
任务间的通知使用的是信号量,开关量传感器和环境检测传感器都是通过中控的UART2,温湿度则是通过UART4,所以开关量传感器和环境检测传感器对应的两个任务之间需要有资源保护,不然的话就会有bug,资源保护使用了互斥量,保证同一时间内只能有一个任务使用串口2进行发送。同时涉及临界区的还有设置modbus从机的ID,因为经过多次的轮转可能有一定的概率出现在任务2设置了ID后,然后到任务3运行了,并且任务3设置了ID,然后又轮到任务2运行了,这就会导致任务2后面的操作就是对其他从机通信!
2025-05-07 10:07:25
986
原创 Modbus 通讯协议(超详细,简单易懂)
阅读 Modbus 协议时会发现它的概念别扭、重复、不易区分,比如线圈 状态(Coil Status)、离散输入状态(Discrete Input Status)、保持寄存器(Holding Register)、输入寄存器(Input Register)。想得到按键输入状态时,读取到的是一位数据;想控制 LED 时,需要输出一位数据,想读取 LED 当前状态时,也可以读取到一位数据想读取参数时,读取到的“输入寄存器”,得到多位数据,比如 16 位数据。
2025-05-03 22:23:53
3013
原创 UARA串口开发基础
这个方法其实还是不是很高效并且相对浪费CPU,因为我们程序在发送或者接收完成前都会去访问标志位,还有就是假如我们刚访问完标志位,此时还没有变1,上面的代码就是需要进行休眠1s,如果标志位在下0.5s就变1了,那我们岂不是浪费了时间吗,这样显的效率很低下,所以我们引进RTOS就可以很好解决这些缺点了!当我们使能 IDLE 中断后,它并不会立刻产生,而是:至少收到 1 个数据后,发现在一个字节的时间里,都没有接收到新数据,才会产生 IDLE 中断。要读取数据时,先判断 RDR 非空,再读取 RDR 得到数据。
2025-04-28 21:29:16
921
原创 Linux线程
这里的条件不满足表示wait函数没有被唤醒,这涉及到下一个函数,先看上面的代码:线程先lock(持有互斥锁),这时其他线程如果也想获得这个锁就会被阻塞,该线程代码继续执行到pthread_cond_wait 函数时,该线程会释放锁,并进入阻塞状态等待被其他线程唤醒;当一个可汇合的线程终止时,它的线程ID和退出状态将留存到另一个线程对它调用pthread_join。子线程运行时,申请了一块内存还没内有释放的时候,被主线程取消了,这就会造成内存泄漏,这是不好的,所以我们需要进行线程的清理,这是很有必要的!
2025-04-05 20:29:38
945
1
原创 基于Linux C++多线程服务器 + Qt上位机开发 + STM32 + 8266WIFI的智慧无人超市
这是一个涉及挺多技术栈的项目,含金量也是很不错的,不仅包含了单片机的知识点还包含了LInux和QT上位机开发,设涉及了很多方面的,大家可以一起学习起来,以后还会继续分享更多的项目一起学习!可以点个关注留个眼!针对传统超市购物车结账排队时间长、付款效率低的问题,提出了一种更符合现代购物方式的解决方案——基于RFID技术的自助收银系统。随着人们逐渐适应快节奏的生活方式,自助收银机因其高效便捷而备受青睐,理由也很明确:自助收银不仅减少了排队时间,还避免了与收银员近距离接触,尤其在防疫期间让人更安心。
2025-03-30 19:39:55
2065
15
原创 MySQL数据库入门
本博文是学习基于Linux+STM32+esp8266的超级智能无人超市项目里面所需要的一小些数据库使用,本博文便于学习这个项目的数据库部分,可以根据后面的最后一个使用实例来练习数据库的连接,表的删除和更正、查询!
2025-03-26 21:43:11
1310
6
原创 QT入门笔记2
这个是学习QT中实现的一个小项目——串口助手,这里是根据串口助手制作过程中所需要使用的类和插件制作的一个笔记,方便以后成为我们的技术库,很方便于我们日后开发!
2025-03-16 21:31:14
396
原创 Qt入门笔记
我这里起名为Mybotton继承于Widget(注意第一个字母要大写).h文件Q_OBJECTpublic:protected://离开widget窗口//进入widget窗口signals:.c文件然后因为我们是继承于Widget类,所以我们生成一个Widget:然后右键点击矩形,点击提升为我们刚才创建的类:mybotton.hQ_OBJECTpublic:protected://离开widget窗口//进入widget窗口signals://声明信号。
2025-03-11 20:31:16
1021
3
原创 ESP8266入门教程
ESP8266 是一个非常强大的 WIFI 模块,可以利用串口与单片机进行通讯,从而编程实现控制 ESP8266。利用 ESP8266 可以访问一些 API,获取天气信息或者完成网络授时,也可以连接云平台进行开发。不过因为是串口传输,速度较慢,不能用来传输图像、视频这些大容量的数据,但是传些传感器数据还是绰绰有余的。我们常说的 ESP8266 是指 ESP8266 WIFI 模块,它是物联网和嵌入式开发常用的模块,其中 ESP8266 是 WIFI 模块的芯片型号。
2025-03-09 19:30:12
4653
原创 基于STM32的火灾报警设备(开源)
这是一个简单的基于STM32的小项目,是帮别人的制作的一个课设,项目很简单,成本也非常低,这里我开源给大家一起学习,适合刚入门的小白可以尝试做一下!手把手连接阿里云手把手移植U8g2库(实现有趣动画UI)熟悉u8g2库的使用资源代码分享:通过网盘分享的文件:基于STM32火灾检测设备_阿里云链接: https://pan.baidu.com/s/1LDvoTKHa6N70h_gpwMsLcA?pwd=qsqv 提取码: qsqv --来自百度网盘超级会员v4的分享。
2025-03-07 18:55:51
684
原创 STM32 HAL库&标准库+ESP8266+机智云
最近在项目中需要云平台对接,前面使用的是阿里云物理平台,不过好像没有可以在手机很方便打开连接的,所以我在网上找到一些资料,发现机智云是一个不错的平台,网上的资料很多,而且很方便,可以根据MCU生成代码,代码可以直接使用,其他型号仅需稍微移植一下即可使用,对于新手而言非常友好,在实际开发移植中,还是会遇到很多问题,网上的教程(比如某站的视频)都是多为20和21年的,和现在的机智云平台自动生成的代码还有很多区别的,现在我将我一直成功的开发心得记录下来!手把手教会大家移植!一、硬件准备1.1、主要材料准备。
2025-02-20 14:49:43
2976
3
原创 STM32HAL库快速入门教程——常用外设学习(2)
DMA(Direct Memory Access),即直接存储器访问。DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的通路, 能使 CPU 的效率大为提高。内部有 2 个 DMA 控制器(DMA2 仅存大容量产品中), DMA1 有 7 个通道。DMA2 有 5 个通道。每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。众所周知,DMA中有另种模式,①内存内存之间,②内存外设之间。
2025-02-14 20:54:22
1046
1
原创 基于STM32的阿里云智能农业大棚
手把手移植基于STM移植U8g2图形库教程——0.96寸OLED(附送整理资料)手把手连接阿里云教程里面都会有所需的固件和工具和教程!这可以作为一个简单的课设或者用来水毕设的一个小项目,总体来说挺简单的,我做完后就打算开源出来大家一起学习一下,具体功能如下:1、按键:按键一:切换菜单按键二:切换选项按键三:+-或调节风扇 | 水泵 | 灯光按键四:确认 | 连接阿里云平台2、液晶屏幕显示:菜单1:主界面显示空气温湿度,土壤湿度,光照强度,检测是否超过或低于临界值菜单2:临界值调节。
2025-01-26 23:41:17
2387
10
原创 STM32HAL库开发进阶实战(3)——基于STM32连接阿里云物联网平台
资料下载:通过网盘分享的文件:连接阿里云无敌资料链接: https://pan.baidu.com/s/10bUW0Ansi_-dF8tTsPlWCg?pwd=9cux 提取码: 9cux--来自百度网盘超级会员v3的分享。
2025-01-22 12:38:16
1283
5
原创 STM32HAL库快速入门教程——常用外设学习(1)
控制引脚输出高、低电平,或直接驱动、或间接驱动LED、继电器等期间实现开关功能;芯片接收外部输入高、低电平,以此确定某些外部设备(例如按钮、开关)状态,做出相应操作。PSC(预分频系数),ARR(自动重装系数),CCR(捕获/比较系数)PWM的频率计算公式为:Freq=时钟频率(72MHZ)/ (PSC + 1) / (ARR + 1);PWM模式1(向上计数) :计数器从0计数加到自动重装载值(TIMx_ARR),然后重新从0开始计数,并且产生一个计数器溢出事件。
2024-12-07 13:17:34
2153
10
原创 STM32HAL库开发进阶实战(1)——手把手基于STM32移植U8g2图形库教程(0.96寸OLED)
U8g2是一个功能强大的C++图形库,专为嵌入式系统而设计,是一个开源的图形库, 主要用来驱动小屏幕, 内部继承了I2CSPI, 支持常用的小屏幕支持很多型号!
2024-11-24 01:56:26
3048
39
原创 Linux驱动开发基础——Hello驱动程序(一)
file_operations 结构体 hello_drv 定义,里面提供了 open/read/write/release 成员,应用程序调用 open/read/write/close 时就会导致这些成员函数被调用。到此,学习驱动开发的开端——Hello驱动我们就完成了,希望对一起入门驱动的大佬们有帮助,觉得有帮助的可以三连!阅读一个驱动程序,从它的入口函数开始,hello_init就是入口函数。B. ./hello_drv_test -r // 把驱动中保存的字符串读回来。
2024-11-13 20:27:18
990
3
原创 Linux应用开发基础知识——tslib应用编程(十一)
因为是递归调用,所有最先使用 input 模块读取设备节点得到原始数据,再依次经过 pthres 模块、dejitter 模块、linear 模块处理后,才返回最终数据。对于所有的“module_raw”,都会插入 tsdev.list_raw 链表头,一般只有一“module_raw”。无论是调用 ts_read 还是 ts_read_mt,都是通过 tsdev.list 中的模块来。,前者用于读取单点触摸屏的数据,后者用于读取多点触摸屏的数据。拷贝过去板子:cp test ~/nfs_rootfs/
2024-11-09 22:22:45
1154
原创 Linux应用开发基础知识——输入系统应用编程(十)
⚫ 先来了解什么是输入设备?常见的输入设备有键盘、鼠标、遥控杆、书写板、触摸屏等等,用户通过这些输入设备与 Linux 系统进行数据交换。⚫ 什么是输入系统?输入设备种类繁多,能否统一它们的接口?既在驱动层面统一,也在应用程序层面统一?可以的。Linux 系统为了统一管理这些输入设备,实现了一套能兼容所有输入设备的框架:输入系统。驱动开发人员基于这套框架开发出程序,应用开发人员就可以使用统一的 API 去使用设备。作为应用开发人员,可以只基于 API 使用输入子系统。但是了解内核中输入。
2024-11-09 22:22:06
678
2
原创 Linux应用开发基础知识——串口应用编程(十二)
串口可以将接收来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接收的串行数据流转换为并行的数据字符供给CPU的器件。例子:$GPGGA,074529.82,2429.6717,N,11804.6973,E,1,8,1.098,42.110,,,M,,*76。函数不多,主要是需要设置好 termios 中的参数,这些参数很复杂,可以参考Linux 串口—struct termios 结构体。,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。
2024-11-09 15:45:38
1519
原创 Linux基础项目开发day06:量产工具——业务系统
我们目前已经搭建了显示系统、输入系统、文字系统、UI系统、页面系统,这就已经完成了这个项目的百分之80了,之间的都是独立的开发基础,我们就是要利用前面的基础来合成再运用产品所需要的逻辑,就可以实现项目功能!1.前面实现了各个子系统:显示、输入、文字、UI、页面2.它们只是提供基础能力,跟业务逻辑没有关系3.这样的架构很容易扩展,可以在这上面实现各种业务4.比如可以做收银机、自动售卖机、智能称、取号机;再加上摄像头显示,就可以做出可视对讲、视频监控、人脸红外测温。
2024-10-21 19:10:41
904
2
原创 Linux基础项目开发day04:量产工具——UI系统
前言前面我们实现了显示系统,输入系统还有文字系统,都封装成了独立的系统库,我们现在就来搭建界面系统!
2024-10-16 21:55:58
1066
1
原创 Linux基础项目开发day03:量产工具——文字系统
使用点阵绘制文字时:每个文字的大小一样,前后文件互不影响 ,使用Freetype绘制文字时:大小可能不同,前面文字会影响后面文字。的矢量字体文件中获得,所以我们需要抽象出一个结构体用来描述这些字符,一个结构体描述一个文字的位图,一个结构体描述一个字库操作。因为在显示系统和文字系统中都用到了区域结构体,所以我们干脆就单独把它拿出来放在一个h头文件里面,名为一个公共头文件!,能描述字体的操作,比如Freetype的操作、固定点阵字体的操作。,能描述一个“字符”:位置、大小、位图,我们还要抽象出一个结构体。
2024-10-15 19:45:30
945
原创 Linux应用开发基础知识——LInux学习FreeType编程(七)
字体文件中保存有字符的原始关键点信息,使用 freetype 的函数可以放大、缩小、旋转,这些新的关键点保存在插槽中(注意:位图也是保存在插槽中)。那么左上角为(x, y)时就可以算出pen 为(x-x’, y-y’)。那么左上角为(x, y)时就可以算出pen 为(x-x’, y-y’)。反过来也是一样的,在笛卡尔坐标系中坐标是(x, y),那么它在 LCD 坐标系中坐标值为(x, V-y)。在 LCD 坐标系中坐标是(x, y),那么它在笛卡尔坐标系中的坐标值为(x, V-y)。
2024-10-12 22:08:31
1525
原创 Linux应用开发基础知识——(TCP和UDP)网络编程学习(八)
socket函数此函数用于创建一个套接字参数:domain 是网络程序所在的主机采用的通讯协族(AF_UNIX 和 AF_INET 等)。①AF_UNIX只能够用于单一的 Unix 系统进程间通信②AF_INET是针 对 Internet 的,因而可以允许远程通信使用。type 是网络程序所采用的通讯协议(SOCK_STREAM,SOCK_DGRAM 等)。①表明用的是TCP 协议,这样会提供按顺序的,可靠,双向,面向连接的比特流。②SOCK_DGRAM表明用的是UDP 协议。
2024-10-09 19:49:21
1399
2
原创 Linux基础项目开发day1:量产工具——显示系统
上面所写的是要选择哪个设备进行显示,需要中间加一个函数进行选择,起到承上启下的作用,用于管理显示管理,是操作Framebuffer还是web设备!① 我们主要是将其分为了两层,上层要获得下层某个结构体,通过这个结构体中的函数来初始化、操作、回执、刷新上层的界面。有些还没有定义的参数名称详细介绍在后面介绍,在disp_manager.c中!输出,对于两个不同的设别我们需要抽象出同一个结构体类型!这个结构体是一步一步通过补充的得到的,缺啥就补啥!②所以我们需要定义一个统一的结构体DisOpr。
2024-10-06 20:27:57
460
原创 Linux应用开发基础知识——Framebuffer应用编程(六)
①驱动程序设置好 LCD 控制器:根据 LCD 的参数设置 LCD 控制器的时序、信号极性;根据 LCD 分辨率、BPP 分配 Framebuffer。②APP 使用 ioctl 获得 LCD 分辨率、BPP③APP 通过 mmap 映射 Framebuffer,在 Framebuffer 中写入数据怎么找到点的地址呢?假设需要设置 LCD 中坐标(x,y)处像素的颜色,首要要找到这个像素对应的内存,然后根据它的 BPP 值设置颜色。
2024-09-28 19:55:38
873
原创 FreeRTOS内部机制学习04(任务通知和软件定时器)
这时候就需要链表上场表演了,创建的定时器的时候创建的各个结构体都会储存在一个链表里面,到时候我就会里面找,比对一下就知道了谁时间到了,周期性的还会更新里面的启动时间和到点时间,方便下次运行!但是,在FreeRTOS实时操作系统中,它想做到实时,就不可能允许在内核,在中断中执行不确定的大小,万一定时器函数非常的长(运行的时间非常长),就会导致Tick中断迟迟无法退出,影响任务的调度,进入影响整个系统!都是利用队列唤醒一个任务来执行其他的工作的,软件定时器中的这个任务叫“任务通知则是不用创建,节省了很多空间!
2024-09-12 21:37:01
779
原创 FreeRTOS内部机制学习03(事件组内部机制)
在队列、信号量、互斥量使用他们的函数后,可能你使用之前就会有一个任务或者索多个因为写满了或者没数据可读因此阻塞了,然后假如你在中断中使用了API函数了,就会因此去唤醒他们吧,但是队列它们三个都只会去唤醒一个任务(优先级最高的),相反事件组会去唤醒所有符合这个事件发生条件的任务,那万一一个工程里面真有很多事件在等着同一个事件呢?(比如主人回到家后,自动唤醒灯,风扇,空调,煮饭,。而是仅仅关闭调度器呢?是多么的重要,多么的强大,事件组亦是如此,在创建事件组的时候也分配了一个结构体,那么里面到底又有什么东西呢?
2024-09-08 21:44:38
948
原创 FreeRTOS内部机制学习02(消息队列深度学习)
当一个任务因为使用互斥量被另一个任务卡住了,被迫休眠,那么内部就会比较一下这两个任务的优先级,假如,被卡住的任务的优先级>卡住别人的任务,那么卡住的任务就会将对方的优先级提高到像自己一样高级别的优先级,让他更早的运行,及时释放互斥量,让我(卡柱的任务)及时运行!由于低优先级的任务获取了信号量,使得最高优先级的任务卡住了(休眠),那么不就只能中优先级的任务运行了吗?读写任务休眠的时候,可以选择休眠,也是可以选择休眠多久的,不可能呆呆一直傻等着,所以等待的时候是可以设定等待时间的,时间一到,我就不等了被唤醒。
2024-09-08 14:06:27
1175
原创 FreeRTOS内部机制学习01(任务创建的细节以及任务调度的内部机制)
关于任务的轮换以及中断恢复继续得以原来为止继续运行,一点也离不开寄存器的作用,所以想要了解任务,了解寄存器也是必不可少的!
2024-09-06 20:10:52
1014
2
原创 CubeMX对FreeRTOS的适配
本文章算是对于自己学习FreeRTOS的一个小小总结,我个人比较健忘,也算是为了防止我后面好久没有用CubeMX了忘记了,主要用于备忘吧!
2024-08-09 21:51:16
809
原创 Linux应用开发基础知识——Linux进程间通信2(五)
1.信号的名字和编号每个信号都有一个名字和编号,这些名字都以“SIG"开头,例如"SIGIO","SIGCHLD"等等。信号定义在 signal.h 头文件中,信号名都定义为正整数。具体的信号名称可以使用 kill -l 来查看信号的名字以及序号,信号是从1开始编号的,不存在0号信号。kil对于信号0有特殊的应用。(使用 kill -l 指令查看信号的名字以及序号)假设我们写了一个无限循环的程序,想要让它停止运行,我们会按Ctrl+C键来终止进程,其实就是向进程发送了第2个信号SIGINT。
2024-08-02 23:50:45
956
原创 Linux应用开发基础知识——Linux进程间通信1(四)
进程之间可能会存在特定的协同工作的场景,而协同就必须要进行进程间通信,协同工作可能有以下场景。数据传输:一个进程需要将它的数据发送给另一个进程资源共享:多个进程之间共享同样的资源。通知事件:一个进程需要向另一个或一组进程发送消息,通知它发生了某种事件。·进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变那如何实现进程间通信呢?
2024-08-01 21:49:32
885
原创 Linux应用开发基础知识——进程学习2(exec函数、system函数、popen函数)(三)
功能:在调用进程内部执行一个可执行文件。可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件。
2024-07-22 21:43:55
817
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人