当前位置: 首页 > 知识库问答 >
问题:

从arduino到Processing的多个串行值?

邵浩大
2023-03-14

我有个小问题。

  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");
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"));

}

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

我很困惑。

在本教程中,我只需要两个值就可以使它工作

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);


}

共有1个答案

都博裕
2023-03-14

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

您可以将JSON从Arduino发送到Processing。下面是我在自己的一个项目中使用的示例,但您可以很容易地调整它以满足您的需要:

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中,JSON是用serial.println()发送的;)

void serialEvent (Serial port){
        String json = port.readString();

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

还有一点:您可以使用constrain函数将值限制在0127之间。

value = constrain(value, 0, 127);

希望有帮助!

 类似资料:
  • 我将像素数组转换为字符串,并将此字符串发送到arduino.但是我认为此字符串没有正确转换,因为Serial.write发送(8位或8字符)我不知道.并且还想发送100个字符的字符串到串行.请发送您的建议,并获得帮助我解决这个问题。对于任何错误,请提前道歉。 并告诉我如何停止字符串后100个字符不使用(\n或\r)

  • 我在一个项目中,我想通过串行通信发送传感器数据从Arduino到PHP。 不幸的是,我无法读取PHP中的串行端口。然而,另一个方向(PHP到Arduino)工作得很好。我使用的是php_系列。班来自Rémy Sanchez的php,由Rizwan Kassim修改。我依赖于readPort()函数。 我在Mac OS X上使用Arduino UNO和Apache WAMP-Server。我应该实现

  • 我试图在一些python代码和arduino代码之间来回“乒乓”信息。我想定期向arduino代码发送两个设定点(例如,在分钟内),在arduino上读取它们 现在,我无法获得可靠的信息来来回跳转。我在搜索中没有找到任何与此类似的内容,我试图修改的所有内容都不起作用。最接近我的是这个(实际上它并没有在发送和接收之间来回切换): python 阿杜伊诺: 我最终得到的只是重复的相同值(不是实际发送的

  • 我有一个Arduino与2个DS18B20温度传感器连接。我对python非常(非常)陌生。我正在寻找一种读取串行输入并将其解析到sqlite数据库的方法,但这已经超出了我的能力。为什么在尝试将串行端口定义为变量时出错? 首先<代码>sys.version 我的当前,只是读取串行连接程序的输入。 我目前无法编译它。我发现这个错误的大多数结果告诉添加,但在这种情况下,它不起作用。 错误。 另外,如果

  • 我是新的处理和串行通信,我的问题似乎非常基本。我试图将数据从处理发送到Arduino,但似乎有些东西在翻译中丢失了。 在Arduino上,我做了一个超级简单的素描: 其目的是从串行数据中读取一个字节,然后将其写回,这样我就可以看到发生了什么。使用附带的串行监视器进行测试,结果与我预期的一样:输入“0”返回“48”。到现在为止,一直都还不错。 当我运行这个处理草图时,事情开始出错: 我希望这段代码能

  • 我试图让Arduino在串口读取字符“s”时触发一个中继。该字符“s”由python根据从屏幕读取的图像发送。 我的问题是arduino似乎无法从串行端口读取数据,因为它从不执行if条件。我的猜测是这两者之间存在某种死锁(这就是为什么我将ardu.close()放在函数foo中) 这是我的arduino代码: 这是我的python代码: