优秀代码段案例__笔记
一、关于协议报警部分
如果想让一种情况只触发一次,可以增加一个新的标志位例如,在条件成立时赋值,复位后清空
bool status_pack_arr[32] = {false}; // 用于标记是否处理过报警
但是如果是上位机去读这种状态,需要再次进来这种状态,那么就需要走else if()
然后在else if加一些限制条件和要传送的值
二、下拉部件 的优化操作,适合多索引值
static char* generate_sequence(int max) {
int size = (max + 1) * 4; // 每个数字最多占用3个字符加上一个换行符 max+1是从0-max
char *str = malloc(size + 1); // 分配足够的内存
if (str == NULL) {
return NULL; // 内存分配失败
}
char *ptr = str;//这样返回的字符串还是从开始的地址开始str不受印象 使用ptr进行移动
for (int i = 0; i < max; i++) {
ptr += sprintf(ptr, "%d\n", i); // 将数字和换行符写入字符串
}
for (int i = max; i <= max; i++) {
ptr += sprintf(ptr, "%d", i); // 将数字和换行符写入字符串
}
return str;
}
const char *text2[5];
text2[0] = generate_sequence(120);
text2[1] = generate_sequence(10);
text2[2] = generate_sequence(120);
text2[3] = generate_sequence(10);
text2[4] = generate_sequence(120);
// 释放分配的内存
free((char*)text2[0]);
free((char*)text2[1]);
free((char*)text2[2]);
free((char*)text2[3]);
free((char*)text2[4]);
三、多个相似变量的统一管理
如果有些变量的控制方式一样,方便统一管理,可以使用数组
bool conditions[] = {
user_io.RELAY.v1,
user_io.RELAY.v2,
user_io.RELAY.v3,
user_io.RELAY.r1,
user_io.RELAY.r2,
user_io.RELAY.r3,
user_io.RELAY.r4,
user_io.RELAY.r5,
user_io.RELAY.r6,
user_io.in1,
user_io.in2,
};
四、LVGL中点击后,提示对应的内容
因为需要上电后再次更新显示,所以需要存储对应的标签,然后定时刷新
static void updateDevInfo(struct _lv_timer_t *p)
{
// 假设 readPara 是用来从 flash 读取配置的函数
getPara(sys_config, &sysparam.config);
if (sysparam.config.init_pack_cu == 1) {
// 如果配置已初始化,按保存的数据更新标签显示
for (int i = 0; i < 12; i++) {
if (sysparam.config.cluster_config[i].is_set) {
char label_text[64];
// 更新并显示簇完成状态标签
sprintf(label_text, "簇%d完成,", i + 1);
lv_label_set_text(win_pack_cu.label_pack1[i], label_text);
lv_obj_clear_flag(win_pack_cu.label_pack1[i], LV_OBJ_FLAG_HIDDEN);
// 更新并显示探测器数量标签
sprintf(label_text, "PACK数量%d", sysparam.config.cluster_config[i].detector_count);
lv_label_set_text(win_pack_cu.label_pack2[i], label_text);
lv_obj_clear_flag(win_pack_cu.label_pack2[i], LV_OBJ_FLAG_HIDDEN);
}
}
} else {
// 如果未初始化,隐藏所有标签
for (int i = 0; i < 12; i++) {
lv_obj_add_flag(win_pack_cu.label_pack1[i], LV_OBJ_FLAG_HIDDEN);
lv_obj_add_flag(win_pack_cu.label_pack2[i], LV_OBJ_FLAG_HIDDEN);
}
}
}
因为按下按钮,从下拉列表中取数据,然后存储,以及弹出对应的标签显示
static void btn_event_cb(lv_event_t *e)
{
lv_obj_t *target = lv_event_get_target(e);
lv_event_code_t code = lv_event_get_code(e);
if (code == LV_EVENT_CLICKED) //按下
{
uint8_t total_clusters = lv_dropdown_get_selected(win_pack_cu.dd[0]) + 5; // 加5因为序号从5开始
uint8_t selected_cluster = lv_dropdown_get_selected(win_pack_cu.dd[1]) + 1; // 选择的簇
uint8_t detectors_count = lv_dropdown_get_selected(win_pack_cu.dd[2]) + 1; // 加1因为序号从1开始
// 更新系统配置
sysparam.config.cu_num = total_clusters;
sysparam.config.init_pack_cu = 1;
sysparam.config.cluster_config[selected_cluster-1].is_set = true;//0表示第一簇
sysparam.config.cluster_config[selected_cluster-1].detector_count = detectors_count;//先判断addr地址是否为1 然后判断cluster_config[0].detector_count探测器数量
savePara(sys_config, &sysparam.config);
// 确保选择的簇号不超过总簇数
if (selected_cluster <= total_clusters)
{
// 更新标签文本和显示标签
char label_text[64];
sprintf(label_text, "簇%d完成,", selected_cluster); // 簇号从1开始
lv_label_set_text(win_pack_cu.label_pack1[selected_cluster-1], label_text);
lv_obj_clear_flag(win_pack_cu.label_pack1[selected_cluster-1], LV_OBJ_FLAG_HIDDEN);
sprintf(label_text, "PACK数量%d", detectors_count);
lv_label_set_text(win_pack_cu.label_pack2[selected_cluster-1], label_text);
lv_obj_clear_flag(win_pack_cu.label_pack2[selected_cluster-1], LV_OBJ_FLAG_HIDDEN);
}
}
}
清除所有的标签显示
static void btnclr_event_cb(lv_event_t *e)
{
lv_obj_t *target = lv_event_get_target(e);
lv_event_code_t code = lv_event_get_code(e);
if (code == LV_EVENT_CLICKED) //按下
{
sysparam.config.init_pack_cu = 0;
memset(sysparam.config.cluster_config, 0, sizeof(sysparam.config.cluster_config));
// 保存配置到 flash
savePara(sys_config, &sysparam.config);
for(int i = 0; i < 12; i++)
{
lv_obj_add_flag(win_pack_cu.label_pack1[i], LV_OBJ_FLAG_HIDDEN);
lv_obj_add_flag(win_pack_cu.label_pack2[i], LV_OBJ_FLAG_HIDDEN);
}
}
}
五、字符转int,转double
#include <stdio.h>
int main() {
// 定义一个char类型的变量并初始化
char c = 'A';
// 将char转换为int
int ascii_value = c;
// 输出结果
printf("The ASCII value of %c is %d\n", c, ascii_value);
// 使用其他字符
c = '0'; // 数字字符'0'
ascii_value = c; // 隐式转换到int
printf("The ASCII value of %c is %d\n", c, ascii_value);
c = ';'; // 符号';'
ascii_value = c; // 隐式转换到int
printf("The ASCII value of %c is %d\n", c, ascii_value);
return 0;
}