Skip to content
leico edited this page Aug 6, 2019 · 3 revisions

USBシリアル通信の実装

シリアル通信の方式

データ長 パリティ ストップビット
8bit 奇数 1

メッセージの送受信方法

アドレスデータ

  • 各 byte の先頭ビットを 1 、残りの 7bit を実データとする 5byte を用いて転送を行う
    • 最上位 byte の MSB 3bit は 111 とする
                                               +----+----+----+----+----+----+----+----+
                                               |    |    |    |    |    |    |    |    |
                                               +----+----+----+----+----+----+----+----+
                                               |--------address(32bit int)-------------|
      
                             +----     +----+---     -+----+--    --+----+-    ---+----+ 
                             |         |    |         |    |        |    |        |    |  split per 7bit
                             +----     +----+---     -+----+--    --+----+-    ---+----+
      
       +-+---|+----|     +-|+----+---|    +-|-+----+--|    +-|--+----+-|    +-|---+----+ 
       |1|111||    |     |1||    |   |    |1| |    |  |    |1|  |    | |    |1|   |    |  add head bit
       +-+---|+----|     +-|+----+---|    +-|-+----+--|    +-|--+----+-|    +-|---+----+
      

データ

  • 各 byte の先頭ビットを 0 、残りの 7bit を実データとする 5byte を用いて転送を行う
    • 最上位 byte の MSB 3bit は 111 とする
                                               +----+----+----+----+----+----+----+----+
                                               |    |    |    |    |    |    |    |    |
                                               +----+----+----+----+----+----+----+----+
                                               |--------data(32bit float)--------------|
      
                             +----     +----+---     -+----+--    --+----+-    ---+----+ 
                             |         |    |         |    |        |    |        |    |  split per 7bit
                             +----     +----+---     -+----+--    --+----+-    ---+----+
      
       +-+---|+----|     +-|+----+---|    +-|-+----+--|    +-|--+----+-|    +-|---+----+ 
       |0|111||    |     |0||    |   |    |0| |    |  |    |0|  |    | |    |0|   |    |  add head bit
       +-+---|+----|     +-|+----+---|    +-|-+----+--|    +-|--+----+-|    +-|---+----+
      

データの破棄、タイムアウトなど

  • データの途中でアドレスデータが来た場合、途中のデータは破棄する
  • ただし、受信したところまでの動作が定義されている場合は、その動作を実行する
      | address |~| data |~~~| address |~| data |~| data |~| data |~~~~
                             |<- discard or execute 
    
  • データの途中で2ループほどシリアルデータが取得できなかった場合、途中のデータを破棄する
  • ただし、受信したところまでの動作が定義されている場合は、その動作を実行する

エンディアン

アドレス側の下位バイトから順番に送信される。

+----+----+----+----+----+----+----+----+
| 08 | 07 | 06 | 05 | 04 | 03 | 02 | 01 |
+----+----+----+----+----+----+----+----+
|--------address(32bit int)-------------|

+----+----+----+----+----+----+----+----+
| 08 | 07 | 06 | 05 | 04 | 03 | 02 | 01 |
+----+----+----+----+----+----+----+----+ 
|--------data(32bit float)--------------|

ポーレート

115200 を標準に用いるだろうが、シリアルポート名接頭辞の値 x 100 を用いるようにしたい。 接尾辞は _ で区切られている。

192_usbserial1ad7

この場合、ポーレートは 19200 になる。