シリアル通信(VC++)

マイコンとPCを接続して通信することを考えましょう。

ここではシリアルポート(RS-232 9pin)を使用したシリアル通信をメインに記述します。


シリアルポート

#ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (serialport.jpg)

最近のパソコンはデスクトップでもこのシリアルポートを見かけなくなりましたねぇ。
ノートなんてなおさら見かけません。
実際一般人は使わないからなぁ。

でも大丈夫!USB→シリアルポートの変換ケーブルが存在するのです!
変換ケーブルに関する詳細は使用パーツ一覧をご覧ください。


PC→マイコン 文字送信

細かい理屈はこの際置いときましょう(笑)
とりあえず使えるようになること。
実際使えるようになって、そのあとでいろいろ理屈を覚えましょう。

ここではPCからマイコンに「文字」を送るアプリケーションを作ります。
このアプリのプロジェクトファイル(2.34MB) 右クリックで対象をダウンロード(Vr.001)
このアプリを使うには、パソコンにVC++2005もしくは2008があらかじめインストールされている必要があります。

実行すると以下のような画面が出ます。

アルファベットが書かれたボタンが4つありますね。
シリアルポートで結ばれたH8マイコンに文字を送れます。
通信ポートは以下の条件で使用してください。
通信速度 38400bps
ポート com1
それ以外はデフォルトの値

マイコン側のプログラムはシリアル通信(H8)を参照してください。
マイコン側は文字を受信するとLEDを光らせる仕様になっています。


PC→マイコン→PC

今回はマイコンにもちょっと細工をします。
a~dまでのアルファベットを受信すると、
それに応じたLEDを点灯させると同時にパソコンに文字を返信します。

今回紹介するアプリは前回の文字を送るコマンドに、テキストボックスでの受信を加えたものです。
このアプリのプロジェクトファイル(2.34MB) 右クリックで対象をダウンロード(Vr.001)
このアプリを使うには、パソコンにVC++2005もしくは2008があらかじめインストールされている必要があります。

実行すると以下のような画面が出ます。



PC→マイコン


一文字送信成功例
	strcpy(sBuf, "1\n");
	WriteFile( h, sBuf, 3, &mm, 0 ); // シリアルポートに対する読み込み
	//strcpy(sBuf, "\n");
	//WriteFile( h, sBuf, 1, &mm, 0 ); // シリアルポートに対する読み込み
	printf("%sが入力されました\n",sBuf);


文字入力に対してAD値を返す
while(1) {
	printf("送信文字を入力します\n");
	i=0;
	strcpy(sBuf, "3\n");
	WriteFile( h, sBuf, 3, &mm, 0 ); // シリアルポートに対する書き込み
	//sBuf<<3;
	printf("%sが入力されました\n\n",sBuf);
	//getchar();
	//printf("%sが出力されました1,%s\n",str,rBuf);
	while(1) {
        ReadFile( h, rBuf, 1, &nn, 0 ); // シリアルポートに対する読み込み
        if ( nn==1 ) {//もし1バイト読み込んだら
            if ( rBuf[0]==10 || rBuf[0]==13 ) { // '\r'や'\n'を受信すると文字列を閉じる
                if ( i!=0 ) {
                    str[i] = '\0';
                    i=0;
                    if(RTs==1){
						printf("%sが出力されました\n",str);
						RTs=0;
						getchar();
						break;
					}
					RTs++;
                }
            } else { //if ( rBuf[0]==10 || rBuf[0]==13 ) {
                str[i] = rBuf[0];
                i++;
            }//if ( rBuf[0]==10 || sBuf[0]==13 ) {
        }//if ( nn==1 ) {
    }//while(1)	
   }//while(1)


PC→マイコン(あらかじめH8のポートを開けておかないと文字送信できないバグを修正)
 #include <windows.h>
 #include <stdio.h>

 void main()
 {
   HANDLE          comHandle ;
   BOOL            succ ;
   CHAR            str[100] ;
   DCB             dcb ;
   CHAR            c ;
   DWORD           numWrite ;
   DWORD           numRead ;
   COMMTIMEOUTS    timeouts ;
   CHAR            inputBuffer[1000] ;
   int             inputBufferCntr = 0 ;
   BOOL            connected = FALSE ;
DWORD   Status ;

   // 通信ポートを開く
   comHandle = CreateFile("COM1",
                          GENERIC_READ | GENERIC_WRITE,
                          0,
                          0,
                          OPEN_EXISTING,
                          FILE_ATTRIBUTE_NORMAL,
                          0 ) ;
if (comHandle == INVALID_HANDLE_VALUE) {
 Status = GetLastError();

       printf("通信ポートオープンエラー\n") ;
       ExitProcess(1) ;
   }

   // 通信ポートの現在の設定を取得する
   succ = GetCommState(comHandle, &dcb) ;
   if (!succ) {
       printf("GetCommStateエラー\n") ;
       ExitProcess(1) ;
  }

   // ボーレート設定
   dcb.BaudRate = 2400 ;
   dcb.ByteSize = 8 ;
   dcb.Parity = NOPARITY ;
   dcb.StopBits = ONESTOPBIT ;

   // 通信設定を保存する
   succ = SetCommState(comHandle,&dcb) ;
   if (!succ) {
       printf("SetCommStateエラー\n") ;
       ExitProcess(1) ;
   }

   timeouts.ReadIntervalTimeout         = 0 ;
timeouts.ReadTotalTimeoutMultiplier  = 0 ;
timeouts.ReadTotalTimeoutConstant    = 0 ;
timeouts.WriteTotalTimeoutMultiplier = 0 ;
timeouts.WriteTotalTimeoutConstant   = 0 ;
SetCommTimeouts(comHandle, &timeouts) ;

// DTR信号配線をONに設定する
EscapeCommFunction(comHandle, SETDTR) ;

strcpy(str, "ABC") ;

succ = WriteFile(comHandle, str, strlen(str), &numWrite, 0) ;
if (!succ) {
 printf("WriteFileエラー\n") ;
 ExitProcess(1) ;
}

// DTR信号配線をクリアしてオフにする。
EscapeCommFunction(comHandle, CLRDTR) ;

CloseHandle(comHandle) ;
 }
最終更新:2009年10月31日 05:18