烦人 发表于 2014-4-2 14:13:57

串口数据数制转换问题

本帖最后由 烦人 于 2014-4-2 14:13 编辑

串口数据数制转换问题
int count = 0;
int data;
void setup(){
pinMode(4, INPUT);                  
Serial.begin(9600);
delay(200);
attachInterrupt(0,getBit,FALLING);   
}
void loop(){
    int i=0;
    while(count>21){
    detachInterrupt(0);
    for(i=0; i<22;i++){
      Serial.print(data);
    }
    Serial.println();
    delay(200);
    count = 0;
    attachInterrupt(0,getBit,FALLING);
    }
    Serial.println();
    delay(200);
}
}
void getBit(){
if(count < 22){
    if(digitalRead(4)==1)
      data = 1;
    else
      data = 0;
    count++;
}
}

问题:这个程序可以运行,可以在PC串口上显示0001001111…….一行22位数字,高位在前,我想在PC串口上显示十进制数,我把上面程序进行了这样的处理了
for(i=22; i>0;i--){   
Serial.print(data);   
    }
处理后PC上可以得到 …..1111001000这样一行数。(达到了要求22位数字头尾颠倒了)
然后将Serial.print(data);改为Serial.print(1-data);把每一位的数取反,得…..0000110111
然后将Serial.print(data); 再改为Serial.print(1-data,DEC); 想这样在PC上得到十进制数,但不行。看来这个…..0000110111不是二进制数,是个字符串?
请教一下高人,我如何才能在PC串口上得到十进制数,先谢谢了。

Super169 发表于 2014-4-2 21:38:33

由於你現在是 22 個 bit, 並非一個 value, 當你用 print(x, DEC) 是, 每次只是提供一個 bit, 無論用 二進, 十進 還是 十六進, 結果都是 0 或 1.
先把 22 個 bit 合成一個 數 (22 bit 的, 要用 long / unsigned long 才可以), 然後再 print 出來吧.
如果本身接收時是高位在前, 你可以在接收時直接合成, 例如:

long val = 0;
for (..) val = val * 2 + digitalRead(4);   
// 不太肯定 << 是否可用於 long, 否則 val = val << 1 + digitalRead(4); 比較易明白一點.

之前, 用 Serial.print(val); 就可以得到 十進的字串了; 如需要的是數值, 就改用 Serial.write(val);

烦人 发表于 2014-4-3 14:47:26


由於你現在是 22 個 bit, 並非一個 value, 當你用 print(x, DEC) 是, 每次只是提供一個 bit, 無論用 二進, 十進 還是 十六進, 結果都是 0 或 1.
先把 22 個 bit 合成一個 數 (22 bit 的, 要用 long / unsigned long 才可以), 然後再 print 出來吧.
如果本身接收時是高位在前, 你可以在接收時直接合成, 例如:

long val = 0;
for (..) val = val * 2 + digitalRead(4);   
// 不太肯定 << 是否可用於 long, 否則 val = val << 1 + digitalRead(4); 比較易明白一點.

之前, 用 Serial.print(val); 就可以得到 十進的字串了; 如需要的是數值, 就改用 Serial.write(val);


首先非常感谢 super169!
我试过你说的很对,无论用 二進, 十進 還是 十六進, 結果都是 0 或 1.
我是个新手,抱歉,
我用 long / unsigned long 试一试,回头来汇报。
页: [1]
查看完整版本: 串口数据数制转换问题