1. 项目概述:从零上手迪文串口屏
最近在做一个工控小项目,需要给单片机系统配一个简单可靠的人机界面。选型时,我直接跳过了那些需要复杂驱动和大量代码的TFT屏,把目光投向了串口屏。原因很简单:开发快、省资源、稳定。在众多品牌里,迪文科技的串口屏以其丰富的产品线和成熟的生态脱颖而出,最终我锁定了型号为DMG10600C101-03WTC的这款10.1英寸屏。这个型号看起来一串字符,其实拆解开来就是“迪文(DWIN)”、“10.6英寸”、“C系列”、“1013分辨率”、“03W(800480)”、“T(电阻触摸)”、“C(常亮背光)”。拿到实物,第一感觉是做工扎实,接口定义清晰。但真正要用起来,从点亮屏幕到做出一个可交互的界面,中间还是有不少门道。这篇内容就是我这次从开箱测试到实现基础功能的完整记录,希望能帮你绕过我踩过的那些坑。
2. 核心需求解析与方案选型
2.1 为什么选择串口屏?
在嵌入式开发中,显示方案的选择往往决定了软件架构的复杂度和开发周期。传统的单片机驱动TFT屏方案,需要开发者处理底层驱动、显存管理、图形绘制、触摸检测等一系列繁琐工作,不仅代码量大,而且极其消耗MCU的运算资源和宝贵的IO口与RAM。
串口屏的出现,本质上是一种“显示功能外包”。它将复杂的图形处理、界面渲染和触摸识别功能集成在屏幕内部的主控芯片上,对外只提供一个简单的串行通信接口(通常是UART)。开发者只需要通过发送特定的指令,就可以完成图片显示、文字绘制、控件操作等所有功能。这带来了几个核心优势:
- 大幅降低主控MCU负担:主控MCU从繁重的图形运算中解放出来,仅需处理业务逻辑和简单的串口数据收发,可以选用更低成本、更低功耗的芯片。
- 极速开发:无需编写任何屏驱代码,界面设计通过PC端软件“所见即所得”完成,开发重心完全转移到应用逻辑。
- 稳定性高:屏厂提供的固件和核心驱动经过大量测试,比自己从头写驱动要稳定可靠得多。
- 功能丰富:高级的串口屏通常内置了RTC、数据存储、动画、语音播放等外设,进一步扩展了系统能力。
2.2 为什么是迪文DMG10600C101-03WTC?
市面上的串口屏品牌不少,迪文是其中生态非常成熟的一家。选择DMG10600C101-03WTC这款具体型号,是基于以下几个维度的考量:
- 尺寸与分辨率(10.1英寸, 800*480):对于工业现场,10.1英寸是一个比较理想的尺寸,信息承载量大,观看距离适中。800*480的分辨率(WVGA)在成本和显示效果上取得了很好的平衡,字体和图标清晰度足够。
- 触摸方式(电阻式):型号中的“T”代表电阻触摸。相比于电容屏,电阻屏不惧手套、水渍、油污,抗干扰能力强,非常适合工业环境。虽然透光率和手感稍逊,但可靠性是首要考虑。
- 接口与供电:该屏采用经典的4线RS232/TTL电平串口(RX, TX, GND)进行通信,另需单独提供5V或12V直流电源(具体看屏背标签)。接口简单,与绝大多数MCU都能直接连接。
- 开发资源与社区:迪文提供了完整的开发套件(DGUS Tool软件、字体/图片工具、SDK)和详尽的开发指南。其社区和论坛活跃,遇到问题比较容易找到解决方案或同类讨论。
- 成本与交期:在同等规格下,迪文屏具有不错的性价比,且供货稳定。
注意:串口屏并非万能。它的局限性在于界面更改不够“动态”,所有界面元素(图片、字库)都需要预先制作并下载到屏内Flash中。如果需要极度灵活、随时由代码生成的复杂动态图形(如实时曲线绘制),传统驱动方案或更高端的嵌入式GUI系统可能更合适。
3. 开发环境搭建与核心工具解析
3.1 硬件连接与上电测试
拿到屏幕后,第一步不是急着写代码,而是确保硬件连接正确,屏幕能正常启动。
所需材料清单:
- DMG10600C101-03WTC屏幕本体
- 5V/2A或12V/2A直流电源适配器(务必核对屏背面标签的输入电压!)
- USB转TTL串口模块(如CH340, CP2102等)
- 杜邦线若干
连接步骤:
- 电源连接:将电源适配器的正极(通常为红色线或VIN)接到屏的电源接口正极,负极(黑色线或GND)接到电源接口负极。极性绝对不能接反,否则会永久损坏屏幕。
- 串口连接:使用USB转TTL模块连接电脑和屏幕。
- TTL模块的TX引脚 接 屏幕的RX引脚。
- TTL模块的RX引脚 接 屏幕的TX引脚。
- TTL模块的GND引脚 接 屏幕的GND引脚。
- 切记不要接VCC!屏幕由外部电源供电,串口只通信电平。
- 上电观察:连接好电源和串口线后,给屏幕上电。你会看到屏幕背光亮起,并显示迪文的LOGO或版本信息界面。这证明屏幕硬件基本正常。
实测心得:
- 首次上电如果屏幕无任何反应,首先检查电源电压和极性,其次检查电源功率是否足够(建议2A以上)。
- 串口连接后,如果后续用PC软件无法与屏幕通信,最常见的原因是TX/RX接反了,对调一下试试。
- 屏幕的串口波特率默认通常是115200,数据位8,停止位1,无校验(8N1)。这个信息在后续配置中很重要。
3.2 核心软件工具链详解
迪文的开发主要依赖其官方PC软件,核心是DGUS Tool(现在新版本可能叫DGUS_Vxxx)。下面我拆解几个关键工具的作用:
- DGUS Tool(界面配置软件):这是核心中的核心。你所有界面设计都在这里完成。它的工作原理是,你设计好界面后,软件会生成一系列配置文件(.icl, .bin等)和字库文件,你需要将这些文件通过SD卡或串口下载到屏幕的Flash存储器中。屏幕运行时,就根据这些预存的文件来显示界面。
- 字库生成工具:DGUS屏显示的文字,不是由MCU发送字符串,而是发送对应文字的“字库索引号”。因此,你需要先用这个工具,将你界面中需要用到的所有汉字、字母、符号,生成一个二进制的字库文件(.HZK, .GBK等),并下载到屏里。MCU发送索引,屏幕就从本地字库中调取字形显示。
- 图片转换工具:屏幕显示的图片也需要预先转换成特定的格式(通常是索引色或RGB565的BMP图),并生成.icl库文件。在DGUS Tool中,你其实是调用这个图片库中的图片ID来显示。
- SD卡:这是下载工程文件到屏幕的最常用、最快捷的方式。你需要准备一张小容量(建议≤32GB)的FAT32格式的SD卡。
工具获取与安装:这些工具通常可以在迪文官网或提供的资料光盘中找到。建议创建一个独立的项目文件夹,将所有工具和工程文件放在一起,管理起来更清晰。
4. 第一个工程:从设计到下载运行
4.1 界面规划与DGUS Tool基础操作
假设我们要做一个简单的温湿度监控界面,包含:一个背景图、一个标题文字“温湿度监控系统”、两个数据显示区域(分别显示温度和湿度)、一个返回按钮。
- 新建工程:打开DGUS Tool,选择对应的屏型号(DMG10600C101_03WTC)。软件会自动创建对应分辨率的画布。
- 设置背景:在“页面”管理器中,找到“背景图片”设置。点击后,可以从你已转换好的图片库(.icl文件)中选择一张作为背景图。如果没有,需要先用图片转换工具把你的背景图转成.icl库并导入。
- 添加文本显示:
- 从左侧控件栏拖拽“文本显示”控件到画布上。
- 双击控件,弹出属性框。关键设置如下:
- 变量地址:这是核心!屏幕和MCU通过“变量存储器”交换数据。比如,我们给温度显示控件分配地址
0x1000。MCU只需要往串口发送指令,将最新的温度值写入屏幕的0x1000这个地址,屏幕就会自动更新显示。地址范围一般是0x0000-0xFFFF,需合理规划。 - 字体:选择你已生成并下载到屏内的字库ID。
- 显示方式:如“数据自动上传”、“居中显示”等。
- 数据长度:温度值假设显示“25.5°C”,共6个字符,长度设为6。
- 变量地址:这是核心!屏幕和MCU通过“变量存储器”交换数据。比如,我们给温度显示控件分配地址
- 添加按钮:
- 拖拽“按键”控件。
- 设置其“按下键值”或“弹起键值”。例如,设置返回按钮的按下键值为
0x0001。当用户在屏幕上按下这个按钮时,屏幕会通过串口向MCU发送一条数据,告知“键值0x0001被按下了”。MCU收到后,执行返回上一页的逻辑。
- 生成工程文件:设计完成后,点击“生成”按钮。软件会在你设置的输出目录下生成一系列文件,其中最关键的是
DWIN_SET文件夹。这个文件夹里的内容就是要下载到屏幕里的全部数据。
4.2 文件下载与屏幕烧录
这是将你的设计“安装”到屏幕硬件中的关键一步。
通过SD卡下载(推荐):
- 将生成好的
DWIN_SET文件夹整体拷贝到SD卡的根目录下。 - 确保屏幕断电,将SD卡插入屏幕背面的卡槽。
- 给屏幕上电。此时屏幕会自动检测SD卡并开始更新。屏幕上会有进度条提示。
- 更新完成后,屏幕会自动重启。务必先断电,再拔出SD卡,然后重新上电,你的新界面就运行起来了。
通过串口下载(备用):当没有SD卡或屏幕卡槽损坏时,可以使用DGUS Tool的“串口下载”功能。这个过程比较慢,适合小工程或紧急调试。
- 用USB转TTL连接好屏幕和电脑。
- 在DGUS Tool中选择“工具”->“串口下载”。
- 选择正确的COM口和波特率,添加要下载的文件(通常是
DWIN_SET文件夹下的所有.bin文件),点击下载。 - 下载期间不要断电或断开串口。
实操心得:SD卡下载的坑
- SD卡格式:必须为FAT32,且分配单元大小建议选默认或4096字节。exFAT或NTFS格式屏幕不识别。
- 文件夹名称:必须是
DWIN_SET,大小写敏感。- 下载失败:如果上电后屏幕没反应,或者很快显示主界面但没更新,可能是SD卡兼容性问题。多换几张品牌可靠的卡试试(金士顿、闪迪的小容量卡成功率高)。下载时观察屏幕背面的指示灯,正常下载时会闪烁。
- 版本兼容:注意DGUS Tool的版本与屏幕内核固件版本的匹配。如果遇到无法下载或控件异常,可能是版本不匹配,需要升级屏幕固件或使用对应版本的软件。
5. 单片机端通信协议与代码实现
屏幕端界面就绪后,剩下的就是让单片机(下位机)和屏幕“对话”了。迪文屏的串口协议是公开、固定的,理解其帧结构是关键。
5.1 通信协议帧结构详解
迪文屏的指令主要分为两大类:写指令(MCU->屏)和读指令(MCU->屏,然后屏->MCU回复)。最常用的是写指令,用于更新显示数据。
一个标准的写变量存储器指令帧格式如下:
| 帧头 | 数据长度 | 指令码 | 变量地址高位 | 变量地址低位 | 数据字节1 | 数据字节2 | ... | 数据字节N | 帧尾 |
|---|---|---|---|---|---|---|---|---|---|
| 0x5A | 0xA5 | LenH | LenL | 0x82 | AddrH | AddrL | Data1 | Data2 | ... |
- 帧头:固定为
0x5A 0xA5。 - 数据长度(LenH, LenL):指从“指令码”开始,到“数据字节N”结束的所有字节数。注意:这个长度是字节数,需要用两个字节表示。例如,如果后面总共有5个字节,则 LenH=0x00, LenL=0x05。
- 指令码:
0x82表示“写变量存储器”。 - 变量地址(AddrH, AddrL):两个字节,即你在DGUS Tool中给控件分配的地址。例如地址
0x1000,则 AddrH=0x10, AddrL=0x00。 - 数据:你要写入的具体内容。对于文本显示控件,你需要发送的是文字的字库索引号,而不是ASCII码。例如,在字库中“温”字的索引是0x1234,那么就需要发送
0x12, 0x34。对于数值显示,可能需要转换为BCD码或直接发送二进制值,具体取决于控件的数据类型设置。 - 帧尾(Sum):校验和。计算方式是从“指令码”到最后一个“数据字节”的所有字节相加,取低16位。例如 Sum = (0x82 + AddrH + AddrL + Data1 + ... + DataN) & 0xFFFF。
5.2 单片机端C语言驱动示例
下面以一个STM32 HAL库的示例,展示如何发送一个温度值到地址0x1000。假设温度值以整数形式存储(如25°C),控件设置为显示十进制。
// 迪文屏指令发送函数 void DWIN_Send_Data(uint16_t addr, uint8_t *data, uint16_t data_len) { uint8_t frame[128]; // 发送缓冲区,根据实际调整大小 uint16_t index = 0; uint16_t i; uint16_t checksum = 0; // 1. 帧头 frame[index++] = 0x5A; frame[index++] = 0xA5; // 2. 数据长度 = 指令码(1) + 地址(2) + 数据长度(data_len) uint16_t total_len = 1 + 2 + data_len; frame[index++] = (total_len >> 8) & 0xFF; // LenH frame[index++] = total_len & 0xFF; // LenL // 3. 指令码 (写变量) frame[index++] = 0x82; checksum += 0x82; // 4. 变量地址 frame[index++] = (addr >> 8) & 0xFF; // AddrH frame[index++] = addr & 0xFF; // AddrL checksum += (addr >> 8) & 0xFF; checksum += addr & 0xFF; // 5. 数据 for (i = 0; i < data_len; i++) { frame[index++] = data[i]; checksum += data[i]; } // 6. 帧尾 (校验和,两个字节,低字节在前?高字节在前?需根据屏型号确认!) // 常见的是低字节在前,高字节在后。务必查阅你所用屏幕的具体协议文档! frame[index++] = checksum & 0xFF; // 校验和低字节 frame[index++] = (checksum >> 8) & 0xFF; // 校验和高字节 // 7. 通过串口发送 HAL_UART_Transmit(&huart1, frame, index, 1000); // 假设使用UART1,超时1秒 } // 示例:更新温度显示(假设温度值25,控件设置显示3位十进制数) void Update_Temperature_Display(uint16_t temp_value) { uint8_t data_to_send[3]; // 假设数据长度为3字节 // 将整数25转换为用于显示的3字节数据。 // 如果控件设置是“数据自动上传”且为“0x0000-0x270F”(0-9999)的十进制显示, // 通常直接发送该数值的二进制形式(两个字节)。 // 这里假设协议要求发送两个字节的二进制值。 data_to_send[0] = (temp_value >> 8) & 0xFF; data_to_send[1] = temp_value & 0xFF; // 注意:如果控件设置的是ASCII显示,则需要将25转换为‘2‘,‘5‘的ASCII码,并查找对应的字库索引发送,这很复杂。 // 强烈建议在DGUS Tool中,数值显示控件使用“数据自动上传”配合“十六进制”或“十进制(二进制)”格式,MCU直接发二进制值最简单。 DWIN_Send_Data(0x1000, data_to_send, 2); // 向地址0x1000发送2字节数据 }代码关键点解析:
- 校验和顺序:这是最容易出错的地方!不同系列、不同固件版本的迪文屏,对于校验和两个字节的传输顺序(是高字节在前还是低字节在前)可能有不同要求。我遇到的DMG10600C101-03WTC是低字节在前,高字节在后。但务必、一定、必须要核对你手中屏幕对应的开发指南!否则指令无法被正确解析。
- 数据格式:文本和数值的发送格式天差地别。对于文本,你发送的是“字库索引”;对于数值,最简单的方式是在DGUS Tool中将控件属性设置为“数据自动上传”,变量类型选“十六进制”或“长整数(32位)”,这样MCU直接发送对应的二进制值即可,屏内部会自动转换为十进制数字显示。避免使用“ASCII显示”,那会让你在MCU端做复杂的转换。
- 指令间隔:连续发送多条指令时,建议每条指令之间至少有5-10ms的间隔,避免屏幕处理不过来导致数据丢失。
6. 高级功能应用与调试技巧
6.1 触摸按键与数据变量显示
- 触摸按键:当用户按下屏上的按键时,屏幕会主动向MCU串口发送一帧数据。MCU需要解析这帧数据来获知哪个键被按下了。这帧数据也包含帧头、长度、指令码(通常是
0x83代表有键按下)、键值等。你需要编写一个串口接收中断服务函数,来解析这些指令。 - 数据变量显示:除了简单的数值,还可以显示图标、进度条等。这些通常是通过设置一个变量地址,MCU向该地址写入不同的值(如0-100),屏幕根据值的变化显示不同的图标状态或填充进度条。这在DGUS Tool中通过“图标显示”或“增量调节”控件实现。
6.2 RTC与数据存储功能的使用
许多迪文屏内置了RTC(实时时钟)和额外的数据存储空间(如EEPROM模拟)。
- RTC:MCU可以通过指令读取屏内部的RTC时间,也可以设置它。这对于需要记录时间的应用非常方便,无需在MCU端外挂RTC芯片。
- 数据存储:你可以将一些需要掉电保存的参数(如设置阈值、校准值)通过指令存储到屏幕的Flash中。屏幕再次上电后,MCU可以将其读回。这节省了MCU端的存储芯片。
6.3 串口调试与问题排查实录
调试阶段,一个USB转串口工具+串口助手软件是必不可少的。我常用的是SecureCRT或XCOM。将串口助手同时连接到屏幕的串口上,你可以看到MCU发送给屏的原始指令,也能看到屏主动发送给MCU的数据。
常见问题排查表:
| 现象 | 可能原因 | 排查步骤 |
|---|---|---|
| 屏幕无显示,背光不亮 | 1. 电源未接通或电压不对。 2. 电源极性接反。 3. 屏幕硬件故障。 | 1. 用万用表测量电源接口电压。 2. 检查电源线序。 3. 联系供应商。 |
| 屏幕亮但显示白屏或乱码 | 1. 工程文件未成功下载。 2. 下载的文件损坏或版本不对。 3. 屏幕内核与工程不匹配。 | 1. 确认SD卡内DWIN_SET文件夹存在且文件完整。2. 重新生成工程并下载。 3. 尝试升级屏幕固件。 |
| MCU发送指令后屏幕无反应 | 1. 串口TX/RX接反。 2. 波特率设置错误。 3. 指令帧格式错误(特别是校验和)。 4. 变量地址错误。 | 1. 对调TX/RX线。 2. 用串口助手确认MCU发出的数据,并与协议手册逐字节比对。 3. 重点检查校验和计算和字节顺序。 4. 核对DGUS Tool中控件的变量地址。 |
| 文本显示为乱码或“口口” | 1. 字库未下载或下载错误。 2. MCU发送的不是字库索引,而是ASCII码。 3. 文本控件未正确关联字库ID。 | 1. 确认字库文件已随工程下载。 2. 用串口助手查看MCU发送的数据,确认是索引号。 3. 在DGUS Tool中检查文本控件的字库设置。 |
| 触摸按键无反应 | 1. 触摸屏校准问题(电阻屏需校准)。 2. 按键指令未正确解析。 3. 屏未发送按键数据或MCU未接收。 | 1. 进入屏幕的校准模式(通常有特定触控顺序)进行校准。 2. 用串口助手监听,按下按键时看是否有数据发出。 3. 检查MCU串口接收代码和解析函数。 |
| 数值显示不正确 | 1. 控件数据类型设置与MCU发送格式不匹配。 2. 大小端(字节序)问题。 3. 数据值超出控件显示范围。 | 1. 在DGUS Tool中确认控件是“十六进制”还是“十进制”显示,MCU发送对应格式数据。 2. 尝试调整MCU发送数据的字节顺序。 3. 检查发送的数值是否在控件设置的“最小值-最大值”范围内。 |
独家调试技巧:
- 指令监听法:在MCU代码中,先将所有要发送的指令数据存储在一个数组里,然后用串口助手以十六进制格式发送出去,观察屏幕反应。这样可以完全排除MCU代码时序问题,专注验证指令本身的正确性。
- 简化测试法:做一个最简单的工程,只放一个文本控件和一个按钮。分别测试发送和接收功能。功能正常后,再逐步增加复杂度。
- 善用“系统变量接口”:迪文屏有一些固定的系统变量地址,用于读取屏幕状态、RTC、触摸坐标等。通过读取这些地址,可以辅助判断屏幕是否工作正常、触摸是否准确。
经过这一整套流程下来,从硬件对接到软件调试,DMG10600C101-03WTC这款串口屏给我的整体感受是“上手有门槛,但熟练后效率倍增”。它确实将开发者从底层图形驱动中解放了出来,让你能更专注于业务逻辑。最大的经验就是:仔细阅读官方文档,特别是通信协议部分;善用PC工具进行界面设计;调试阶段,一个可靠的串口助手是你最好的朋友。当第一个由你设计、MCU控制的界面稳定地显示在屏幕上时,那种成就感是对前期踩坑最好的回报。