gpt4 book ai didi

serial-port - 从 arduino 到处理的多个序列值?

转载 作者:行者123 更新时间:2023-12-04 14:46:17 25 4
gpt4 key购买 nike

我有一个小问题。

我正在传递来自 arduino 附加的 3 轴加速度计 + 3 轴磁力计 + 罗盘航向的信息。这些被缩放到 midi 范围 (0-127)。

阿杜诺:
这是以串行打印的形式传递的,格式类似于 76a45b120c23d12e23f34g

  Serial.print(shiftAx);
Serial.print("a");
Serial.print(shiftAy);
Serial.print("b");
Serial.print(shiftAz);
Serial.print("c");
Serial.print(shiftMx);
Serial.print("d");
Serial.print(shiftMy);
Serial.print("e");
Serial.print(shiftMz);
Serial.print("f");
Serial.print(shiftHead);
Serial.print("g");

我可以使用我的串行监视器看到它的工作原理。 (但是我不确定是否在“g”处将其打印为 println。)

处理2:

我缓冲直到 g
在我的 void setup()
port = new Serial(this, "/dev/tty.usbmodem411", 9600);
port.bufferUntil('g');

我有这个功能
    void serialEvent (Serial port)
{

data = port.readStringUntil('g');

AxVal = data.substring(0, data.indexOf('a'));

AyVal = data.substring(data.indexOf("a") + 1, data.indexOf("b"));

AzVal = data.substring(data.indexOf("b") + 1, data.indexOf("c"));

MxVal = data.substring(data.indexOf("c") + 1, data.indexOf("d"));

MyVal = data.substring(data.indexOf("d") + 1, data.indexOf("e"));

MzVal = data.substring(data.indexOf("e") + 1, data.indexOf("f"));

HeadVal = data.substring(data.indexOf("f") + 1, data.indexOf("g"));

}

问题
所以这行不通。没有文字显示。 (它只是一个简单的填充(),文本())

我不明白为什么。问题是我的协议(protocol)(如果我可以这么称呼的话),我是如何解包字符串的?或者其他什么问题。

我很迷茫。

我可以让它只使用两个值,如 tutorial

笔记:
arduino 主循环处于延迟(100);
arduino 的波特率为 9600

如果需要帮助我,我将附上整个草图,我将在此表示感谢。

代码:

加工
import themidibus.*; //Import the library
import javax.sound.midi.MidiMessage; //Import the MidiMessage classes http://java.sun.com/j2se/1.5.0/docs/api/javax/sound/midi/MidiMessage.html
import javax.sound.midi.SysexMessage;
import javax.sound.midi.ShortMessage;
import processing.serial.*;

MidiBus myBus; // The MidiBus

Serial port;

String AxVal = " ", AyVal = " ", AzVal = " ";
String MxVal = " ", MyVal = " ", MzVal = " ";
String HeadVal = " ";
String AxString="Ax",AyString = "Ay",AzString = "Az";
String MxString="Mx",MyString = "My",MzString = "Mz";
String HeadString="Heading";
String data = " ";
PFont font;


int status_byte = 0xB0; // send control change
int channel_byte = 0; // On channel 0
int first_byte; // cc number;
int second_byte; // value

void setup()
{
size(1000,500);
port = new Serial(this, "/dev/tty.usbmodem411", 9600);
port.bufferUntil('g');
font = loadFont("NanumBrush-48.vlw");
textFont(font, 48);

MidiBus.list(); // List all available Midi devices on STDOUT. This will show each device's index and name.
myBus = new MidiBus(this, 1, 0); // Create a new MidiBus object

}

void draw()
{
background(0,0,0);

//first_byte = 1;
//second_byte = int(AxVal); // But with less velocity
//myBus.sendMessage(status_byte, channel_byte, first_byte, second_byte);
fill(46, 209, 2);
text(AxVal, 60, 75);
text(AxString, 60, 125);

//first_byte = 2;
//second_byte = int(AyVal); // But with less velocity
//myBus.sendMessage(status_byte, channel_byte, first_byte, second_byte);
fill(0, 160, 153);
text(AyVal, 120, 75);
text(AyString,120,125);



// first_byte = 3;
//second_byte = int(AzVal); // But with less velocity
//myBus.sendMessage(status_byte, channel_byte, first_byte, second_byte);
fill(0, 160, 153);
text(AzVal, 180, 75);
text(AzString,180,125);

/*
first_byte = 4;
second_byte = int(MxVal); // But with less velocity
myBus.sendMessage(status_byte, channel_byte, first_byte, second_byte);
fill(0, 160, 153);
text(MxVal, 240, 75);
text(MxString,240,125);

first_byte = 5;
second_byte = int(MyVal); // But with less velocity
myBus.sendMessage(status_byte, channel_byte, first_byte, second_byte);
fill(0, 160, 153);
text(MyVal, 300, 75);
text(MyString,300,125);

first_byte = 6;
second_byte = int(MzVal); // But with less velocity
myBus.sendMessage(status_byte, channel_byte, first_byte, second_byte);
fill(0, 160, 153);
text(MzVal, 360, 75);
text(MzString,360,125);

first_byte = 7;
second_byte = int(HeadVal); // But with less velocity
myBus.sendMessage(status_byte, channel_byte, first_byte, second_byte);
fill(0, 160, 153);
text(HeadVal, 420, 75);
text(HeadString,420,125);

*/

}

