第三步实现:stm32h743+freertos+lwip+lvgl+串口

      前两个步骤完成以后,基本的框架已经搭建完成了,下面开始使用CodeBlocks开发一个调试界面,其实就是设计一个调试助手,为了减轻工作量我们使用deepseek,直接让deepseek帮我们写一个界面,交互界面的布局以及要求描述的越详细,得到的结果越好,我只是做个简单的示范,我让deepseek用lvgl给我写一个界面,得到如下代码:

#include "lvgl.h"
#include "string.h"
#include "stdio.h"

// 波特率选项
static const uint32_t baud_rates[] = {9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600};
static const char *baud_rate_str[] = {"9600", "19200", "38400", "57600", "115200", "230400", "460800", "921600"};

// GUI组件
static lv_obj_t *baud_dropdown;
static lv_obj_t *send_textarea;
static lv_obj_t *recv_textarea;
static lv_obj_t *send_btn;
static lv_obj_t *clear_btn;
static lv_obj_t *hex_chk;
static lv_obj_t *auto_clear_chk;

// 全局状态
static bool hex_mode = false;
static bool auto_clear = false;
static uint8_t uart_rx_buffer[256];
static uint16_t uart_rx_index = 0;



// 发送按钮回调
static void send_btn_cb(lv_event_t *e) {
    const char *text = lv_textarea_get_text(send_textarea);
    if (text && strlen(text) > 0) {
     //   uart_send_data(text, strlen(text));
        if (hex_mode) {
            char hex_str[strlen(text) * 3 + 1];
            hex_str[0] = '\0';
            for (int i = 0; i < strlen(text); i++) {
                sprintf(hex_str + strlen(hex_str), "%02X ", text[i]);
            }
            lv_textarea_add_text(recv_textarea, "发送: ");
            lv_textarea_add_text(recv_textarea, hex_str);
            lv_textarea_add_text(recv_textarea, "\n");
        } else {
            lv_textarea_add_text(recv_textarea, "发送: ");
            lv_textarea_add_text(recv_textarea, text);
            lv_textarea_add_text(recv_textarea, "\n");
        }
    }
}

// 清屏按钮回调
static void clear_btn_cb(lv_event_t *e) {
    lv_textarea_set_text(recv_textarea, "");
}

// 十六进制模式切换回调
static void hex_chk_cb(lv_event_t *e) {
    hex_mode = lv_obj_has_state(hex_chk, LV_STATE_CHECKED);
}

// 自动清屏切换回调
static void auto_clear_chk_cb(lv_event_t *e) {
    auto_clear = lv_obj_has_state(auto_clear_chk, LV_STATE_CHECKED);
}

// 波特率选择回调
static void baud_dropdown_cb(lv_event_t *e) {
    lv_obj_t *dropdown = lv_event_get_target(e);
    uint16_t sel = lv_dropdown_get_selected(dropdown);
    uint32_t baud = baud_rates[sel];
//    uart_init(baud);
}

// 创建GUI界面
void create_gui(void) {
    // 主容器
    lv_obj_t *cont = lv_obj_create(lv_scr_act());
    lv_obj_set_size(cont, LV_PCT(80), LV_PCT(80));
    lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_COLUMN);
    lv_obj_set_style_pad_all(cont, 10, 0);

    // 第一行:波特率选择
    lv_obj_t *row1 = lv_obj_create(cont);
    lv_obj_set_size(row1, LV_PCT(100), LV_SIZE_CONTENT);
    lv_obj_set_flex_flow(row1, LV_FLEX_FLOW_ROW);
    lv_obj_set_style_pad_all(row1, 5, 0);

    // 波特率选择
    lv_obj_t *baud_label = lv_label_create(row1);
    lv_label_set_text(baud_label, "波特率:");
    lv_obj_set_style_pad_right(baud_label, 5, 0);

    baud_dropdown = lv_dropdown_create(row1);
    lv_dropdown_set_options(baud_dropdown, "9600\n19200\n38400\n57600\n115200\n230400\n460800\n921600");
    lv_dropdown_set_selected(baud_dropdown, 4); // 默认115200
    lv_obj_set_width(baud_dropdown, 120);
    lv_obj_add_event_cb(baud_dropdown, baud_dropdown_cb, LV_EVENT_VALUE_CHANGED, NULL);

    // 第二行:接收区
    lv_obj_t *recv_label = lv_label_create(cont);
    lv_label_set_text(recv_label, "接收区:");

    recv_textarea = lv_textarea_create(cont);
    lv_obj_set_size(recv_textarea, LV_PCT(100), LV_PCT(40));
    lv_textarea_set_text(recv_textarea, "");
    lv_textarea_set_placeholder_text(recv_textarea, "接收到的数据将显示在这里...");
    lv_textarea_set_one_line(recv_textarea, false);
