マイコンとPCを接続して通信することを考えましょう。
ここではシリアルポート(RS-232 9pin)を使用したシリアル通信をメインに記述します。
シリアルポート
#ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (serialport.jpg)
最近のパソコンはデスクトップでもこのシリアルポートを見かけなくなりましたねぇ。
ノートなんてなおさら見かけません。
実際一般人は使わないからなぁ。
でも大丈夫!USB→シリアルポートの変換ケーブルが存在するのです!
変換ケーブルに関する詳細は
使用パーツ一覧をご覧ください。
PC→マイコン 文字送信
細かい理屈はこの際置いときましょう(笑)
とりあえず使えるようになること。
実際使えるようになって、そのあとでいろいろ理屈を覚えましょう。
ここではPCからマイコンに「文字」を送るアプリケーションを作ります。
実行すると以下のような画面が出ます。
アルファベットが書かれたボタンが4つありますね。
シリアルポートで結ばれたH8マイコンに文字を送れます。
通信ポートは以下の条件で使用してください。
通信速度 38400bps
ポート com1
それ以外はデフォルトの値
マイコン側のプログラムは
シリアル通信(H8)を参照してください。
マイコン側は文字を受信するとLEDを光らせる仕様になっています。
PC→マイコン→PC
今回はマイコンにもちょっと細工をします。
a~dまでのアルファベットを受信すると、
それに応じたLEDを点灯させると同時にパソコンに文字を返信します。
今回紹介するアプリは前回の文字を送るコマンドに、テキストボックスでの受信を加えたものです。
実行すると以下のような画面が出ます。
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