- 博客(310)
- 收藏
- 关注
原创 libmodbusTcp发送自定义功能码
* 第一位是地址,第二位是功能码,后面是数据内容,无需添加crc校验码,库中会自动添加*/return -1;出现TCP粘包问题,且数据接收不完整解决办法:修改libmodbus底层驱动函数,详细的可以看下面的文章//response_len为想要接收的数据长度, 不含从站地址和功能码。
2025-12-23 14:38:10
163
原创 TCP协议实战
time_wait状态如何产生?首先调用close()发起主动关闭的一方,在发送最后一个ACK之后会进入time_wait的状态,也就说该发送方会保持2MSL时间之后才会回到初始状态。MSL值得是数据包在网络中的最大生存时间。产生这种结果使得这个TCP连接在2MSL连接等待期间,定义这个连接的四元组(客户端IP地址和端口,服务端IP地址和端口号)不能被使用。2.time_wait状态产生的原因1)为实现TCP全双工连接的可靠释放。
2025-12-08 17:06:11
666
原创 BF8815A
了解ADBMS1818芯片的人会发现,这款BF8815B和1818有着很多相似的东西,当你了解其中一款AFE之后,另一款你的上手也会特别快,下面文章是我针对1818梳理的一些重要知识点,此篇文章主要讲解BF8815B的一些差异点。
2025-12-03 13:32:59
159
原创 磷酸铁锂电池和铅酸电池的比较
铅酸蓄电池凭借其成熟的工艺以及高稳定性成为市面主流电池类型。随着时代的发展,铅酸蓄电池体积大、寿命短和运维成本高等问题逐渐凸显。因此,需寻找一种新的蓄电池替代铅酸蓄电池作为铁路通信电源的蓄电池组,从而改善目前存在的运营和维护等相关问题。
2025-11-28 11:01:27
349
原创 如何评估SOC的精度在3%以内
整个过程中,“主角BMS”的SOC读数与“裁判系统”的SOC读数之间的最大偏差,就被定义为该BMS的精度(例如±3%)。总结:先放空,在充满,校准真实满充容量,此时外部仪器(逻辑分析仪)也校准满充容量。然后再特定工况下充放电,此时以逻辑分析仪记录的容量为准,计算得出的真实SOC和BMS计算SOC对比,整个过程SOC的精度在3%以内。
2025-11-19 15:40:55
46
原创 iMX6ULL使用GUI Guider开发LVGL
GUI Guider是恩智浦为LVGL开发了一个上位机GUI设计工具,可以通过拖放控件的图形化设计方式开发LVGL GUI页面,加速GUI的设计。相比LVGL官方推出的付费工具 SquareLine Studio ,GUI Guider完全免费,它们甚至开发页面的布局都类似,但两者功能上,GUI Guider也相应的没有SquareLine Studio 细致和丰富,希望NXP能持续的优化更新。
2025-11-06 17:14:36
640
原创 IMX6ULL移植LVGL(V8.2版本)
获取lvgl源码。注意:此教程不适用于lvgl9.0以上版本,最好下载指定版本,这样教程就完全可以使用先将下载好的源码文件夹lvgl和lv_drivers放在lv_port_linux_frame_buffer的路径下。
2025-11-05 15:28:53
859
原创 BMS专有名词英文总称
1、BMS : battery management system 电池管理系统。2、EMS : energy management system 能源管理系统。5、SOH : state of healthy 电池健康状态。15、SOE : state of energy 能量状态。14、SOP : state of power 功率状态。7、DC : direct current 直流电。
2025-10-30 16:21:52
818
原创 AFE断线检测
采样断线是影响单体电池电压采样的常见故障,结合实际应用的软硬件平台,对采样断线检测功能进行了分析,提出了针对断线检测具体的应用策略,并给出了示例判定流程,以便及时发现电池采样断线的情况,防止因断线造成的单体一致性或过、欠压的误判,从而避免因误判造成的保护误动,实时保证电池组的安全、可靠运行。
2025-10-30 16:21:13
418
原创 跨平台文件共享(NFS/HTTP/FTP)
工控机和虚拟机传输数据时,一般采用网络通信,即用命令行的方式传输数据,或者在虚拟机中制作一个根文件系统,然后工控机网络挂载根文件系统的方式,直接可以本地传输,但是这面这些方式都是比较麻烦的,有没有一种方式,可以向虚拟机和电脑之间使用ftp协议,传输文件,即给工控机配置FTP服务器。
2025-10-30 16:16:47
418
原创 Ubuntu网络图标消失/以太网卡显示“未托管“/上电网卡默认失效
我们搜索解决问题教程时,会出现很多配置方式,现在就是讲解他们之间的关系,如果不需要,请直接跳过此章节,看下一章节。
2025-10-30 11:41:57
359
原创 linux编译内核(imx6ull)
写本教程的时候最新的编译器版本是 9.4.0,但是笔者在测试9.4.0 版本编译器的时候发现编译uboot 会报一系列错误。原因就是最新的版本缺少低版本内核所需的头文件,导致报错所以这里不推荐使用最新版的编译器。笔者测试过 4.9 版本的编 译 器 可 以 正 常 工 作 , 所 以 我 们 需 要 下 载 4.9 版 本 的 编 译 器 , 下 载 地 址 为 :然后执行下述的命令,安装交叉编译器。
2025-10-17 10:26:07
795
原创 Ubuntu 和 Windows 文件互传
在开发的过程中会频繁的在 Windows 和 Ubuntu 下进行文件传输,比如在 Windwos 下进行代码编写,然后将编写好的代码拿到 Ubuntu 下进行编译。Windows 和 Ubuntu 下的文件互传我。
2025-10-13 10:23:29
536
原创 虚拟机远程调试工控机
当代码存在问题,需要打断点进行调试,工控机安装gcc,gdb占用空间较大,因此会把调试环境安装在虚拟机中,给他配置一个相同的交叉编译环境,然后再虚拟机中远程调试。工控机:只有可执行文件,无编译器,无gdb,只有gdbserver虚拟机:源代码,交叉编译器,VScode,调试器。
2025-10-11 13:27:06
784
原创 VScode配置SSH+免密登录+免密传输
1、安装插件2、点击左下角的两个箭头3、点击连接到主机,然后点击配置SSH主机4、选择ssh配置文件,本文选取第一个5、输入用户名和ip。
2025-10-10 15:24:20
907
原创 用户态阻塞和非阻塞读内核态数据
当我们编写一个读GPIO状态的驱动程序时,我们会重写read函数,然后再read函数里面返回IO口的状态,然后应用程序调用read一直循环读,但此时我们会发现,此进程的CPU资源占用足够高,问题来了,read函数读不到数据,默认处理方式是阻塞,进入休眠状态,然后等待被唤醒,这期间是不占用CPU资源的,或者,给fd文件描述符设置为非阻塞模式,此时读不到数据就会返回,那为什么CPU资源还会特别高呢?
2025-09-10 11:05:06
817
原创 Linux 并发与竞争
Linux 系统是个多任务操作系统,会存在多个任务同时访问同一片内存区域,这些任务可能会相互覆盖这段内存中的数据,造成内存数据混乱。针对这个问题必须要做处理,严重的话可能会导致系统崩溃。现在的 Linux 系统并发产生的原因很复杂,总结一下有下面几个主要原因:①、多线程并发访问,Linux 是多任务(线程)的系统,所以多线程访问是最基本的原因。②、抢占式并发访问,从 2.6 版本内核开始,Linux 内核支持抢占,也就是说调度程序可以在任意时刻抢占正在运行的线程,从而运行其他的线程。
2025-09-02 14:15:37
614
原创 linux系统移植
U-Boot、Linux kernel 和 rootfs在移植 Linux 之前我们需要先移植一个 bootloader 代码,这个 bootloader 代码用于启动 Linux 内核,bootloader 有很多,常用的就是 U-Boot( Universal Boot Loader,通用的引导加载程序)。
2025-09-01 15:39:33
503
原创 linux操作系统点亮一个LED灯
主设备号主要用来描述一个驱动的种类,而次设备号主要描述这个种类下,它是第几个设备,就比如,我现在要控制4个LED灯,那么他们的主设备号都是10,次设备号分别是0,1,2,3,这样做的好处是我可以只写一份驱动代码,但可以同时操控4个led灯,除开led灯,其他的设备都是如此,这样可以做到代码去重,高度精简。因此编写设备树的过程,我们要让内核能够理解我们的语言,因此创建设备树的人就创建了一系列的子系统,我们如果想要使用一些外设,就是根据我们的原理图,用设备树提供的模板,把这些信息分门别类地填写到对应的节点中。
2025-08-29 11:28:59
875
原创 linux和RTOS架构区别
现阶段单片机的内核有cortex-M3或者cortex-A7等,一般M3内核主要用来移植一些轻量级操作系统,例如FreeRTOS,rtthread等,但是A7内核一般会用来移植linux操作系统,问题来了,我该怎么知道我要用什么系统了。。
2025-08-29 11:27:23
1109
2
原创 网络是如何传输的
最开始两台电脑通过一个网线连接就可以互相通信,后面慢慢的,越来越多的电脑需要互相通信,这样网线的连接越来越麻烦,两台电脑通信时只需要一根网线,三台电脑通信时就需要三根网线,四台电脑通信时就需要(3+2+1)根网线,五台电脑通信时就需要(4+3+2+1)根网线,这样子一直下去,那么网络的连接特别杂乱,并且可能很难分清谁和谁没有连接,因此集线器就此产生。
2025-08-26 15:06:40
703
原创 深入理解底层通信协议和应用层协议的区别
了解协议之前,我们首先需要清楚的概念底层通信协议:USART、IIC、SPI、CAN、TCP、UDP应用层协议:MQTT、HTTP、Modbus RTU/TCP底层通信协议的作用:仅提供数据的传输,不关注数据的含义,只需要保证数据从一头可以传递到另一头即可应用层协议的作用:赋予数据的含义,主机需要按照协议规定的格式发送数据,从机需要按照协议规定的格式读取数据,如果不知道这个协议,那么也就解析不了数据。
2025-08-22 14:23:39
904
原创 带你了解网络通信五层架构
所以通过上述描述,我们知道了以太网主要用于计算机之前传递消息,那么我们知道这个原则之后,我们如果想要使用以太网需要满足那些条件呢?以太网定义了从。
2025-08-20 17:12:38
181
原创 VS Studio开发modbus RTU上位机(附赠源码)
5、增加通信状态显示,10S内没有接收到数据就默认离线。3、采用异步发送机制,防止阻塞,导致程序卡顿。2、封装了03 04 06 10 的写。4、采用模拟单片机空闲中断接收一帧数据。6、提供03 04 数据处理模板。1、正常的发送和接收数据。
2025-08-18 16:39:07
268
原创 C语言+安全函数+非安全函数
例如,当我们将一个字符串要赋值到另一个数组中时,我们一般会使用C语言自带的strcpy函数,但是针对该函数的底层实现,仅仅只是傻瓜式的将源地址的数据存储到目的地址,不会注意缓冲区是否溢出,如果目的地址空间不够,那么相邻的地址的值会被改变,然后读取的数据不对,严重的可能会造成程序崩溃。而这更重要的一点就是始终检查边界、验证输入、启用编译器警告,需要让代码做到0警告,以后调用一些C语言函数时,可以先了解一下是否有安全函数,如果有就可以直接用,虽然这是一个小问题,但是会无意间增加代码的鲁棒性。
2025-08-15 10:22:17
296
原创 手把手教你理解内存对齐
Arm对内存的访问支持字(4byte)、半字(2byte)、字节(1byte)的直接访问,但是呢他们是有一定的要求的:存取字时要求地址按字对齐,也就是地址要是4的整数倍,如0x0000、0x0004、0x0008(该地址只是举例,mcu的地址分配请参考具体手册的地址映射图)存取半字是要求地址按半字对齐,也就是地址是2的倍数,这样假如通过0x0001、0x0003这样非2倍数的地址来读取一个半字就会进入硬件中断错误存取字节简单,只要地址不超范围就可以。
2025-08-14 11:32:16
1059
原创 RS485+DMA+空闲中断+HAL库收发数据
(1)DMA是单片机集成在芯片内部的一个数据搬运工,它可以代替单片机对数据进行传输、存储,节约CPU资源。一般应用场景,ADC多通道采集,串口收发(频繁进入接收中断),SPI和IIC通信等(2)STM32F2系列的DMA控制器最多有2个,每个控制器有8个数据流,每个数据流可以映射到不同的通道。例如,DMA2的数据流7可能用于某个特定外设,比如USART1的TX。(每个数据流同一时间只能服务一个外设。
2025-08-12 14:38:22
1150
原创 DMA伟大的数据搬运工
上述的一些配置参数不需要背诵,需要理解,当自己配置DMA时,首先会找例程代码或者晚上搜索代码,然后复制下来,自己只需要知道要配置哪一些参数,如何使用即可。
2025-08-08 16:51:50
819
原创 MODBUS代码框架详解
3、代码中如何存储数据,首先一定会有一个结构体A用来存储模块数据,但是当很多模块都要和上位机通信时,这时候本能反应还是采用结构体A发送数据,但是考虑代码的可拓展性,会发现如果还用结构体A发送数据就会有点混乱,例如,结构体A存储0-56的数据,结构体B存储57-86的数据,这时候对于读写数据的处理都特别麻烦(可以自己思考一下如何写代码),因为读写数据时没有一个严格的规范,需要自己人为记住偏移量,自己看代码也会很麻烦,而且如果结构体A需要新增协议,这时候还会打乱原有结构。成本低:只需要RS485芯片+双绞线。
2025-08-08 10:04:33
461
原创 PID理解(入门级)
有一条y=x的曲线,我要求x=1处的微分,实际上就是y=x的斜率,也就是1,那么就有人问了,为什么这么简单还会出现微分这个词语,原因在于有很多不规则的曲线,直接求去某一点的斜率很难,比如抛物线,在曲线上面任意一点斜率都不一样,此时我们求取就十分困难,所以就出现了微分的概念。就比如,现在有一条直线y=x,我要计算0到1的面积,通过上面的微分或者口算结果都是1,那为什么还有积分的概念了,原因在于,这条曲线可以是无规则的,我们不容易计算出面积,所以就出现了积分的概念。1、计算控制量的变化量。
2025-08-01 10:38:53
820
原创 BCU给BMU分配地址
给多个设备分配地址有很多种办法,只是每种办法都存在一些弊端(1)拨码开关:它可以通过几个IO口控制设备的地址,但通过这种方式,从设备的数量已经受限,其次是如果产品较多,负责拨码的工作人员很容易遗漏或者跳码(2)每个设备单独接线配置固定的地址,操作麻烦,人工配置效率低下。
2025-07-31 14:19:42
118
原创 功率 裕量
储能系统,并网,有PCS,EMS,BMS和负载,PCS的最大功率是100KW,现在设定PCS的功率为10KW,负载所需12KW,此时会向电网取电,但由于功率裕量的存在,此时会将PCS的功率调节到12KW,但如果此时不调节,PCS的功率还是10KW,请问有什么问题?(2)系统响应能力下降,如果负载突然增加到20KW,此时PCS只能从10KW快速爬坡到20KW,如果响应较慢,则需要更大的电网支持。负载尖峰功率 > (PCS设定功率 + 功率裕量),PCS设定功率 = 负载尖峰功率。来减少负载实际消耗的功率)
2025-07-29 13:42:45
460
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