韦德斯 2024-04-30 11:15 采纳率: 42.9%
浏览 148
已结题

lvgl读取串口数据显示

我使用linux开发板,画了一个lvgl页面,想要lvgl读取串口的数据并显示:用串口将开发板与ubuntu虚拟机连接起来,然后ubuntu发送数据,开发板接受数据,然后lvgl读到这些数据并显示。同样的,lvgl按下按键,使得开发板通过串口给ubuntu发送数据,请问怎么做

  • 写回答

4条回答 默认 最新

  • 专家-皆知 2024-04-30 11:15
    关注

    参考免费微信小程序:皆我百晓生 作答,经由专家-皆知整理回复,如问题解决,望采纳;如仍有疑问,请评论回复。

    要实现LVGL界面读取串口数据并在屏幕上显示,同时通过按钮控制发送数据回Ubuntu虚拟机,可以分为几个步骤来完成。下面我将提供一个基本的指导方案,包括Linux开发板上的LVGL编程、串口通信处理以及如何响应按钮事件。

    1. 准备LVGL界面

    首先,你需要在LVGL上创建一个界面,包含一个文本框(用于显示串口接收的数据)和一个按钮(用于触发数据发送)。这里是一个简化的示例代码,用于创建这样的界面:

    #include "lvgl/lvgl.h"
    
    // 假设你已经初始化了LVGL
    void create_ui(void) {
        lv_obj_t *screen = lv_disp_get_scr_act(NULL);
        
        // 创建一个文本框来显示数据
        lv_obj_t *txt_box = lv_textarea_create(screen, NULL);
        lv_textarea_set_one_line(txt_box, true);
        lv_obj_align(txt_box, NULL, LV_ALIGN_CENTER, 0, -50);
    
        // 创建一个按钮
        lv_obj_t *btn = lv_btn_create(screen, NULL);
        lv_obj_set_size(btn, 100, 50);
        lv_obj_align(btn, NULL, LV_ALIGN_CENTER, 0, 50);
        
        // 为按钮添加事件处理函数
        lv_obj_add_event_cb(btn, btn_event_handler, LV_EVENT_CLICKED, NULL);
    }
    
    void btn_event_handler(lv_obj_t *obj, lv_event_t event) {
        if(event == LV_EVENT_CLICKED) {
            // 这里应该调用发送数据的函数
            send_data_to_ubuntu();
        }
    }
    

    2. 串口通信

    接下来,你需要实现串口读写功能。这通常涉及到打开串口、配置其参数(如波特率、数据位等),然后读取和写入数据。

    #include <fcntl.h>
    #include <termios.h>
    #include <unistd.h>
    
    #define PORT "/dev/ttyS0" // 假定串口设备路径
    #define BAUDRATE B115200
    
    int serial_port;
    
    void init_serial(void) {
        serial_port = open(PORT, O_RDWR | O_NOCTTY | O_NDELAY);
        if (serial_port == -1) {
            perror("Error opening serial port");
            return;
        }
        
        struct termios options;
        tcgetattr(serial_port, &options);
        cfsetispeed(&options, BAUDRATE);
        cfsetospeed(&options, BAUDRATE);
        options.c_cflag &= ~PARENB; // 无奇偶校验
        options.c_cflag &= ~CSTOPB; // 1停止位
        options.c_cflag &= ~CSIZE;
        options.c_cflag |= CS8;     // 8位数据
        options.c_cflag &= ~CRTSCTS; // 无硬件流控
        options.c_iflag &= ~(IXON | IXOFF | IXANY); // 禁用软件流控
        options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // 非规范模式
        options.c_oflag &= ~OPOST;
        tcflush(serial_port, TCIFLUSH);
        tcsetattr(serial_port, TCSANOW, &options);
    }
    
    void read_from_serial(void) {
        char buffer[256] = {0};
        ssize_t bytes_read = read(serial_port, buffer, sizeof(buffer) - 1);
        if (bytes_read > 0) {
            buffer[bytes_read] = '\0';
            lv_textarea_set_text(txt_box, buffer); // 更新文本框内容
        }
    }
    
    void send_data_to_ubuntu(const char *data) {
        write(serial_port, data, strlen(data));
    }
    

    3. 主循环中的应用

    在LVGL的主循环中,定期调用read_from_serial来读取串口数据,并且确保UI更新及时。同时,确保在LVGL的事件处理中,当按钮被点击时,调用send_data_to_ubuntu发送数据。

    #include "lvgl/lvgl.h"
    #include "your_serial_code.h" // 假设你的串口相关函数在这个文件中
    
    int main(void) {
        lv_init();
        init_serial(); // 初始化串口
        
        // 创建UI
        create_ui();
        
        while(1) {
            lv_task_handler(); // LVGL的事件处理
            read_from_serial(); // 从串口读取数据
            
            // 延时,避免CPU占用过高
            usleep(100000); // 100ms
        }
        
        return 0;
    }
    

    注意事项

    • 确保串口路径(如/dev/ttyS0)是正确的,这取决于你的开发板具体配置。
    • 波特率和其他串口设置应与Ubuntu虚拟机端相匹配。
    • 实际应用中可能需要错误处理和更复杂的逻辑,比如处理串口读写失败的情况。
    • 上述代码片段需要根据你的实际项目环境进行调整和测试。

    这样,你就有了一个基础框架,能够通过LVGL界面展示串口接收到的数据,并通过按钮触发向Ubuntu虚拟机发送数据的动作。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 5月15日
  • 已采纳回答 5月7日
  • 创建了问题 4月30日

悬赏问题

  • ¥15 Coze智能助手搭建过程中的问题请教
  • ¥15 12864只亮屏 不显示汉字
  • ¥20 三极管1000倍放大电路
  • ¥15 vscode报错如何解决
  • ¥15 前端vue CryptoJS Aes CBC加密后端java解密
  • ¥15 python随机森林对两个excel表格读取,shap报错
  • ¥15 基于STM32心率血氧监测(OLED显示)相关代码运行成功后烧录成功OLED显示屏不显示的原因是什么
  • ¥100 X轴为分离变量(因子变量),如何控制X轴每个分类变量的长度。
  • ¥30 求给定范围的全体素数p的(p-2)/p的连乘积值
  • ¥15 VFP如何使用阿里TTS实现文字转语音?