2016-12-16 2 views
0

Я пытаюсь отобразить 4 отдельных цифры на 7-сегментном дисплее. Эти числа сделаны из программы, а Processing получает число, подобное 9561, и через математику я выделяю 9 5 6 1 на отдельные цифры.Отправка целого из обработки в Arduino, байты не могут быть прочитаны

, так как одна цифра имеет 4 бита, я использую целое число для последовательного сжатия чисел, которое в его полной десятичной форме выглядит как 5721. Затем я отправляю это целое число в Arduino, где у меня есть 2 байта с последовательным запуском Serial .читать();

Моя проблема заключается в том, что мой 7-сегментный 4-значный дисплей отображает только 9500, что означает, что x2 равно 00, что означает, что 61 теряется в переводе.

Более того, когда я ускоряю время (t) или время мультиплексирования, 95 будет мигать над 00, и я подтвердил его, когда я сделал seg0 и seg1 массива 0 и 0. Когда t = 3 это происходит, но ничего выше, чем сказать, 8 не имеет этой проблемы.

Я должен также упомянуть в моем переключателе() случае по умолчанию отображает 0.

Обработка

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 (соответствующие области, его много кода

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

Хранить в шахте, Arduino является C++ не Java. – DejaVuSansMono

ответ

2

Предполагая, что myPort является OutputStream, ваш единственный вызов иона myPort.write(int) записывает только один байт, извлеченный из 8 бит своего младшего порядка. Биты более высокого порядка теряются. Вот почему вы видите только 9 и 5.

Я не могу объяснить из представленного кода, почему вы показываете 9500 вместо 9595, но это похоже на вашу претензию, что при более высоких скоростях обновления вы видите, что 95 чередуется с 00 Оба приводят меня к мысли, что какая-то другая часть вашего кода записывает нули в последовательный порт.

+0

Я понимаю, это просто раздражает, что нет никаких указаний. Максимальное значение целого числа, которое может быть отправлено, равно 256. Итак, у меня должно быть два отдельных байта на стороне обработки так же, как у меня есть 2 на принимающей стороне? –

+0

@AdamKujawinski, две отдельные однобайтовые записи были бы разумным способом обойти это. Я бы счел это бонусом, который бы лучше соответствовал бы стороне чтения, поэтому я не буду вдаваться в какие-либо альтернативы. –

+0

ОК, поэтому мне кажется, что обработка не позволяет мне скомпилировать в два отдельных байта, поэтому я упаковываю их на 2 отдельных целых числа. Я буду держать вас в курсе :) –

0

Строковое представление Java - это UTF-16. Это означает, что каждый символ представлен 2 байтами. Для ASCII-букв один из них - 0x00. Это может быть причиной того, что вы не получите 61 из потока в ожидаемой позиции.

Вы можете либо пропустить каждые вторые байты на Arduino или преобразовать символы в обычный ASCII перед отправкой с помощью getBytes(Charset charset)https://docs.oracle.com/javase/7/docs/api/java/nio/charset/Charset.html

Смежные вопросы