You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Arduino Uno中C语言实现串口歌曲标题与艺术家信息分割

Arduino串口字符串分割:提取标题与艺术家信息

针对你这种固定格式的串口数据(标题;艺术家),有两种适合初学者的实现方式,都能完美处理空格、非英文字符的情况:

方法一:用Arduino String类(简单易上手)

Arduino的String类封装了很多字符串操作,对新手友好,不用操心内存管理:

// 定义存储标题和艺术家的变量
String songTitle = "";
String artistName = "";

void setup() {
  Serial.begin(9600); // 初始化串口,波特率和发送端一致
}

void loop() {
  if (Serial.available() > 0) {
    // 读取整行串口数据(直到换行符'\n')
    String inputString = Serial.readStringUntil('\n');
    // 去掉字符串末尾可能的回车符'\r'(有些串口工具会同时发\n和\r)
    inputString.trim();

    // 找到分隔符';'的位置
    int delimiterPos = inputString.indexOf(';');
    
    // 检查是否找到有效分隔符
    if (delimiterPos != -1 && delimiterPos < inputString.length() - 1) {
      // 截取分号前的内容作为标题
      songTitle = inputString.substring(0, delimiterPos);
      // 截取分号后的内容作为艺术家
      artistName = inputString.substring(delimiterPos + 1);
      
      // 测试输出,后续可以替换成LCD显示代码
      Serial.print("标题: ");
      Serial.println(songTitle);
      Serial.print("艺术家: ");
      Serial.println(artistName);
    } else {
      // 处理格式错误的情况
      Serial.println("数据格式错误,请检查输入");
    }
  }
}

关键步骤说明:

  • readStringUntil('\n'):一次性读取整行数据,避免逐字符读取的麻烦
  • trim():自动去掉字符串首尾的空白字符(包括回车符\r),防止干扰分割
  • indexOf(';'):快速定位分隔符位置,返回-1表示没找到
  • substring(start, end):按索引截取子字符串,实现分割

方法二:用C语言标准库函数strtok(贴近纯C,适合进阶学习)

如果你想练习纯C语言的字符串操作,可以用strtok函数,它是C标准库的字符串分割工具:

// 定义存储数据的字符数组,大小根据你的需求调整(比如最多200字符)
char inputBuffer[200];
char* songTitle;
char* artistName;

void setup() {
  Serial.begin(9600);
  // 初始化缓冲区
  memset(inputBuffer, 0, sizeof(inputBuffer));
}

void loop() {
  if (Serial.available() > 0) {
    // 读取整行数据到缓冲区
    int bytesRead = Serial.readBytesUntil('\n', inputBuffer, sizeof(inputBuffer)-1);
    // 手动添加字符串结束符(C语言字符串必须以'\0'结尾)
    inputBuffer[bytesRead] = '\0';
    
    // 去掉末尾的回车符'\r'(如果有的话)
    char* newlinePos = strchr(inputBuffer, '\r');
    if (newlinePos != NULL) {
      *newlinePos = '\0';
    }

    // 第一次调用strtok,用';'作为分隔符
    songTitle = strtok(inputBuffer, ";");
    // 第二次调用strtok,传入NULL表示继续分割同一个字符串
    artistName = strtok(NULL, ";");
    
    // 检查分割结果是否有效
    if (songTitle != NULL && artistName != NULL) {
      Serial.print("标题: ");
      Serial.println(songTitle);
      Serial.print("艺术家: ");
      Serial.println(artistName);
    } else {
      Serial.println("数据格式错误,请检查输入");
    }
  }
}

关键注意点:

  • strtok会修改原字符串,把分隔符替换成\0,所以如果需要保留原数据,要先复制一份
  • 缓冲区大小要足够容纳最长的输入字符串,避免溢出
  • 必须确保字符串以\0结尾,否则strtok会出错

两种方法都能处理你提到的空格、非英文字符(比如韩文),因为Arduino的串口和字符串操作默认支持ASCII之外的字符(只要串口波特率、编码一致)。


内容的提问来源于stack exchange,提问作者JasperDG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 22:18:19