2014-10-09 13 views
-1

我想寫一個函數發送一個16位字並將其存儲在另一個變量中。我想要做的就是接受這個詞,並且一次一個位地將數據傳輸(寫入)到新變量中。C:如何以遞歸方式逐位傳輸字節?

如果這可以遞歸地完成,這也會很棒。因此,例如我具有SendCommand(uint32_t addr,uint16_t data)函數,並且在傳輸了一位後,可以移位字節並且可以使用新數據再次調用該函數。

我的問題是:

  • 我如何提取,每次寫入新的變量一個位?
  • 什麼是可能的方式來確定單詞的結尾,並停止調用該函數?

注:MSB第一

編輯:

我這樣做的原因是因爲我對於將接受這個數據的設備編寫僞代碼。現在在我的代碼中,我模擬一個時鐘,並且爲該設備指定的格式在時鐘的每個下降沿寫入一個位。

+2

爲什麼遞歸? – 2014-10-09 14:33:24

+2

...爲什麼一點一滴?解釋你想達到的目標。一點一點傳輸實質上歸結爲包含移位操作和掩碼操作的循環, – 2014-10-09 14:37:20

+0

我正在爲將接受此數據的設備編寫僞代碼。現在在我的代碼中,我模擬一個時鐘,並且爲該設備指定的格式在時鐘的每個下降沿寫入一個位。我將用這些更新編輯問題 – 2014-10-09 14:39:29

回答

2

需要編寫一個呼叫MSB-第一:

void SendCommand(uint32_t addr, uint16_t data) {  
    volatile unsigned char *dest = (unsigned char *)addr 
    for(int i=15; i>=0; --i) { 
     *dest = (data & 0x8000) >> 15; 
       //  ^^^^^^^^ get MSB 
       //    ^^^^^ move the MSB down to the LSB, assuming the 
       //      peripheral wants the bit in the LSB. 
     data <<=1; 
    } 
} //SendCommand 

多次調用做起來需要保持位的計數莫名其妙。如果沒有在某個地方進行計數,則無法確定是否將每一位都從左側移開,或者您沒有任何剩餘的位。旋轉和測試相等性也不起作用,例如對於0x5555或其他具有重複位模式的值。

+0

我認爲這應該起作用,但是當我嘗試運行它時,我收到一個異常,然後程序很快關閉。例外情況是:「0 [main] 56-REVB 17008 cygwin_exception :: open_stackdumpfile:將堆棧跟蹤轉儲爲56-REVB.exe.stackdump」 – 2014-10-09 15:16:03

+0

G,不確定副手,但我會仔細檢查addr參數並確保它適合你的目標。您是在硬件上還是在PC上測試?如果是PC機,你可以聲明一個'unsigned char foo'並且調用'SendCommand(&foo,0xbeef)'來寫入一個有效的地址。 – cxw 2014-10-23 15:31:49