前两个步骤完成以后,基本的框架已经搭建完成了,下面开始使用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编译,不通过按提示修改问题,通过后烧写到开发板。运行如下图: