如何使用TouchGFX展示STM32传感器采集的CSV数据指定部分?
基于STM32+TouchGFX提取CSV指定数据的实现方案
核心逻辑
CSV是逗号分隔的文本格式,要提取指定部分,本质是对字符串做分割解析,再把解析后的目标数据更新到TouchGFX的文本控件上。
具体实现步骤
1. 配置TouchGFX文本控件
在TouchGFX Designer中拖入TextAreaWithOneWildcard或TextArea控件:
- 若要显示多个字段,优先用带通配符的控件,方便动态替换内容;
- 提前设置好控件的字体、尺寸和位置,确保数据显示完整。
2. 实现CSV字符串分割函数
在STM32的业务代码文件(比如Screen1View.cpp)中,添加一个轻量的分割函数:
// 从CSV字符串中提取第n个字段(n从0开始计数) const char* getCSVField(const char* csvStr, int fieldIndex) { static char fieldBuf[32]; // 根据实际数据长度调整缓冲区大小 int currentIdx = 0; const char* fieldStart = csvStr; while (*csvStr != '\0') { if (*csvStr == ',') { if (currentIdx == fieldIndex) { strncpy(fieldBuf, fieldStart, csvStr - fieldStart); fieldBuf[csvStr - fieldStart] = '\0'; return fieldBuf; } currentIdx++; fieldStart = csvStr + 1; } csvStr++; } // 处理最后一个字段 if (currentIdx == fieldIndex) { strcpy(fieldBuf, fieldStart); return fieldBuf; } return "N/A"; // 字段不存在时返回占位符 }
3. 数据获取与UI更新
假设你已经通过串口/ADC等方式拿到了CSV格式的传感器数据(比如"25.6,60.2,1013.5"),在TouchGFX的周期更新函数中完成解析和显示:
void Screen1View::handleTickEvent() { // 替换为你的实际传感器数据读取逻辑 const char* sensorCSV = "25.6,60.2,1013.5"; // 提取第0个字段(温度)、第1个字段(湿度) const char* tempVal = getCSVField(sensorCSV, 0); const char* humiVal = getCSVField(sensorCSV, 1); // 更新带通配符的文本控件,假设控件格式为"温度: %s°C 湿度: %s%" Unicode::snprintf(textAreaBuffer, TEXTAREA_SIZE, "温度: %s°C 湿度: %s%%", tempVal, humiVal); textArea.invalidate(); // 通知TouchGFX刷新界面 }
4. 关键注意点
- 缓冲区大小要匹配实际数据长度,避免内存溢出;
- 若CSV包含空格、引号等特殊字符,需在分割函数中增加对应处理逻辑;
- 传感器数据的读取建议放在独立线程或DMA回调中,避免阻塞TouchGFX的UI刷新线程。
内容的提问来源于stack exchange,提问作者Btysz
相关产品推荐
相关产品推荐

