如何在Processing中修改数组并将其从串行传输到Arduino
问题描述
我有一个代码,目前从Processing中获取控制器输入的值,将这些值通过串口发送到一个Arduino Uno,然后通过无线电发送这些值到另一个Arduino Uno。我尝试改变格式以便发送一个数组以实现更好的通信,以下是我当前的失败尝试:
当前Processing代码:
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[])”一样的参数。我不想发送一个字节,因为我想要在这个数组中做更多的操作。即使我修改代码来实现这一点
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
}
并且可以对数组的所有位置进行这样的操作,将所有可能的输入编码放入数组中进行解密,但我首先需要我的串行端口甚至能够接收数组本身。
解决方案
以下源代码将以逗号分隔的值的形式从处理器中的整数数组发送随机状态值字符串到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端真的在使用数组,因为我们不能使用串行监视器(端口被Processing占用)。如果您不想使用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);
}
}