プロが教えるわが家の防犯対策術!

はじめまして。

コマンドラインから実行可能なRS232C通信プログラムを
Cで作成しています。

ハイパーターミナルからCOM2に文字を出力して
ReadFileで取得した文字列を画面にはき出すというだけの
「Hello,World!」のような簡単なプログラムなのですが
ReadFileの動作結果に思うようなものが得られず困っています。
お知恵をお貸しください。

読込結果がおかしいのです。
リターンキー以外は何を入力しても「7F」が返ってきてしまいます
(リターンキー入力の場合も正常値ではありません)。
また、入力も無視されたり、認識されたりで動作も不安定です。
ReadFile自体のエラーは発生しません。

よろしくお願いいたします。


Borland C++ Compiler 5.5
Windows2000(実際に動作させたいのはWin95上です)



以下、コードです。

DWORD dwErrors; // エラー情報
COMSTAT ComStat; // デバイスの状態
DWORD dwCount; //受信データのバイト数
DWORD dwRead; // ポートから読み出したバイト数
unsigned char pszBuf[30];// 受信バッファ

while(1){
 ClearCommError(hComm, &dwErrors, &ComStat);
 dwCount = ComStat.cbInQue;
 if (0 >= dwCount) continue;
 memset(pszBuf,'\0',sizeof(pszBuf));
 if (ReadFile(hComm, pszBuf, dwCount, &dwRead, NULL)){
  if (dwRead > 0) {
   if (pszBuf[0] == '\r') break;
   printf("%%s : %s\n",pszBuf);
  }else{
   break;
  }
 }
}

A 回答 (2件)

訂正します



while(1){
 success = ReadFile(hComm, &c, 1, &dwRead, 0);
 if(!success){
  printf("ReadFileでエラー発生\n");
  break;
 }
 if(dwRead == 0){
  continue;

 }else if(c == 13){
  printf("\n");
  break;

 }else{
  purintf("%0x ", c);
 }
}
    • good
    • 0
この回答へのお礼

解答ありがとうございました。
(お礼はこちらにつけさせていただきました。)

解答を拝見する前に原因がわかりました。
穴があったら入りたいような凡ミスでした
構造体に設定する値を間違えていました。
 dcb.BaudRate = BAUD_9600;
ではなく、
 dcb.BaudRate = 9600;
にしなくてはいけませんでした。
お騒がせしてしまい、申し訳ありません。
重ねてお礼申し上げます。

お礼日時:2004/08/11 11:02

1文字1文字取得して下記のようにしたらうまくいくでしょうか?



DWORD dwCount; //受信データのバイト数
DWORD dwRead; // ポートから読み出したバイト数
char pszBuf[30];// 受信バッファ
BOOL success;
char c;

while(1){
 success = ReadFile(hComm, &c, 1, &dwRead, 0);
 if(!success){
  printf("ReadFileでエラー発生\n");
  break;
 }
 if(c == 13){
  printf("\n");
  break;

 }else{
  purintf("%0x ", c);
 }
}

また、受信しているバイト数を得るところを下記のようにしてみればどうでしょうか?

ZeroMemory(&ComStat, sizeof(ComStat));
ClearCommError(hComm, &dwErrors, &ComStat);
dwCount = ComStat.cbInQue;
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!