シリアル通信をBit Bangingでやるのはいいんだが、いったいシリアル通信って何?
それほどまじめに取り組む気もないのだが、多少のことは知っててもいいだろうというので、まずはお決まりのロジック・アナライザーで信号を眺めてみた。
ずっと小文字の「v」を送り続けると、こんなのの繰り返しとなる。
通信条件はこう。
小文字の「v」のASCIIコードは0x76で0b01110110なので、どうやらこういう感じらしい。
Highの状態だった信号がLowになるとそれ以降データが送られてくることをあらわし、このきっかけの1ビットをスタート・ビットと言うそうな。
データ長が8ビットに設定してあるので8つ読んだら9番目がもう一度Highになってこれをストップ・ビットと呼び、データの終了を表すのだそうだ。
今回の設定ではパリティー無しなのでパリティー・ビットは無い。
なるほど、としか言いようが無いが…。
通信速度は1200baudに設定してあり、1秒間に1200ビット送るということだ。
計算すると1ビット分は833μsとなり、8ビット分なら6.6666msなわけだが、実際に8ビット分を測ってみると、下のように6.6505msだった。
以上を踏まえてBit Bangingのコードを眺めると
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
void UART_Transmit(const char DataValue){ unsignedchar i; UART_TX = 0; __delay_us(OneBitDelay); for (i = 0; i < DataBitCount; i++){ if(((DataValue>>i)&0x1) == 0x1){ UART_TX = 1; }else{ UART_TX = 0; } __delay_us(OneBitDelay); } UART_TX = 1; __delay_us(OneBitDelay); } |
すらすらと頭に入ってきて理解できる。
この例ではキーボードからの入力を送ってるので、データとデータの間が十分に開いているが、下のように、PICでフル回転で送信したような場合は、どれがスタート・ビットだかどうやって分かるんだろう。