我试图在7段显示屏上显示4个单独的数字。这些数字来自一个程序,Processing收到一个像9561这样的数字,通过数学运算,我将9 5 6 1分成单个数字。
由于单个数字是4位,我使用整数来顺序压缩数字,其中的全十进制形式似乎是5721.我然后将此整数发送到Arduino,其中我有2个字节顺序运行Serial.read();
我的问题是我的7段4位数字显示只显示9500,这意味着x2为00意味着61在翻译中丢失。
更重要的是,当我加速时间(t)或多路复用的时间时,95将闪烁超过00并且当我创建数组0和0的seg0和seg1时我确认了它。 当t = 3时会发生这种情况,但是高于8的任何事情都不会出现这个问题。
我还应该在我的switch()中提到默认情况下显示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);
//0123
int disp1 = x;
int disp2 = (x & 0x00f0)>>4;
int disp3 = (x & 0x0f00)>>8;
int disp4 = (x & 0xf000)>>12;
//0123
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 :(得分:2)
假设myPort
是OutputStream
,您对myPort.write(int)
的一次调用只写一个字节,从其参数的最低8位提取。高阶位丢失。这就是为什么你只看到9和5的原因。
我无法从代码中解释为什么您显示9500而不是9595,但这似乎与您的声明一致,即在更高的更新速率下,您会看到95与00交替显示。两者都让我认为代码的其他部分正在将零写入串口。
答案 1 :(得分:0)
Java的字符串表示形式是UTF-16。这意味着每个字符由2个字节表示。对于ASCII字母,其中一个是0x00。这可能是您未在预期位置将61
从流中取出的原因。
您可以跳过Arduino上的每个第二个字节,或者在使用getBytes(Charset charset)
https://docs.oracle.com/javase/7/docs/api/java/nio/charset/Charset.html