提问人:Bradbut 提问时间:10/21/2023 最后编辑:Bradbut 更新时间:10/21/2023 访问量:73
如何在Processing中修改数组并将它们从串行发送到Arduino?
How to modify arrays in Processing and send them from serial to Arduino?
问:
我有一个代码,该代码当前从处理中的控制器输入中获取值,通过串行将这些值发送到Arduino Uno,Arduino Uno通过无线电将这些值发送到另一个Arduino Uno。我正在尝试更改格式以发送数组以实现更好的通信,这是我目前失败的尝试
当前处理代码
int status[] = {0, 0, 0, 0, 0}
void draw
if (thumblefty > .2)
{
status[0]=3;
}
if (thumblefty < -.2)
{
status[0]=0;
}
if (thumbleftx>.2)
{
status[0]=1;
}
if (thumbleftx<-.2)
{
status[1]=2;
}
//etc etc on the if statements
myPort.write(status);
}
然而,这会在 myPort.write 上产生一个错误行,指出函数 “write()” 需要类似 “write(byte[])” 的参数。我不想发送一个字节,因为我想在这个数组中做超过 1 和 0 的事情。即使我确实修改了代码以使其
byte status[]={0,0,0,0,0}
我在接收 arduino 时没有得到预期的结果
发射器代码 (Arduino)
byte state[4];
void loop
state[4] = Serial.read();
radio.write(&state, sizeof(state));
接收代码 (Arduino)
byte state[4];
void loop
radio.read(&state, sizeof(state));
Serial.println(state[4]);
当控制器处于向上位置时,我希望接收序列号上的输出为 [3,0,0,0,0],但串行端口充满了随机整数,这些整数不会根据控制器位置而变化,并且不是字节或数组形式
我希望帮助配置我的处理代码以发送数组,并帮助弄清楚如何通过串行解释该数组并通过 RF24 发送。最终目标是让接收方Arduino能够查看数组每个位置的值,比如说
if state[3]==2
{
motor 2 full power
}
并且能够对阵列的所有位置执行此操作,以破译阵列中所有可能的输入,但我首先需要我的串行端口来接收阵列本身
答:
以下源代码将 Processing 中的整数数组中的一串随机状态值作为逗号分隔值发送到 Arduino;字符串的末尾以换行符终止。补遗:在写入Arduino之前,编辑了原始答案以将数组整数转换为字符串,即str(myState[i])。
处理代码:
import processing.serial.*;
int[] myState = new int[4];
Serial myPort;
void setup() {
// Output is in console
surface.setVisible(false);
printArray(Serial.list());
// Set port number for your system
myPort = new Serial(this, Serial.list()[3], 9600);
}
void draw() {
if (frameCount % 60 == 0) {
myState[0] = int(random(4));
myState[1] = int(random(4));
myState[2] = int(random(4));
myState[3] = int(random(4));
for (int i = 0; i < myState.length-1; i++) {
myPort.write(str(myState[i]));
myPort.write(',');
}
myPort.write(str(myState[3]) + '\n');
printArray(myState);
println("=============");
}
}
备选解决方案:以下源代码使用发送数组字符串的替代方法。它适用于下面的Arduino代码。在项目中添加了一个 LED,以证明阵列确实在 Arduino 端使用,因为我们不能使用串行监视器(端口被处理捆绑)。如果您不想使用 LED 代码,可以将其删除。
import processing.serial.*;
int[] myState = new int[4];
Serial myPort;
String inStr;
String outStr;
int x1, x2, x3, x4;
void setup() {
// Output is in console
surface.setVisible(false);
printArray(Serial.list());
// Set port number for your system
myPort = new Serial(this, Serial.list()[3], 9600);
}
void draw() {
if (frameCount % 60 == 0) {
myState[0] = int(random(4));
myState[1] = int(random(4));
myState[2] = int(random(4));
myState[3] = int(random(4));
outStr = str(myState[0]) + "," + str(myState[1]) + "," + str(myState[2]) + "," + str(myState[3]) + "\n";
myPort.write(outStr);
printArray(myState);
println("=============");
}
}
void serialEvent(Serial p) {
inStr = p.readStringUntil('\n');
if (inStr != null) {
String trimStr = trim(inStr);
println("receivedBack : " + trimStr);
}
}
Arduino代码:
const int LED = 12;
int myState[4];
String inStr;
void setup() {
Serial.begin(9600);
pinMode(LED, OUTPUT);
}
void loop() {
if (Serial.available() > 0) {
inStr = Serial.readStringUntil('\n');
myState[0] = Serial.parseInt();
Serial.println("state[0]");
myState[1] = Serial.parseInt();
Serial.println("state[1]");
myState[2] = Serial.parseInt();
Serial.println("state[2]");
myState[3] = Serial.parseInt();
Serial.println("state[3]");
}
if(myState[3] == 2){
digitalWrite(LED, HIGH);
delay(2000);
} else {
digitalWrite(LED, LOW);
delay(2000);
}
}
评论