#include #include #include #include #include #include "ui_dacai.h" // #include #include "../../MarlinCore.h" #include "../../inc/MarlinConfig.h" #include "../../core/serial.h" #include "../../core/macros.h" #include "../../../Configuration.h" #include "dwin_lcd.h" #ifdef LCD_SERIAL_PORT #define LCDSERIAL LCD_SERIAL #elif SERIAL_PORT_2 #define LCDSERIAL LCDSERIAL #endif uint8_t IsDacaiScreenConnect = true; char unitBuf[4][10] = {"", "%", "mm", "℃"}; //#if ENABLED(UI_SHOW_t) inline uint16_t work16(const uint8_t high, const uint8_t low) { return (high) << 8U | (low); } UI_SHOW_t uiShow; // dwin模块初始化(串口号为LCD_SERIAL_PORT) void UI_SHOW_t::RTS_Init(void) { #ifndef LCD_BAUDRATE #define LCD_BAUDRATE 115200 #endif SERIAL_ECHO("lcd serial init"); LCDSERIAL.begin(LCD_BAUDRATE); const millis_t serial_connect_timeout = millis() + 1000UL; while (!LCDSERIAL.connected() && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } delay(500); // 延时等待屏幕准备好 for (uint8_t i = 0; i < 5; i++) { if (UI_Handshake()) { SERIAL_ECHO("\r\n RTS_Init OK!!!"); IsDacaiScreenConnect = true; break; } else { SERIAL_ECHO("\r\n RTS_Init failse!!!"); IsDacaiScreenConnect = false; continue; } } } UI_SHOW_t::UI_SHOW_t() { recdat.head = CMD_HEAD; frameEnd[0] = FBONE; frameEnd[1] = FBTWO; frameEnd[2] = FBTHREE; frameEnd[3] = FBFOUR; memset(databuf,0, sizeof(databuf)); } static inline void dwin_uart_write(unsigned char *buf, int len) { LOOP_L_N(n, len) { LCDSERIAL.write(buf[n]); } } void UI_SHOW_t::RTS_SndData(void) { if(snddat.head == CMD_HEAD) { databuf[0] = snddat.head; databuf[1] = snddat.cmd_type; // 命令类型 databuf[2] = snddat.ctrl_msg; // 消息类型 // 表示上传的组态控件指令 if (/*work16(snddat.cmd_type, snddat.ctrl_msg) == CMD_SEND_TO_SCREEN && */snddat.bytelen >= 7) { databuf[3] = snddat.screen_id >> 8; databuf[4] = snddat.screen_id & 0x00FF; databuf[5] = snddat.control_id >> 8; databuf[6] = snddat.control_id & 0xFF; if ((snddat.bytelen - 7) != 0) { memcpy(&databuf[7], snddat.data, (snddat.bytelen - 7)); } // 增加帧尾 memcpy(&databuf[7 + (snddat.bytelen - 7)], frameEnd, 4); } dwin_uart_write(databuf, snddat.bytelen + 4); memset(&snddat, 0, sizeof(snddat)); memset(databuf, 0, sizeof(databuf)); snddat.head = CMD_HEAD; } } void UI_SHOW_t::RTS_SndData(const String &s, unsigned long _screen_id, unsigned long _control_id, unsigned long cmd /*= VarAddr_W*/) { if(s.length() < 1) { return; } RTS_SndData(s.c_str(), _screen_id, _control_id, cmd); } void UI_SHOW_t::RTS_SndData(const char *str, unsigned long _screen_id, unsigned long _control_id, unsigned long cmd/*= VarAddr_W*/) { int len = strlen(str); int i = 0; if( len >= 0) { databuf[0] = CMD_HEAD; databuf[1] = cmd >> 8; // 命令类型 databuf[2] = cmd & 0x00FF; // 消息类型 databuf[3] = _screen_id >> 8; databuf[4] = _screen_id & 0x00FF; databuf[5] = _control_id >> 8; databuf[6] = _control_id & 0xFF; for(i = 0; i < len ; i++) { databuf[7 + i] = str[i]; } // 增加帧尾 memcpy(&databuf[7 + i], frameEnd, 4); dwin_uart_write(databuf, len + 11); memset(databuf, 0, sizeof(databuf)); } } void UI_SHOW_t::RTS_SndData(char c, unsigned long _screen_id, unsigned long _control_id, unsigned long cmd/*= VarAddr_W*/) { snddat.head = CMD_HEAD; snddat.cmd_type = cmd >> 8; // 命令类型 snddat.ctrl_msg = cmd & 0x00FF; // 消息类型 snddat.screen_id = _screen_id; snddat.control_id = _control_id; snddat.data[0] = c; snddat.bytelen = 8; RTS_SndData(); } void UI_SHOW_t::RTS_SndData(unsigned char* str, unsigned long addr, unsigned long addr1, unsigned long cmd) { RTS_SndData((char *)str, addr, addr1, cmd); } void UI_SHOW_t::RTS_SndData(int n, unsigned long _screen_id, unsigned long _control_id, unsigned long cmd/*= VarAddr_W*/) { snddat.head = CMD_HEAD; snddat.cmd_type = cmd >> 8; // 命令类型 snddat.ctrl_msg = cmd & 0x00FF; // 消息类型 snddat.screen_id = _screen_id; snddat.control_id = _control_id; if (cmd == CMD_ICON_SET_FRAME || cmd == CMD_ICON_SHOW_HIDE) { snddat.data[0] = n & 0xFF; snddat.bytelen = 8; } else { // if(cmd == CMD_SEND_TO_SCREEN) if(n > 0xFFFF) { snddat.data[0] = n >> 24; snddat.data[1] = (n >> 16) & 0xFF; snddat.data[2] = (n >> 8) & 0xFF; snddat.data[3] = n & 0xFF; snddat.bytelen = 11; } else { snddat.data[0] = (n >> 8) & 0xFF; snddat.data[1] = n & 0xFF; snddat.bytelen = 9; } } RTS_SndData(); } void UI_SHOW_t::RTS_SndData(unsigned int n, unsigned long addr, unsigned long addr1, unsigned long cmd) { RTS_SndData((int)n, addr, addr1, cmd); } void UI_SHOW_t::RTS_SndData(float n, unsigned long addr, unsigned long addr1, unsigned long cmd) { RTS_SndData((int)n, addr, addr1, cmd); } void UI_SHOW_t::RTS_SndData(long n, unsigned long addr, unsigned long addr1, unsigned long cmd) { RTS_SndData((unsigned long)n, addr, addr1, cmd); } void UI_SHOW_t::RTS_SndData(unsigned long n, unsigned long _screen_id, unsigned long _control_id, unsigned long cmd/*= VarAddr_W*/) { snddat.head == CMD_HEAD; snddat.cmd_type = cmd >> 8; // 命令类型 snddat.ctrl_msg = cmd & 0x00FF; // 消息类型 snddat.screen_id = _screen_id; snddat.control_id = _control_id; if(work16(snddat.cmd_type, snddat.ctrl_msg) == CMD_SEND_TO_SCREEN) { if(n > 0xFFFF) { snddat.data[0] = n >> 24; snddat.data[1] = (n >> 16) & 0xFF; snddat.data[2] = (n >> 8) & 0xFF; snddat.data[3] = n & 0xFF; snddat.bytelen = 11; } else { snddat.data[0] = (n >> 8) & 0xFF; snddat.data[1] = n & 0xFF; snddat.bytelen = 9; } } RTS_SndData(); } /* 发送的数据不用指定 页面ID、控件ID */ void UI_SHOW_t::RTS_SndData(int n, unsigned long cmd/* = CMD_GOTO_SCREEN*/) { if(cmd == CMD_GOTO_SCREEN) { databuf[0] = CMD_HEAD; databuf[1] = cmd >> 8; // 命令类型 databuf[2] = cmd & 0x00FF; // 消息类型 databuf[3] = n >> 8; databuf[4] = n & 0xFF; // 增加帧尾 memcpy(&databuf[5], frameEnd, 4); dwin_uart_write(databuf, 9); memset(databuf, 0, sizeof(databuf)); } } bool UI_SHOW_t::UI_Handshake(void) { uint8_t receivedbyte; uint8_t cmd_pos = 0; uint8_t buffer[10]; // 队列帧尾检测状态 static uint32_t cmd_state = 0; uint8_t handBuf[6] = {0xEE, 0x55, 0xFF, 0xFC, 0xFF, 0xFF}; // 发送握手信息 databuf[0] = CMD_HEAD; databuf[1] = 0x04; memcpy(&databuf[2], frameEnd, 4); dwin_uart_write(databuf, 6); memset(databuf, 0, sizeof(databuf)); delay(10); while(LCD_SERIAL.available()) { // 取一个数据 receivedbyte = LCD_SERIAL.read(); //指令的第一个字节必须是帧头 if(cmd_pos == 0 && receivedbyte != CMD_HEAD) { continue; } if(cmd_pos < 10) { // 防止溢出 buffer[cmd_pos++] = receivedbyte; } else { break; } // 拼接最后4字节,组成最后一个32位整数 cmd_state = ((cmd_state << 8) | receivedbyte); delay(2); // 帧尾判断 if(cmd_state == CMD_TAIL) { for (int i = 0; i < cmd_pos; i++) { SERIAL_ECHOLNPAIR(" ", buffer[i]); } if (memcmp(buffer, handBuf, sizeof(handBuf)) == 0) { return true; } cmd_state = 0; // 重新检测帧尾 cmd_pos = 0; // 复位指令指针 } } return false; } //切换界面 void UI_SHOW_t::UI_GotoScreen(int screen) { // 检测不是大彩屏连接,直接返回 // if (!IsDacaiScreenConnect) // return; RTS_SndData(screen); } /* * frame: ICON控件中的第frame个图标 * _screen_id: 图片页面 * _control_id: 控件ID * cmd == CMD_ICON_SET_FRAME: 设置与“图标控件”、“动画控件” 的显示(指定帧播放) * Screen_id(2个字节) + Control_id(2个字节) + FlashImgae_ID(1个字节)某一动画帧ID * * cmd == CMD_ICON_START: 启动动画播放, 此时frame无效 * Screen_id(2个字节) + Control_id(2个字节) * * cmd == CMD_ICON_STOP: 停止动画播放, 此时frame无效 * Screen_id(2个字节) + Control_id(2个字节) * * cmd == CMD_ICON_PAUSE: 暂停动画播放, 此时frame无效 * Screen_id(2个字节) + Control_id(2个字节) */ void UI_SHOW_t::UI_ShowIcon(int frame , unsigned long _screen_id, unsigned long _control_id, unsigned long cmd/* = CMD_ICON_SET_FRAME*/) { // 检测不是大彩屏连接,直接返回 // if (!IsDacaiScreenConnect) // return; if (cmd == CMD_ICON_SET_FRAME) { RTS_SndData(frame, _screen_id, _control_id, cmd); } else if (cmd == CMD_ICON_START || cmd == CMD_ICON_STOP || cmd == CMD_ICON_PAUSE) { snddat.head = CMD_HEAD; snddat.cmd_type = cmd >> 8; // 命令类型 snddat.ctrl_msg = cmd & 0x00FF; // 消息类型 snddat.screen_id = _screen_id; snddat.control_id = _control_id; snddat.bytelen = 7; RTS_SndData(); } } /* * 功能: ICON控件的控制 * _screen_id: 图片页面 * _control_id: 控件ID * cmd == CMD_ICON_SHOW_HIDE: 显示或隐藏控件 * Screen_id(2个字节) + Control_id(2个字节) + Enable(1个字节) 0x00:屏蔽或隐藏控件;  0x01: 屏蔽/隐藏解除 * * 注意:1、控件使用‘自动播放’且 ‘初始化显示’先择为 '否' 时,把控件显示出来,才开始第一次播放 */ void UI_SHOW_t::UI_ShowOrHideConctrols(bool isDisplay , unsigned long _screen_id, unsigned long _control_id, unsigned long cmd/* = CMD_ICON_SHOW_HIDE*/) { // 检测不是大彩屏连接,直接返回 // if (!IsDacaiScreenConnect) // return; if (cmd == CMD_ICON_SHOW_HIDE) { RTS_SndData(isDisplay, _screen_id, _control_id, cmd); } } void UI_SHOW_t::UI_ShowText(char* n , unsigned long _screen_id, unsigned long _control_id, unsigned long cmd/* = CMD_SEND_TO_SCREEN*/) { // 检测不是大彩屏连接,直接返回 // if (!IsDacaiScreenConnect) // return; RTS_SndData(n, _screen_id, _control_id, cmd); } /* * n: 需要发送的内容 * _screen_id: 图片页面 * _control_id: 控件ID * cmd == CMD_SEND_TO_SCREEN: 发送字符串到屏幕显示 * Screen_id(2个字节) + Control_id(2个字节) + Strings(不定长) * cmd == CMD_TEXT_TWINKLE: 设置文本闪烁,闪烁周期(10毫秒单位),0表示不闪烁 * Screen_id(2个字节) + Control_id(2个字节) + Cycle(2个字节) * cmd == CMD_TEXT_ROLL: 设置文本滚动,文本滚动速度(每秒移动像素),0表示不滚动 * Screen_id(2个字节) + Control_id(2个字节) + Speed(2个字节) * cmd == CMD_TEXT_COLOR_FORE: 文本-前景色 * Screen_id(2个字节) + Control_id(2个字节) + BK_Color(2个字节) */ void UI_SHOW_t::UI_ShowText(int n , // 需要发送的内容(数据 或 控件属性设置) unsigned long _screen_id, // 所在屏幕ID unsigned long _control_id, // 控件ID unsigned long cmd/* = CMD_SEND_TO_SCREEN*/, // 命令,默认为 CMD_SEND_TO_SCREEN(发送文本到屏幕) uint8_t unit) // 单位 { // 检测不是大彩屏连接,直接返回 // if (!IsDacaiScreenConnect) // return; static char txt[15] = {0}; memset(txt, 0, sizeof(txt)); // 注意:根据大彩协议,对于文本的显示需要转换成字符串,对于文本的属性(文本闪烁、文本滚动、设置颜色等,不需要转变成字符串) if (cmd == CMD_SEND_TO_SCREEN) { itoa(n, txt, 10); // 单位处理 if (unit != U_NULL) { strcat(txt, unitBuf[unit]); } UI_ShowText(txt, _screen_id, _control_id, cmd); } else { RTS_SndData(n, _screen_id, _control_id, cmd); } } void UI_SHOW_t::UI_ShowText(float n , // 需要显示的数字 uint8_t ndigit, // 小数位数 unsigned long _screen_id, // 所在屏幕ID unsigned long _control_id, // 控件ID unsigned long cmd/* = CMD_SEND_TO_SCREEN*/, uint8_t unit/* = U_NULL*/) // 单位 { // 检测不是大彩屏连接,直接返回 // if (!IsDacaiScreenConnect) // return; char txt[15]; char isNegative = false; // 是否为负数标志 int len = 0; int integer; int decimal ; // = (int)((unsigned long)(n*1000))%1000; if (n < 0) { isNegative = true; n = -n; } integer = n; // 整数部分 // 小数部分 if (ndigit == 3) { decimal = (int)((unsigned long)(n*1000))%1000; } else if (ndigit == 2) { decimal = (int)((unsigned long)(n*100))%100; } else { decimal = (int)((unsigned long)(n*10))%10; } itoa(integer, txt, 10); len = strlen(txt); txt[len++] = '.'; // itoa(decimal, &txt[len+1], 10); // 小数部分 if (ndigit == 3) { txt[len++] = decimal/100 + 0x30; txt[len++] = decimal%100/10 + 0x30; txt[len++] = decimal%10 + 0x30; } else if (ndigit == 2) { txt[len++] = decimal/10 + 0x30; txt[len++] = decimal%10 + 0x30; } else { txt[len++] = decimal%10 + 0x30; } // 单位处理 if (unit != U_NULL) { int unitLen = strlen(unitBuf[unit]); memcpy(&txt[len++], &unitBuf[unit], unitLen); len += unitLen; } txt[len++] = '\0'; // 特殊处理浮点型 if (isNegative) { for (int i = sizeof(txt) - 1; i > 0; i--) { txt[i] = txt[i - 1]; } txt[0] = '-'; } UI_ShowText(txt, _screen_id, _control_id, cmd); } void UI_SHOW_t::UI_ShowTextClear(unsigned long _screen_id, unsigned long _control_id, unsigned long cmd/* = CMD_SEND_TO_SCREEN*/) { // 检测不是大彩屏连接,直接返回 // if (!IsDacaiScreenConnect) // return; RTS_SndData("", _screen_id, _control_id, cmd); } void UI_SHOW_t::UI_ShowTextUnicode(const char *str, const int strlen, unsigned long _screen_id, unsigned long _control_id, unsigned long cmd/*= VarAddr_W*/) { // if (!IsDacaiScreenConnect) // return; int len = strlen; // SERIAL_ECHOLNPAIR("\r\n\r\n\r\n len = ", len); int i = 0; if( len >= 0) { databuf[0] = CMD_HEAD; databuf[1] = cmd >> 8; // 命令类型 databuf[2] = cmd & 0x00FF; // 消息类型 databuf[3] = _screen_id >> 8; databuf[4] = _screen_id & 0x00FF; databuf[5] = _control_id >> 8; databuf[6] = _control_id & 0xFF; for(i = 0; i < len ; ) { databuf[7 + i] = str[i + 1]; databuf[7 + i + 1] = str[i]; if (databuf[7 + i] == 0 && databuf[7 + i + 1] == 0) { break; } i = i + 2; } databuf[7 + i] = 0; databuf[7 + i + 1] = 0; // 增加帧尾 memcpy(&databuf[7 + i + 2], frameEnd, 4); dwin_uart_write(databuf, i + 2 + 13); memset(databuf, 0, sizeof(databuf)); } } unsigned long arr_data_num; /** * 功能: 发送jpg图片前的握手动作 * jpeg: 指向图片数据的指针 * path: 发送的路径 */ bool UI_SHOW_t::UI_SendJpegDateHandshake(unsigned long size, const char *path) { // 当使用大彩屏时 if (!IsDacaiScreenConnect) return true; uint8_t receivedbyte; uint8_t cmd_pos = 0; uint8_t buffer[10]; uint32_t cmd_state = 0; // 队列帧尾检测状态 uint8_t cmd_dl_response[7] = {0xEE,0xFB,0x01,0xFF,0xFC,0xFF,0xFF}; // 屏幕返回的下载确认命令 unsigned long jpgSize = size; // 下载命令 databuf[0] = CMD_HEAD; databuf[1] = 0xFB; // 下载包大小 databuf[2] = (DACAI_JPG_BYTES_PER_BUF>>8)&0xff; databuf[3] = (DACAI_JPG_BYTES_PER_BUF)&0xff; // 零食波特率,不修改时,设置0 databuf[4] = (0>>8)&0xff; databuf[5] = (0)&0xff; // 文件大小 databuf[6] = (jpgSize>>24)&0xff; databuf[7] = (jpgSize>>16)&0xff; databuf[8] = (jpgSize>>8)&0xff; databuf[9] = (jpgSize)&0xff; // 文件路径 memcpy(&databuf[10], path, strlen(path)); // 增加帧尾 memcpy(&databuf[strlen(path) + 12], frameEnd, 4); // 发送命令帧 // SERIAL_ECHO("\r\n "); // for (int aa = 0; aa <= strlen(path) + 16; aa++) { // SERIAL_ECHO(databuf[aa]); // SERIAL_ECHO(" "); // } dwin_uart_write(databuf, strlen(path) + 16); memset(databuf, 0, sizeof(databuf)); delay(20); uint32_t ms = millis(); uint32_t MsTest = millis(); while(1) { watchdog_refresh(); if (millis() - ms >= 3000) { return false; } // 接收处理 if(LCD_SERIAL.available()) { // 取一个数据 receivedbyte = LCD_SERIAL.read(); if(cmd_pos == 0 && receivedbyte != CMD_HEAD) { // 指令的第一个字节必须是帧头 continue; } if(cmd_pos < 10) { // 防止溢出 buffer[cmd_pos++] = receivedbyte; } else { return false; } // 拼接最后4字节,组成最后一个32位整数 cmd_state = ((cmd_state << 8) | receivedbyte); delay(2); // 帧尾判断 if(cmd_state == CMD_TAIL) { // for (int i = 0; i < cmd_pos; i++) // SERIAL_ECHOLNPAIR(" ", buffer[i]); if (memcmp(buffer, cmd_dl_response, sizeof(cmd_dl_response)) == 0) { break; } // 重新检测帧尾 cmd_state = 0; } } } if (ENABLED(USER_LOGIC_DEUBG)) { SERIAL_ECHOLNPAIR("\r\n UI_SendJpegDateHandshake time1 = ", millis() - MsTest); } // DWIN_Handshake(); return true; } /** * 功能: 发送jpg图片整包数据 * jpeg: 指向图片数据的指针 * size: 图片数据长度(从gcode里面读取出来) */ bool UI_SHOW_t::UI_SendJpegDate(const char *jpeg, unsigned long size) { static char buf[DACAI_JPG_BYTES_PER_BUF] = {0}; unsigned long jpgSize = size; static uint8_t sn = 0; uint16_t i, j; uint16_t checkSum = 0; int sendPacket; uint32_t MS = millis(); databuf[0] = 0xAA; databuf[1] = 0xC0; databuf[4 + DACAI_JPG_BYTES_PER_PACKET] = 0xCC; databuf[4 + DACAI_JPG_BYTES_PER_PACKET + 1] = 0x33; databuf[4 + DACAI_JPG_BYTES_PER_PACKET + 2] = 0xC3; databuf[4 + DACAI_JPG_BYTES_PER_PACKET + 3] = 0X3C; for (i = 0; i < jpgSize / DACAI_JPG_BYTES_PER_FRAME; i++) { // 发送命令帧 -- dwin_uart_write 这个接口传入的字节长度不要超255 for (sendPacket = 0; sendPacket < jpgSize / DACAI_JPG_BYTES_PER_PACKET; sendPacket++) { // SERIAL_ECHOLN(sendPacket); // SERIAL_ECHOLN(arr_data_num); databuf[2] = (arr_data_num) >> 8; databuf[3] = (arr_data_num) & 0xFF; arr_data_num += 120; memcpy(&databuf[4], &jpeg[sendPacket * DACAI_JPG_BYTES_PER_PACKET], DACAI_JPG_BYTES_PER_PACKET); watchdog_refresh(); dwin_uart_write(databuf, DACAI_JPG_BYTES_PER_PACKET + 8); watchdog_refresh(); delay(5); } // 2048字节发送完剩下的 if(jpgSize % DACAI_JPG_BYTES_PER_PACKET) { j = (jpgSize - DACAI_JPG_BYTES_PER_PACKET * sendPacket); databuf[2] = (arr_data_num) >> 8; databuf[3] = (arr_data_num) & 0xFF; arr_data_num+=j/2; databuf[4 + j] = 0xCC; databuf[4 + j + 1] = 0x33; databuf[4 + j + 2] = 0xC3; databuf[4 + j + 3] = 0X3C; memcpy(&databuf[4], &jpeg[(sendPacket * DACAI_JPG_BYTES_PER_PACKET)], j); watchdog_refresh(); delay(5); dwin_uart_write(databuf, j + 8); } } if (jpgSize % DACAI_JPG_BYTES_PER_FRAME) { // 小于2048字节处理 for (sendPacket = 0; sendPacket < jpgSize / DACAI_JPG_BYTES_PER_PACKET; sendPacket++) { databuf[2] = (arr_data_num) >> 8; databuf[3] = (arr_data_num) & 0xFF; arr_data_num+=120; memcpy(&databuf[4], &jpeg[sendPacket * DACAI_JPG_BYTES_PER_PACKET], DACAI_JPG_BYTES_PER_PACKET); dwin_uart_write(databuf, DACAI_JPG_BYTES_PER_PACKET + 8); watchdog_refresh(); delay(5); } // 2048字节发送完剩下的 if(jpgSize % DACAI_JPG_BYTES_PER_PACKET) { j = (jpgSize - DACAI_JPG_BYTES_PER_PACKET * sendPacket); databuf[2] = (arr_data_num) >> 8; databuf[3] = (arr_data_num) & 0xFF; arr_data_num+=j; databuf[4 + j] = 0xCC; databuf[4 + j + 1] = 0x33; databuf[4 + j + 2] = 0xC3; databuf[4 + j + 3] = 0X3C; memcpy(&databuf[4], &jpeg[(sendPacket * DACAI_JPG_BYTES_PER_PACKET)], j); watchdog_refresh(); delay(5); dwin_uart_write(databuf, j + 8); } } return true; } void UI_SHOW_t::UI_DisplayJpegDate(unsigned long _screen_id) { // 当使用大彩屏时 // if (!IsDacaiScreenConnect) // return ; databuf[0] = CMD_HEAD; databuf[1] = 0xB5; // 命令类型 databuf[2] = 0x01; // 消息类型 databuf[3] = _screen_id >> 8; databuf[4] = _screen_id & 0xFF; // 增加帧尾 memcpy(&databuf[5], frameEnd, 4); dwin_uart_write(databuf, 9); } // 修改语言 void UI_SHOW_t::UI_ChangeLanguage(unsigned int lang) { databuf[0] = CMD_HEAD; databuf[1] = CMD_SET_CHANGE_LNGUAGE; // 命令类型 databuf[2] = lang & 0xFF; databuf[3] = (CMD_SET_CHANGE_LNGUAGE + lang) & 0xFF; // 增加帧尾 memcpy(&databuf[4], frameEnd, 4); dwin_uart_write(databuf, 8); }