- 博客(89)
- 收藏
- 关注
原创 工控项目三03-2
为了兼容不同的操作系统,提出了Posix(Portable Operating System Interface of UNIX-like systems)系统调用接口,系统调用IO函数有open, read, write,它们会频繁的进入内核。显示出4个文件,该程序默认打开了4个文件,0是标准输入,1是标准输出,2是标准错误,3是运行本程序打开的文件。因此以后我们可以用scanf从0号文件得到输入,用printf将信息打印到1号文件,用perror将错误信息打印到2号文件。
2025-09-07 16:27:10
270
原创 Paho_Mqtt源码分析
mqtt的一般流程为:1.打通电话(连接服务器:TCP连接);2.验证用户名,密码(MQTT连接);3.发布(封包:主题,消息,Send);4.订阅(封包:主题, Send)5. 循环等待消息,处理消息(Read 数据,解包(主题,消息),处理)
2025-09-06 21:37:53
91
原创 6-2-4 解决第一次发送失败
发生错误原因为accept函数执行的太慢(内部要发生AT命令,等待回复,创建socket),上位机发来数据时,还没来及分配scoket,第一包数据被丢弃。因此后台任务可以在接收的时候分配一个socket。服务器:1.监听,3.接受连接,5.接收数据。6.3 跟上位机的ModbusTCP综合调试。参数传入整个数据包是为了完完整整的回复请求。为返回出错状态,这里设置有限等待时间。客户端:2.连接,4.发数据。
2025-09-06 18:23:53
248
原创 modbus_tcp和modbus_rtu对比&移植AT-socket,modbus_tcp&杂记
modbus_rtu通信时没有连接过程,主机和从机各自初始化自身串口就行了,而rtu需要确定从机ID。注:在TCP连接中,不同的网卡有不同的IP,port对应具体的程序。
2025-09-05 21:49:11
265
原创 RT-Thread源码分析&字节实现socket源码
自定义AT_Device结构体,里面有多个socket(至于支持多少个socket要看芯片手册),后台线程将解析的数据分发给多个socket。解析属于哪个socket, 存入对应socket的buff, 唤醒接收者。后台线程是通信的核心,在后台线程的帮助下,APP才能发送AT命令,才能接收到网络数据。实现socket源码:详见Third_Party的at_socket文件夹。w800.c是最核心的文件,里面实现了w800相关的函数和创建后台线程。发送的底层都是发送AT指令:1)发送命令到串口;
2025-09-05 19:07:27
166
原创 项目一综合实现
Record data最小为2Bytes, 最大为244Bytes。File Number用来区分数据是发给H5上的传感器还是f030上的传感器。Write File Record每次只能传输一个Record,因此大文件要拆分成许多Record,因此发送文件时,要明确a.哪一个文件;使用modbus的Write File Record功能(功能码为0x15)来发送上述的映射关系文件。为发送整个文件,在第0个Record中记录文件的信息,在Record data中自定义文件信息相关报文。
2025-09-04 12:52:10
230
原创 bootloader相关实现
这里设置的是异常向量表的默认地址(0x08000000),不注释掉的话默认会使用bootloader的异常向量表。2.上位机发送固件信息(包括a.长度,b.加载地址(即要烧写到flash的什么地方),c.CRC, d.文件名, e.版本号)4.上位机发送bin文件给bootloader, bootloader进行CRC校验。3.下位机判断版本信息是否比当前更高,更高的话发送0x02给上位机,请求升级。使用bootloader下载功能需要定义下位机和上位机间的传输协议。1.下位机发送 0x01;
2025-09-03 21:14:50
177
原创 UART更好的封装 & 添加容错代码
在modbus_new_st_rtu函数中的_modbus_init_common函数内部ctx->byte_timeout.tv_usec, ctx->response_timeout.tv_usec(即接收一个字节的超时时间,回应的超时时间)都可以改小点,比如。modbus规范中,由于没有起始/结束符,因此在两个数据包之间间隔3.5个字符时间,一个完整的字符时间(包括起始位、数据位、停止位)通常是10-11个比特时间。为了提高产品的稳定性,添加容错代码,增强健壮性。来减少粘包现象的,在此基础上可以2)
2025-09-03 16:42:32
188
原创 访问多个传感器
由于任务内部开辟了较大的buf及其它数组,注意将上面四个任务的栈调大一些,比如300。在cubemx的freertos中的堆也调大一点,比如80k。2. 上位机访问多个传感器。1. 主控访问多个传感器。
2025-09-03 13:16:40
149
原创 libmodbus主机实验(基于usb串口)& 将板载485接口作为后端
开发板作为主机,读取pc Modbus Slave中的数据在屏幕上显示,并且+1返回给从机下一个寄存器。
2025-09-02 14:17:36
144
原创 libmodbus从机实验(基于usb串口)
该实验以pc作为主机,中控板作为从机,获取从机上按键状态,控制led。注意将所有的printf替换成空的宏,以及p_tv不能为空指针。原理:为硬件创建Buff, 上位机读写这些Buff。
2025-09-02 12:40:16
214
原创 libmodbus源码分析
unit-test-client.c (主机)unit-test-server.c (从机)主机发起请求,从机回应请求。
2025-09-01 18:46:46
122
原创 Modbus协议
从机返回(RX) : 01 03 04 0001 0002 2A32,04为字节数,0001 0002为返回的数据,可见寄存器为16bit。数据的物理意义可以是温度,湿度,压力,LED亮度。主机发送(TX) : 01 03 0000 0002 C40B,0000为要读的寄存器起始地址,0002为要读的寄存器个数。Tx:01 06 0005 0002 18 0A, 0005为要写入的寄存器起始地址,0002为写入的数据。16 写多个寄存器,从地址5开始写5个寄存器,分别是1,2,3,4,5。
2025-09-01 11:47:07
245
原创 USBX移植(X是eXtended的意思)
4.添加app文件夹下的ux_device_cdc_acm.c, ux_device_descriptors.c, app_usbx_device.c。2. 添加stack layer,添加含有ux_device_stack_, ux_utility_, ux_system_前缀的C文件。1. 添加Class layer, 添加含有“ ux_device_class_cdc_acm_"前缀的C文件,其中,cdc是。ux_device_cdc_acm_send会调用。4.8 源码分析与改造。
2025-08-31 21:26:13
160
原创 工业互联项目总结:UART
(1)查询方式:也是最基础的一种方式,通过TDR和RDR寄存器来发送和接收数据;(3)DMA方式(和中断方式的回调函数相同)3.8 在RTOS中使用DMA。3.9 面向对象封装UART。3.3 UART编程。
2025-08-31 18:22:37
155
原创 W25Q64的写入
W25Q64这类芯片必须先整页擦除,再写入,这类芯片只能的每一位只能1变0,不能0变1,因此写入前需要先将整个页中的数据复制到内存,在内存中修改对应字节的数据,擦除整页(整页0变1)然后写入。
2025-08-29 15:28:21
99
原创 leetcode 刷题1
如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你的函数应该返回 k = 5,并且 nums 中的前五个元素为 0,0,1,3,4。因为 nums[0] + nums[1] == 9 ,返回 [0, 1]。// 排序 nums 的前 k 个元素。你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。新链表是通过拼接给定的两个链表的所有节点组成的。字符串的第一个匹配项的下标(下标从 0 开始)。
2025-08-15 18:37:44
928
原创 自注意力机制1
Query: 用于主动计算与其它token的相似度。Key: 用于被动计算与其它token的相似度。Value: 表示当前token的重要程度。右侧中,将向量合成矩阵用于并行计算。
2025-05-07 09:10:31
143
原创 立创EDA
电容刚充电时视作为短路,充满电时视为断路,充电过程中阻止不断升高。大容值的电容充放电时间越长。大电容可以应对低频干扰,小电容充放电速度和响应时间比较快,可以应对高频干扰。按住shift键只能绘制横平竖直的线。按住alt键可以按照更小的粒度连线。保险丝对电流敏感,对电压不敏感。
2025-04-29 18:46:38
139
原创 立创EDA
右侧栏属性 --> 位号:R?--> 设计菜单 --> 分配位号 --> 范围:当前图页选中元件 --> 确认。先把单位改为mm,点击测量-->长度,左键确定起点,左键确定终点,往下拖动左键出现长度标注。shift + x :先在原理图中框选,按下shift+x,批量选中pcd中的对应元件。GND铺铜:铺铜-->矩形-->确保网络是GND,框出整个pcd板,确定。图层 --> 板框层 --> 锁定,这样就把板框位置和大小固定了。shift + h : 选中的网络持续高亮/取消高亮。
2025-04-26 22:45:03
934
原创 第一期第18讲26:23
shell文件默认没有可执行权限,因此 chmod 777 myshell.sh。shell脚本以 .sh为后缀,里面存放着一行行要运行的linux指令。shell脚本第一行一定为 #!/bin/bash,表示使用bash。上述代码中,read用于读取变量,-p 用于输出提示信息。total后的"="两边不能有空格。shell支持整型变量的运算。运算表达式要用双重括号。
2025-04-21 19:32:10
213
原创 第一期第16讲,17讲
echo curname: $(curname) # @表示不打印命令执行过程。@echo curname: $(curname) # @表示不打印命令执行过程。@echo curname: $(curname) # @表示不打印命令执行过程。输入make,默认在本文件夹下搜寻Makefile文件执行。="赋值:如果变量之前没有被赋值,当前赋值有效,否则仍是之前的值有效。“=”赋值:name变量的值取决于最终的赋值。"+=" 就是追加内容。
2025-04-18 17:34:32
336
原创 第一期第14讲
3. 命令行模式(底行模式):首先要确保进入一般模式。底行输入:w保存,:q退出,:wq保存退出,:q!退出不保存,:x退出保存。1. 一般模式(指令模式,默认模式):按下esc进入该模式。, A, s, S, r, o, O进入编辑模式。按esc退出编辑模式,进入一般模式。ndd: 删除光标所在行及其下n行。2. 编辑模式:按下i, I,nyy: 复制光标所在及以下n行。p: 复制粘贴到光标下一行。P: 复制粘贴到光标上一行。dd: 删除光标所在的行。yy: 复制光标所在的行。. : 重复上一步操作。
2025-04-18 10:57:45
230
原创 第一期第13讲
cp hello2 test/ //未加-d, 这里拷贝的是源文件,不是软链接。(linux下,天蓝色是文件夹,绿色是可执行文件,蓝色是链接文件,红色是无效文件,白色是各种格式的文件)./hello1 //仍然可以执行,删除hello1,hello2才可以彻底删除文件实体,因此创建硬链接可以防止文件被误删。修改一个硬链接文件,其它互为硬链接的文件以及源文件会同时被修改。test/ //-d 表示保持链接,拷贝软链接文件。硬链接不能跨文件系统,硬链接不能用于目录。
2025-04-18 10:57:10
191
原创 第一期第12讲
第一位为文件类型:b(块设备文件),c(字符设备文件),......ls hello -l //发现权限已经被修改。5-7位:本组其它用户对该文件的权限。8-10位:其它用户对该文件的权限。文件权限:r, w, x(执行)2-4位:本用户对该文件的权限。
2025-04-18 10:56:34
103
原创 第一期第11讲
权限:root用户>初次创建的用户>普通用户。用户信息记录在 /etc/passwd。用户密码记录在 /etc/shadow。1. 初次创建的用户。
2025-04-16 21:08:30
118
原创 第一期第10讲
tar -vcf test.tar test //将test文件夹打包成test.tar,并未进行压缩。tar -vcjf test.tar.bz2 test //压缩为test.tar.bz2。Linux常用的压缩文件扩展名有 .tar, .tar.bz2, .tar.gz。tar -vxjf test.tar.bz2 //解压缩。bzip2 -z a.c //压缩成a.c.bz2文件。gzip a.c //压缩a.c为a.c.gz。gzip -d a.c.gz //解压缩为a.c。
2025-04-16 20:57:28
128
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人