//    lv_textarea_set_scrollbar_mode(recv_textarea, LV_SCROLLBAR_MODE_AUTO);

    // 第三行:发送区
    lv_obj_t *send_label = lv_label_create(cont);
    lv_label_set_text(send_label, "发送区:");

    send_textarea = lv_textarea_create(cont);
    lv_obj_set_size(send_textarea, LV_PCT(100), LV_PCT(20));
    lv_textarea_set_text(send_textarea, "");
    lv_textarea_set_placeholder_text(send_textarea, "输入要发送的数据...");
    lv_textarea_set_one_line(send_textarea, false);
//    lv_textarea_set_scrollbar_mode(send_textarea, LV_SCROLLBAR_MODE_AUTO);

    // 第四行:按钮和选项
    lv_obj_t *row4 = lv_obj_create(cont);
    lv_obj_set_size(row4, LV_PCT(100), LV_SIZE_CONTENT);
    lv_obj_set_flex_flow(row4, LV_FLEX_FLOW_ROW);
    lv_obj_set_style_pad_all(row4, 5, 0);

    // 发送按钮
    send_btn = lv_btn_create(row4);
    lv_obj_set_size(send_btn, 80, 40);
    lv_obj_add_event_cb(send_btn, send_btn_cb, LV_EVENT_CLICKED, NULL);
    lv_obj_t *send_label_btn = lv_label_create(send_btn);
    lv_label_set_text(send_label_btn, "SEND");

    // 清屏按钮
    clear_btn = lv_btn_create(row4);
    lv_obj_set_size(clear_btn, 80, 40);
    lv_obj_add_event_cb(clear_btn, clear_btn_cb, LV_EVENT_CLICKED, NULL);
    lv_obj_t *clear_label_btn = lv_label_create(clear_btn);
    lv_label_set_text(clear_label_btn, "CLERA");

    // 十六进制显示复选框
    hex_chk = lv_checkbox_create(row4);
    lv_checkbox_set_text(hex_chk, "HEX");
    lv_obj_add_event_cb(hex_chk, hex_chk_cb, LV_EVENT_VALUE_CHANGED, NULL);
    lv_obj_set_style_pad_left(hex_chk, 20, 0);

    // 自动清屏复选框
    auto_clear_chk = lv_checkbox_create(row4);
    lv_checkbox_set_text(auto_clear_chk, "AUTOCLEAR");
    lv_obj_add_event_cb(auto_clear_chk, auto_clear_chk_cb, LV_EVENT_VALUE_CHANGED, NULL);
    lv_obj_set_style_pad_left(auto_clear_chk, 20, 0);
}



// 主初始化函数
void lv_100ask_demo_course_3_1_2(void)

{
     create_gui();


}

将上面代码复制到CodeBlocks中,进行简单修改,运行出现如下界面:

Ok,界面有了,下面只需要移植到开发板上就行了。

开始移植:

    将上面的代码移植到 lv_mainstart.c文件中,就是复制进去在按照自己的要求修改一下,之后用keil5编译,不通过按提示修改问题,通过后烧写到开发板。运行如下图:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值