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

