6

작은 문제가 있습니다.arduino에서 처리까지 일련 번호가 여러 개입니까?

나는 arduino 부착 3 축 가속도계 + 3 축 자력계 + 나침반에서 정보를 전달하고 있습니다. 이들은 midi 범위 (0-127)로 조정됩니다.

ARDUINO : 나는이 내 시리얼 모니터를 사용하여 작동 볼 수있는이

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

을 76a45b120c23d12e23f34g 같은 형식 직렬 인쇄에 전달됩니다. (그러나 나는 "g"에에 println 여부로 인쇄로 확실입니다.)

PROCESSING 2 :

나는 버퍼 내가이

port = new Serial(this, "/dev/tty.usbmodem411", 9600); 
port.bufferUntil('g'); 

내 무효 설정에서 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")); 

} 

인한 문제 그래서이 작동하지 않습니다. 텍스트가 표시되지 않습니다. (그저 단순한 fill(), text())

왜 보이지 않습니다. 문제는 내 프로토콜 (내가 그것을 호출 할 수 있다면), 어떻게 문자열을 풀고 있는가? 아니면 다른 문제.

나는 매우 혼란 스럽다. 내가이 tutorial

노트로 두 값을 작동시킬 수

는 : 아두 이노 메인 루프는 지연 (100)에; arduino는 9600 보레이트입니다

도와 주려면 전체 스케치를 첨부해야합니다. 사전에 감사의 말을 전합니다.

CODE :

가공

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

} 

ARDUINO :

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


} 

답변

7

여기 지금 당신의 코드를 테스트 할 수는 없지만 몇 가지 아이디어가 있습니다.

Arduino의 JSON을 처리 할 수 ​​있습니다. 여기에 내가 내 자신의 프로젝트 중 하나에서 사용하고 예입니다하지만 당신은 쉽게 당신의 요구에 맞게 적응할 수 :

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 더 이상은, 모두가 같이 간다 : (아두 이노에, jsonSerial.println(); 함께 전송되기 때문에 void setup() 당신이 port.bufferUntil('\n');port.bufferUntil('g');을 변경할 필요가 있습니다)

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

     shiftAx = getInt("shiftAx"); 
     shiftAy = getInt("shiftAy"); // and so on... 
} 
당신은 당신의 코드를 약간 변경해야합니다

하지만, 장기간에 걸쳐 더 많은 유지 보수가 가능할 것입니다. 센서를 더 추가하면 말입니다.arduino에서 json을 변경하고 처리 과정에서 가치를 얻으십시오.

또 다른 한가지 : constrain 함수를 사용하여 0127 사이의 값을 제한 할 수 있습니다.

value = constrain(value, 0, 127); 

희망 하시겠습니까?

+0

이것은 정확히 내가 원했던 것입니다. 그것을하는 훨씬 더 좋은 방법. 메르시. 편집 * 투표 할 사람이 없지만 담당자가있는 사람이이 사람에게 어떤 사람을 줘 – ash

+0

대답을 수락하면됩니다. 작은 오른쪽 표시 –

0

나는 C# (두 번째 매개 변수, C#에서 빼기 문자열의 길이)에서 동일한 문제가 발생했습니다. 그러나 나는 약간의 시간을 기다리지 않으면 전송 된 문자열이 항상 같은 형식이 아니라는 것을 알았다 : somtime, 문자열은 (값) a (값) b (값) c (값 (값) b (값) c (값) d (값) d (값) d (값) e (값) 결국, 모든 데이터는 전송되지만 동일한 구조를 가지지 않을 것이므로 약간의 지연이 추가됩니다. (예 : f (값) g (값) a (값) b (값) 모든 직렬 읽기 전에 (이전의 직렬 문자열이 and와 모든 timpe까지 읽혀 졌는지 확인하기 위해 동일한 형식의 문자열을 얻습니다.) 그것은 잘 작동합니다. 그것이 너에게 도움이되기를 바라 라.

관련 문제