シリアル通信

出典: YKAwiki

目次

ハードウェア側

それぞれのGNDおよびRXとTXを結線するだけ. たとえばPCとH8でシリアル通信したい場合,

PC側  H8側

GND - GND

TX  - RX

RX  - TX

という具合に結線すればおk H8同士でシリアル通信する場合もこれでおk

ソフトウェア側

使用例

2005年5月の名大祭で使われたものを参考にします。
なお、シリアル通信はH8と行いました。

//初期化。ポートを開きます。
void init(){
 // COM1ポートをレート9600bpiで開いています。
 if( CommOpen("COM1", "9600", "N,8,1") != 0){
  //接続失敗した時は終了します。
  //原因として、
  // ・違うCOMポート使ってた
  // ・PIC焼き機がCOM1だった
  // ・なぜかビジー状態
  // ・繋がってない
  //などが考えられます。接続を確認してみましょう。
  cerr<<"失敗"<<endl;
  exit(1);
 }
}
//更新時に呼びます 
void update(){
 int readResult;
 unsigned char readValue;
 
 //読み込みはバッファがあれば何回でも読み込んでおkです。
 //ただし、何バイト受けたり渡したりするかのプロトコルはちゃんと決めときましょう。
 for(int i = 0; i < INPUT_WIDTH * INPUT_HEIGHT * 2 * INPUT_RATE; i++){
  readValue = 0;
  //1バイトだけ読み込みます。
  readResult = CommReadChar(1, (int*)&readValue);
  //結果は
  // ・TRUE:成功 
  // ・FALSE:失敗
  // ・COMM_TIMEOUT:読み込みタイムアウト
  //等。
 }
}

※シリアル通信はCPUに比べてかなり遅いので、別スレッドを立てて行うが吉。

リファレンス

// COMポートをオープンします
// 
// 戻値 : 1,2,3,4 = 成功 (1 = COM1)
//        -1 = ポート指定が正しくない
//        -2 = ボーレート指定が正しくない
//        -3 = コンフィグ指定が正しくない
// 引数 : pszComPort = COMポート文字列 ("COM1")
//        pszBaudRate = ボーレート文字列 ("38400")
//        pszConfig = 設定文字列 ("N,8,1" = NoParity/8bit/1stop)
int /*APIENTRY*/
CommOpen(LPCTSTR pszComPort, LPCTSTR pszBaudRate, LPCTSTR pszConfig)
// COMポートから1バイトだけデータを読み出します
//
int /*APIENTRY*/
CommReadChar(int nComPort, int* pnChar)
// COMポートにデータ1バイトを書き込みます
//
int /*APIENTRY*/
CommWriteChar(int nComPort, int nChar)

※1バイトだけでなく、指定バイト長のサイズのデータをやり取りすることも可能。詳細はstub

// COMポートをクローズします
//
int /*APIENTRY*/
CommClose(int nComPort)

ビットフィールド

1バイトで取得・書き込みする場合、ビット演算で管理すると便利。

例えば、ビットの構成が

座標情報:00xxxyyy (xxx:X座標,yyy:Y座標)
入力情報:11nnnnnn (nnnnnn:強度)

であるばあい、CommReadCharで

value = 11011101

が得られたならば、

if( value & 0xC0 == 0x00){
 //座標情報だよ
}else if( value & 0xC0 == 0xC0){
 //入力情報だよ
}

とすることで分解して判断することが可能。|,&,|=,&=,>>,<<を用いて行う。

なお、2ビットの列のうち、先頭(上位)4桁(4ビット)と16進数の16の位、及び下位4ビットと16進数の1の位は対応している。例えば

0110 1011

は、0110 = 6 = 0x6, 1011 = 11 = 0xB より、

0x6B

となる。