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

如何从Processing向Arduino传输字符串数组与整数数组

如何从Processing向Arduino传输字符串数组和整数数组

你现在遇到的核心问题是串口通信本质是字节流传输,没法直接发送数组这类复杂结构。解决思路是先把数据打包成Arduino能识别的结构化字符串,通过串口发送后,再在Arduino端解析还原成数组。下面是具体的实现方案:

Processing 端代码修改

我们需要把fileTypes和fileSizes数组打包成带边界标记的格式字符串——用<和>作为数据帧的起止标记,用|分隔数组长度和元素列表,用,分隔每个元素,用:分隔字符串和整数。这样Arduino能清晰识别数据边界和结构。

修改后的Processing代码:

import processing.serial.*;
Serial myPort; 
String[] fileTypes;
int[] fileSizes;

void setup() {
  size(200,200);
  String portName = Serial.list()[1]; 
  myPort = new Serial(this, portName, 9600);
  myPort.bufferUntil('\n'); // 让串口缓存数据直到收到换行,确保一次性接收完整数据包
  launch( sketchPath("") + "/test.bat");
}

void draw() {
  if (mousePressed == true) {
    txtToStrg();
    // 构建结构化数据包
    String dataPacket = "<" + fileTypes.length + "|";
    for (int i = 0; i < fileTypes.length; i++) {
      if (i > 0) dataPacket += ",";
      dataPacket += fileTypes[i] + ":" + fileSizes[i];
    }
    dataPacket += ">";
    myPort.write(dataPacket + "\n"); // 发送数据包,加换行触发Arduino解析
    println("已发送数据包: " + dataPacket);
  }
}

void txtToStrg(){
  String[] lines = loadStrings("list.txt");
  fileTypes = new String[lines.length];
  fileSizes = new int[lines.length];
  for (int i = 0 ; i < lines.length; i++) {
    if(lines[i] != null) {
      String[] splitLine = split(lines[i], ' ');
      fileTypes[i] = splitLine[0];
      fileSizes[i] = int(splitLine[1]);
      println(fileTypes[i] + " = " + fileSizes[i]);
    }
  }
}

Arduino 端代码修改

我们需要编写解析逻辑:先识别数据帧的起止标记<和>,再拆分出数组长度,最后逐个解析每个元素的字符串和整数,存储到对应数组中。

修改后的Arduino代码:

#define MAX_ELEMENTS 20 // 根据你的需求调整最大可接收元素数量
#define MAX_STRING_LENGTH 4 // 适配3字符的fileTypes,加1留空字符

char receivedBuffer[256]; // 缓存接收的字符串
int bufferIndex = 0;
bool isReceiving = false;

// 存储解析后的数据
String fileTypes[MAX_ELEMENTS];
int fileSizes[MAX_ELEMENTS];
int elementCount = 0;

int ledPin = 4;

void setup() {
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
  Serial.println("Arduino ready to receive data...");
}

void loop() {
  while (Serial.available() > 0) {
    char incomingChar = Serial.read();
    
    if (incomingChar == '<') {
      // 开始接收数据包,重置缓存
      bufferIndex = 0;
      isReceiving = true;
    } else if (incomingChar == '>') {
      // 结束接收,启动解析
      receivedBuffer[bufferIndex] = '\0'; // 添加字符串结束符
      isReceiving = false;
      parseDataPacket(receivedBuffer);
      printParsedData(); // 打印解析结果用于调试
      digitalWrite(ledPin, HIGH); // 收到数据后点亮LED
    } else if (isReceiving && bufferIndex < sizeof(receivedBuffer)-1) {
      // 缓存有效数据
      receivedBuffer[bufferIndex++] = incomingChar;
    }
  }

  // 无数据时熄灭LED
  if (!isReceiving && elementCount == 0) {
    digitalWrite(ledPin, LOW);
  }
  delay(10);
}

// 解析数据包的核心函数
void parseDataPacket(char* packet) {
  // 拆分数组长度和元素列表
  char* lengthPart = strtok(packet, "|");
  elementCount = atoi(lengthPart);
  
  if (elementCount > MAX_ELEMENTS) {
    Serial.println("警告:元素数量超过最大值,自动截断");
    elementCount = MAX_ELEMENTS;
  }

  // 拆分每个元素
  char* elementPart = strtok(NULL, "|");
  char* element = strtok(elementPart, ",");
  
  int index = 0;
  while (element != NULL && index < elementCount) {
    // 拆分字符串类型和整数大小
    char* typeStr = strtok(element, ":");
    char* sizeStr = strtok(NULL, ":");
    
    if (typeStr != NULL && sizeStr != NULL) {
      fileTypes[index] = String(typeStr);
      fileSizes[index] = atoi(sizeStr);
      index++;
    }
    element = strtok(NULL, ",");
  }
}

// 打印解析后的数据
void printParsedData() {
  Serial.println("===== 解析到的数据 =====");
  for (int i = 0; i < elementCount; i++) {
    Serial.print("类型: ");
    Serial.print(fileTypes[i]);
    Serial.print(" | 大小: ");
    Serial.println(fileSizes[i]);
  }
}

关键注意事项

  • 波特率一致:确保Processing和Arduino的串口波特率都设置为9600,否则会出现乱码或解析失败
  • 文件格式正确:你的list.txt每行必须是XXX 123格式(3字符类型+空格+整数),比如:
    TXT 1024
    PDF 2048
    PNG 512
    
  • 内存限制:Arduino内存有限,要根据实际需求调整MAX_ELEMENTS和MAX_STRING_LENGTH,避免内存溢出

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:21:23