- 博客(9)
- 收藏
- 关注
原创 如何通过结构体成员获取结构体的首地址?
现在需要通过成员变量list间接获取结构体TempHumiSensor_t的首地址,这样就可以依次访问变量id, humi, temp了。思路:获取结构体成员变量list的地址,然后获取其在结构体中的偏移量,那么结构体首地址 = 地址 - 偏移量。需求:通过结构体中某一个成员变量间接获取结构体的首地址。可以将以上的代码封装成宏,方便使用。
2025-01-05 18:59:14
253
原创 串口收发不定长数据的解决办法
在初始化串口和定时器,并且使能串口接收中断以及定时器更新中断后,当接收到第一个字节数据时,启动定时器,在串口中断函数中不断清除计数器值,当一串数据接收完成时,计数器溢出产生更新中断,这时就代表一串数据的接收完成。超时时间可根据波特率设置,比如波特率设置为9600,接收一个字节需要的时间T=(1/9600/10 ) * 10^3 ≈ 1ms,我们可以认为只要超过1ms没有接收到数据,说明当前数据已经接收完成,因此超时时间可设置为2ms,当然设置大一些也没问题。
2024-10-07 22:24:50
1031
原创 浅谈对指针的理解
其实这⾥是把data的修改交给了p来操作,这样data的修改就多了⼀种的途径,而且在以后得学习中我们也经常要用到指针,比如:当要调用一个函数来修改某个变量的值时,如果直接把变量当作函数的参数(传值调用)是达不到我们想要的目的的,这时就需要使用到指针(地址),也就是把变量的地址当做函数参数(传址调用)进行操作。有细心的小伙伴会发现内存中存放的数据和我们实际看到的会不一样,内存中是倒着放的,这其实是因为当超过一个字节的数据在存储的时候,会有存储循序的问题,如果有兴趣可以了解一下。,我们该如何理解这个表达式呢?
2023-08-18 15:21:06
73
1
原创 基于51单片机的感应开关盖垃圾桶
根据以上数据,我们可以使用定时器0定时0.5ms触发中断,定义一个计数器cnt用来记录触发中断的次数,触发中断40次为一个周期(20ms),在一个周期中依据不同的旋转角度调整对应的占空比。通过控制占空比控制舵机旋转角度,即向舵机输出不同的PWM信号,PWM波的频率不能太高,大约50Hz,则周期T = 1/f = 20ms。2.5ms-----------180度;0.5ms-------------0度;1.0ms------------45度;1.5ms------------90度;
2023-08-13 11:34:20
102
1
原创 \0是字符串的结束标志
arr1中多了'\0'这个字符,正是这个'\0'让arr1能正常打印出abcd,arr2打印出现乱码,原因就是printf函数在打印的时候,当遇到'\0'时才会停止打印。由此我们可以知道'\0'是字符串结束的标志。C语⾔中如何表⽰字符串呢?使⽤双引号括起来的⼀串字符就被称为字符串,如:"hello world",就是⼀个 字符串。可以看到,字符串中赫然存在'\0'这个字符。那这个'\0'有什么用呢?
2023-07-20 18:58:27
151
1
原创 模拟实战strncpy函数
第二,当源字符串长度小于所需要拷贝的字符个数时,在拷贝strlen(src)个字符后,在目标字符串中追加count-strlen(src)个'\0'。第一,当源字符串长度strlen(src)大于或者等于所需要拷贝的字符个数count时,直接拷贝count个字符,在目标字符串中不需要追加'\0';基本格式:char*strncpy(char*dest,const char*src,size_t count);
2023-06-22 15:27:54
83
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人