2014-09-19 57 views
1

我正在爲我的arduino編程曼徹斯特編碼。在Arduino上實現曼徹斯特編碼

這意味着一個1位由10表示,並且零被01.

1111表示將在manachester代碼10101010。

我的計劃(在Arduino的C++)編碼的字符數組曼徹斯特代碼如下所示:

//Output needs to be twice as big as input 
    void encodeManchester(char * input, char * output, int size) { 
     for(int i=0; i<size; i++) { 
      for(int p=0; p<2; p++) { 
       int pos = i*2+(p); 
       output[pos] = 0b00000000; 
       for (int j=0; j<4; j++) { 
        int actval = input[i]>>(7-(j+4*p)); 
        if((actval & 0b00000001) == 0b00000001) { 
         output[pos] = output[pos] | (0b10<<(j*2)); 
        } else { 
         output[pos] = output[pos] | (0b01<<(j*2)); 
        } 
       } 
      } 

     } 
    } 

我的解碼器(PC上的Python)的樣子:

def manDecode(data): 
    ret = [] 
    for i in range(0, len(data)/2): 
     ret.append(0b00000000); 

     for p in range(0, 2): 
      print(bin(data[i*2+p])); 

      for j in range(0, 4): 
       part = (data[i*2+p] >> (6-(j*2))) & 0b11 
       if part == 0b10: 
        ret[i] = ret[i] | (0b10000000 >> (j+p*4)) 
    return ret; 

,但我得到曼徹斯特代碼中的奇怪值如:0b11110000或0b1111111。他們來自哪裏?

回答

2

在C++和python之間的代碼索引中存在一些未命中匹配問題。

首先,在使用位操作時,使用unsigned types(在這種情況下將是unsigned char)會更好,因爲避免了C++需要轉換爲較大類型時由符號擴展引起的很多問題。

的C++版本我使唯一的變化是,改變輸入類型unsigned char

void encodeManchester(unsigned char* input, unsigned char* output, int size) 

蛇皮版本是:

def manDecode(data): 
    ret = [] 
    for i in range(0, len(data)/2): 
     ret.append(0b00000000); 

     for p in range(0, 2): 
      print(bin(data[i*2+p])); 

      for j in range(0, 4): 
       part = (data[i*2+p] >> (6-(j*2))) & 0b11 
       if part == 0b10: 
        ret[i] = ret[i] | (1 << (j+(1-p)*4)) 
    return ret; 

的變化爲在線:ret[i] = ret[i] | (1 << (j+(1-p)*4))檢查(1-p)而不是p這是需要的,因爲您正在形成數字第一個high nible然後low nible,並在第一次迭代與以前的版本將ret[i] | (1 << (0 + 0 * 4))沒有任何移動(改變low nible