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

如何在Arduino中存储Serial.read()接收的字符串?代码写法咨询

Arduino接收串口字符串的正确姿势

嘿,咱们先直接说结论:你提到的两种写法都不正确,接下来我给你拆解原因,再说说正确的实现方式,以及你关心的NodeJS Buffer发送的问题。

为什么两种写法都不对?

  • int string = Serial.read():
    Serial.read()每次只能读取单个字节(返回值是int类型,因为没有数据时会返回-1),把它赋值给int变量,最多只能存单个字符的ASCII数值,完全没法存储完整的字符串。比如你发"hello",这个写法只能拿到第一个字符'h'的ASCII值(104),后面的字符都丢了。

  • char string[20] = Serial.read():
    这在语法上就不成立,Arduino编译会直接报错。字符数组的初始化要么用字符串字面量(比如char str[] = "hello"),要么逐个元素赋值,不能直接用单个字节值来初始化整个数组,而且Serial.read()只返回一个字节,也填不满数组。

正确的字符串接收方式

因为串口是字节流,要接收字符串得循环读取每个字节,直到遇到你约定的结束标记(比如换行符\n,或者自定义的符号),然后把这些字节拼接成字符串,最后加上字符串结束符\0(C语言字符串必须以这个结尾才能正常处理)。

给你一个实用的示例代码:

// 定义存储字符串的数组,留1个位置给结束符'\0'
char receivedString[20];
int currentIndex = 0;

void setup() {
  Serial.begin(9600); // 和NodeJS的串口波特率保持一致
  // 初始化数组,避免残留垃圾值
  memset(receivedString, 0, sizeof(receivedString));
}

void loop() {
  if (Serial.available() > 0) {
    int incomingByte = Serial.read();
    // 先判断是不是有效数据(不是-1)
    if (incomingByte != -1) {
      char incomingChar = (char)incomingByte;
      
      // 假设用换行符作为字符串结束标记,同时避免数组溢出
      if (incomingChar != '\n' && currentIndex < sizeof(receivedString) - 1) {
        receivedString[currentIndex] = incomingChar;
        currentIndex++;
      } else {
        // 添加字符串结束符,完成接收
        receivedString[currentIndex] = '\0';
        
        // 这里可以处理收到的字符串,比如打印验证
        Serial.print("收到完整字符串:");
        Serial.println(receivedString);
        
        // 重置索引和数组,准备下一次接收
        currentIndex = 0;
        memset(receivedString, 0, sizeof(receivedString));
      }
    }
  }
}

关于NodeJS以Buffer发送字符串的问题

你想的没错,这对Arduino侧按字符串处理完全没影响!Buffer本质就是字符串转成的字节流(默认是UTF-8编码),和直接发送字符串的字节是一样的。只要你在NodeJS发送时加上约定的结束标记(比如在字符串末尾加\n),Arduino就能正确识别出完整的字符串。

内容的提问来源于stack exchange,提问作者Anh Tú Mai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:45:19