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
相关产品推荐
相关产品推荐

