2015-02-23 96 views
0

我在GPIO引腳上有一個覆蓋1.25MBaud的覆盆子pi位。樹莓派將在RS485通信網絡中模擬終端系統。所以希望這是物理層的工作:)C二進制流

我現在正在努力與應用層。 c代碼庫需要Ascii例如「Hello,world!」。我希望傳遞一個二進制流,即「111010111010001010111」,將會有5814位:)所以我一直在研究如何將二進制轉換爲ascii,但只發現複雜的C++答案。有沒有人有簡單的解決方案?謝謝你的幫助!

保羅

+4

「複雜的C++答案」 ......因此,這類型的答案並不複雜的嗎? (順便說一句,我發現了一些關於二進制,ascii和串行通信的一些基本誤解,你真的不需要轉換任何東西。) – 2015-02-23 15:39:29

+0

我必須生成一個二進制流,然後將其轉換爲ascii然後傳入一個gpio引腳庫 – SerialMadMan 2015-02-23 15:42:50

+0

Protip - 它是二進制的,一路下來。 – 2015-02-23 15:46:55

回答

1

顯然你並不需要打破串入位的API會爲你....

無論如何,如果你這樣做:

每個字符在您的「hello world \ n「字符串是以ASCII編碼時的一個字節。 ASCII實際上只使用最低的7位。如果你想把一個字符分成幾個位,我會用下面的代碼作爲開始。

char ch = 'h'; 
for (i=0; i<7; i++) { 
    bool b = (ch & 1 == 1); 
    ch >>= 1; 
    // set the bit value b off to the pin.... 
    } 

你需要一個循環來處理整個字符串。

+0

是不熟悉他正在使用的API。仍然代表着將字符分解成若干位的方法。 – AnthonyLambert 2015-02-23 15:58:02

+0

我知道ascii是7位。我希望有830個ascii字符代表5814位。 – SerialMadMan 2015-02-23 16:02:52

+1

830個字符但是5814位?那個怎麼樣? – 2015-02-23 16:09:58

0

對於移動7位ASCII碼字符到端口逐位,你可以使用:

void toPort(unsigned char x) { 
    x |= 0200; // Set unused high-bit to 1 
    for (; ;) { 
    char bit = x & 1; 
    x >>= 1; 
    if(x == 0) return; 
    push_to_port(bit); 
    } 
}