2016-12-16 4 views
0

Ich versuche, vier separate Ziffern auf meiner 7-Segment-Anzeige anzuzeigen. Diese Nummern werden aus einem Programm und Processing erhält eine Zahl wie 9561, und durch Mathematik, isoliere ich 9 5 6 1 in einzelne Ziffern.Senden von Integer von Verarbeitung an Arduino, Bytes können nicht gelesen werden

Da eine einzelne Ziffer 4 Bits ist, verwende ich eine Ganzzahl, um die Zahlen sequentiell zu komprimieren, die in voller dezimaler Form zu 5721 erscheint. Ich sende diese ganze Zahl an das Arduino, wo ich 2 Bytes sequentiell seriell ausgeführt habe .lesen();

Mein Problem ist, dass meine 7-Segment 4-stellige Anzeige nur 9500 anzeigt, was bedeutet, dass x2 00 ist, was bedeutet, dass die 61 in der Übersetzung verloren gehen.

Noch mehr, wenn ich die Zeit (t) oder die Zeit für das Multiplexen beschleunigen, blinkt die 95 über 00 und ich bestätigte es, wenn ich seg0 und seg1 des Arrays 0 und 0. Wenn t = 3 Dies geschieht, aber etwas Höher als sagen, 8 hat dieses Problem nicht.

sollte ich auch in meinem Schalter erwähnen() der Standardfall zeigt eine 0

Verarbeitung

void draw() 
{ 
    seg[0] = 9; 
    seg[1] = 5; 
    seg[2] = 6; 
    seg[3] = 1; 


    int x = (seg[pos+3] & 0x000f)<<12|((seg[pos+2]) & 0x000f)<<8|(seg[pos+1] & 0x000f)<<4|((seg[pos] & 0x000f)); //3210 

    myPort.write(x); 

    //
    int disp1 = x; 
    int disp2 = (x & 0x00f0)>>4; 
    int disp3 = (x & 0x0f00)>>8; 
    int disp4 = (x & 0xf000)>>12; 

    //
    print(disp1, '\n', disp2, '\n', disp3, '\n', disp4, '\n', '\n'); 
} 

Arduino (Relevante Bereiche, seine viel Code

void digitdisplay(byte x,byte x2) 
{ 
    //unsigned char tn = int (num/1000); 
    //if (tn>10) 
    //{ 
    // tn = tn - 10; 
    //} 
    // 
    //unsigned char hn = int (num/100)%10; 
    //unsigned char tenn = int (num/10)%10; 
    //unsigned char on = int (num%10); 
    int disp[4]; 

    disp[0] = (x & 0x0f); 
    disp[1] = (x & 0xf0)>>4; 
    disp[2] = (x2 & 0x0f); 
    disp[3] = (x2 & 0xf0)>>4; 

    numberselect(disp[0]); 
    digitselect(1); 
    delay(t); 

    numberselect(disp[1]); 
    digitselect(2); 
    delay(t); 

    numberselect(disp[2]); 
    digitselect(3); 
    delay(t); 

    numberselect(disp[3]); 
    digitselect(4); 
    delay(t); 
} 

void loop() 
{ 
    int sen = analogRead(A0); 
    int maxrange = (sen*maxval); 
    byte x,x2; 

    if (Serial.available()>2) 
    { // If data is available to read, 
     x=Serial.read(); 
     x2=Serial.read(); 
    } 

    //shiftlight(maxrange); 
    digitdisplay(x,x2); 
} 
+0

Halten in Mine mit senden, ist Arduino C++ nicht Java. – DejaVuSansMono

Antwort

2

Angenommen, myPort ist ein OutputStream, Ihr one invocat Ionen von myPort.write(int) schreibt nur ein Byte, extrahiert aus den niedrigsten 8 Bits seines Arguments. Die höherwertigen Bits gehen verloren. Deshalb können Sie nur die 9 und 5 sehen.

Ich kann nicht erklären, aus dem Code präsentiert, warum Sie 9500 statt 9595 anzeigen, aber das scheint mit Ihrer Behauptung konsistent, dass bei höheren Update-Raten sehen Sie die 95 im Wechsel mit 00 Beide führen mich zu der Annahme, dass ein anderer Teil des Codes Nullen in den seriellen Port schreibt.

+0

Ich bekomme es, es ist nur irgendwie ärgerlich, dass es keine Anzeichen dafür gibt. Der Maximalwert der Ganzzahl, die gesendet werden kann, ist 256. Also sollte ich zwei separate Bytes auf der Verarbeitungsseite haben, genau wie ich 2 auf der Empfängerseite habe? –

+0

@AdamKujawinski, zwei separate Ein-Byte-Schreibvorgänge wäre ein vernünftiger Weg, um darüber zu gehen. Ich würde es als einen Bonus betrachten, dass das mit der Leseseite besser zusammenpasst, also werde ich keine Alternativen in Betracht ziehen. –

+0

OK, es scheint so, als ob die Verarbeitung es mir nicht erlaubt, in 2 separate Bytes zu kompilieren, also packe ich es in 2 separate ganze Zahlen. Ich halte dich auf dem Laufenden :) –

0

Die String-Repräsentation von Java ist UTF-16. Das bedeutet, dass jedes Zeichen durch 2 Bytes repräsentiert wird. Für ASCII-Buchstaben ist einer von ihnen 0x00. Dies könnte der Grund sein, warum Sie die 61 nicht an der erwarteten Position aus dem Stream bekommen.

Sie können entweder jedes zweite Byte auf dem Arduino überspringen oder die Zeichen in einfachen ASCII konvertieren, bevor getBytes(Charset charset)https://docs.oracle.com/javase/7/docs/api/java/nio/charset/Charset.html

Verwandte Themen