以下代码都是以GD32F470ZIT6芯片代码举例,但是逻辑思路可以借鉴
1、判断通信设备是否在线思路
在进行单片机编程时,经常会遇到单片机和其他设备通信,那我们如何判断设备是否在线?
typedef struct{
int commCount;
bool commOnlineFlag;
}STCommOnlineJudge;
STCommOnlineJudge usart1Comm;
void task1(void)
{
if( ++usart1Comm.commCount > 50 )
{
usart1Comm.commOnlineFlag = 0;//如果在5S里面串口没有通信成功,则说明设备不在线
}
delay_ms(100);
}
void task2(void)
{
//进行通信
if(通信成功,如CRC校验成功,自定义协议成功等)
{
usart1Comm.commCount = 0;//如果通信成功,则通信计数清0,开始重新计数
usart1Comm.commOnlineFlag = 1;//如果通信成功,则将通信标志位置1
}
delay_ms(500);//每500ms读取一次数据
}
2、static的三个作用
(1)static修饰局部变量时,改变了变量的生命周期,让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束,但是作用域不变,仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。
(2)static修饰全局变量时,这个全局变量只能在本源文件内使用,不能在其他源文件内使用。
(3)static修饰函数,该函数只在本文件内被调用或访问,不能跨文件访问,其他文件中可以定义相同名字的函数,不会发生冲突。
3、常见变量存放区域
(1)static无论是全局变量还是局部变量都存储在全局/静态区域,在编译期就为其分配内存,在程序结束时释放。
(2)const全局变量存储在只读数据段,编译期最初将其保存在符号表中,第一次使用时为其分配内存,在程序结束时释放,例如:val_c;const局部变量存储在栈中,代码块结束时释放。
(3)全局变量存储在全局/静态区域,在编译期为其分配内存,在程序结束时释放。
(4)局部变量存储在栈中,代码块结束时释放,
注:当全局变量和静态局部变量未赋初值时,系统自动置为0。
4、switch常用场景
//场景1,代码需要按照严格顺序执行
static int stepNum=0;
switch(stepNum)
{
case 0:
//步骤1
stepNum=1;
break;
case 1:
//步骤2
stepNum=2;
break;
case 2:
//步骤3
stepNum=0;
break;
}
//场景2,例如系统有很多状态,但是没有严格顺序
//首先将系统的状态使用枚举进行定义
typedef enum{
Init=0,
SelfCheck,
On,
Off
}SystemStatus;
static int num=0;
switch(num)
{
case Init:
//初始化动作
break;
case SelfCheck:
//自检动作
break;
case On:
//开机动作
break;
case Off:
//关机动作
break;
default :
break;
}
5、命名小技巧
(1)当存在一个事物有多个品牌时,先事物,在品牌
例如手机有vivo,oppo,xiaomi这三种类型,那么定义为 phone_vivo,phone oppo,phone_xiaomi
(2)PCS目标有功控制功率 PcsAcPowObject,由此定义我们可以看出 先定义有区分度或者重要的名词,不一定要按照中文顺序依次定义
(3)当给变量或者函数命名时,不需要有多高级,需要看到这个命名,你就能知道他的意思,并且不能思考,要做到看命名和读中文一样,如果你看变量的名字需要跳转定义或者思考,则说明变量名定义失败