void serialEvent (Serial port)
{

data = port.readStringUntil('g');
data = data.substring(0, data.length() - 1);

AxVal = data.substring(0, data.indexOf('a'));


AyVal = data.substring(data.indexOf("a") + 1, data.indexOf("b"));


AzVal = data.substring(data.indexOf("b") + 1, data.length());

/*
index = data.indexOf("c")+1;
MxVal = data.substring(index, data.indexOf("d"));

index = data.indexOf("d")+1;
MyVal = data.substring(index, data.indexOf("e"));

index = data.indexOf("e")+1;
MzVal = data.substring(index, data.indexOf("f"));

index = data.indexOf("f")+1;
HeadVal = data.substring(index, data.indexOf("g"));
*/

}
/*
void serialEvent (Serial port)
{

data = port.readStringUntil('g');

AxVal = data.substring(0, data.indexOf('a'));

AyVal = data.substring(data.indexOf("a") + 1, data.indexOf("b"));

AzVal = data.substring(data.indexOf("b") + 1, data.indexOf("c"));

MxVal = data.substring(data.indexOf("c") + 1, data.indexOf("d"));

MyVal = data.substring(data.indexOf("d") + 1, data.indexOf("e"));

MzVal = data.substring(data.indexOf("e") + 1, data.indexOf("f"));

HeadVal = data.substring(data.indexOf("f") + 1, data.indexOf("g"));

}

阿杜诺:
// Add lastvalue check

#include <Wire.h>
#include <LSM303DLH.h>

LSM303DLH glove;

//set max min magnetometer
int maxMx = +353, maxMy = +527, maxMz = 426;
int minMx = -700, minMy = -477, minMz = -561;

int maxA = 2019;
int minAx = -1043, minAy = -2048, minAz = -2048;

int shiftMx,shiftMy,shiftMz;
int shiftAx,shiftAy,shiftAz;
float shiftHeadTemp;
int shiftHead;



void setup()
{
Wire.begin();
glove.enableDefault();
Serial.begin(9600);
}

void loop()
{



glove.read();


shiftMx = ((glove.m.x - minMx) / (maxMx - minMx)) * 127;
shiftMy = ((glove.m.y - minMy) / (maxMy - minMy)) * 127;
shiftMz = ((glove.m.z - minMz) / (maxMz - minMz)) * 127;

shiftAx = ((glove.a.x - minAx) / (maxA - minAx)) * 127;
shiftAy = ((glove.a.y - minAy) / (maxA - minAy)) * 127;
shiftAz = ((glove.a.z - minAz) / (maxA - minAz)) * 127;

shiftHeadTemp = (glove.heading((LSM303DLH::vector){0,-1,0}));

shiftHead = (shiftHeadTemp/360)*127;

if (shiftMx < 0){shiftMx=0;}
if (shiftMx >127){shiftMx=127;}
if (shiftMy < 0){shiftMy=0;}
if (shiftMy >127){shiftMy=127;}
if (shiftMz < 0){shiftMz=0;}
if (shiftMz >127){shiftMz=127;}

if (shiftAx < 0){shiftAx=0;}
if (shiftAx >127){shiftAx=127;}
if (shiftAy < 0){shiftAy=0;}
if (shiftAy >127){shiftAy=127;}
if (shiftAz < 0){shiftAz=0;}
if (shiftAz >127){shiftAz=127;}

if (shiftHead < 0){shiftHead=0;}
if (shiftHead >127){shiftHead=127;}




Serial.print(shiftAx);
Serial.print("a");
Serial.print(shiftAy);
Serial.print("b");
Serial.print(shiftAz);
Serial.print("c");
Serial.print(shiftMx);
Serial.print("d");
Serial.print(shiftMy);
Serial.print("e");
Serial.print(shiftMz);
Serial.print("f");
Serial.print(shiftHead);
Serial.println("g");



delay(100);


}

最佳答案

我现在无法测试您的代码,但这里有一些想法。

您可以将 JSON 从您的 Arduino 发送到处理。这是我在自己的一个项目中使用的示例,但您可以轻松地对其进行调整以满足您的需求:

void sendJson(){
String json;

json = "{\"accel\":{\"x\":";
json = json + getXYZ(0);
json = json + ",\"y\":";
json = json + getXYZ(1);
json = json + ",\"z\":";
json = json + getXYZ(2);
json = json + "},\"gyro\":{\"yaw\":";
json = json + getYPR(0);
json = json + ",\"pitch\":";
json = json + getYPR(1);
json = json + ",\"roll\":";
json = json + getYPR(2);
json = json + "}}";

Serial.println(json);
}

JSON 的好处是它很容易通过使用 getType() 进行处理“解析”。功能。没有了 readUntil ,一切都是这样的:(请注意,在 void setup() 中,您需要将 port.bufferUntil('g'); 更改为 port.bufferUntil('\n');,因为在 Arduino 中, jsonSerial.println(); 一起发送)
void serialEvent (Serial port){
String json = port.readString();

shiftAx = getInt("shiftAx");
shiftAy = getInt("shiftAy"); // and so on...
}

您将不得不稍微更改您的代码,但从长远来看,它会更易于维护,比如说如果您添加更多传感器。您只需更改 json在arduino中,只需在处理中获得值(value)。

另一件事:您可以使用约束函数将您的值限制在 0 之间。和 127 .
value = constrain(value, 0, 127);

希望能帮助到你!

关于serial-port - 从 arduino 到处理的多个序列值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18172282/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com