シリアル通信でバイト数取得するには?

解決


  2007-09-30 20:30:33  No: 66509

こんにちは、プログラミング初心者の粉と申します。
現在シリアル通信を勉強しております。
cbInQueでバイト数を取得したいのですが、1バイトしか取得出来ていなく困っています。

受信用プログラムをVistaで起動し、送信用プログラムをXPで起動しています。
送信プログラムで「aaaaa」と入力しても受信プログラムの結果は「aフフフフフフフフフフフフ (1:1)」といった結果です。

なぜ1バイトしか取得出来ていないのかがわかりません。
送信プログラムが悪いのでしょうか?
(私の頭が悪いのは間違いないですが。)

どうか教えて頂けないでしょうか?

/* --- 受信用 --- */
#include <windows.h>
#include <iostream>

using namespace std;

void main(void)
{
  HANDLE hComm;
  char buff[10];
  DWORD dwSize;
  DWORD dwCount;
  DWORD dwErrors;
  COMSTAT ComStat;

  hComm = CreateFile(
    "COM7",
    GENERIC_READ | GENERIC_WRITE,
    0,
    0,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    0
  );

  if( hComm == INVALID_HANDLE_VALUE ) exit( 1 );
  cout << "--> Receive Wait <--\n";

  while(1){
    ClearCommError(hComm, &dwErrors, &ComStat);
    dwCount=ComStat.cbInQue;// 1byteしか受信出来てないのはなぜ?
    if(dwCount > 0){
      ReadFile(hComm, buff, dwCount, &dwSize, NULL);
      cout << buff << "(" << dwCount << ":" << dwSize << ")\n";
      break;
    }
  }
  cout << "--> Receive Complete <--\n";
  CloseHandle(hComm);

}

/* --- 送信用 --- */
#include <windows.h>
#include <stdio.h>
#include <string.h>

void main(void)
{
  HANDLE hComm;
  DWORD size;
  char ss[20];

  hComm = CreateFile( 
    "COM1",
    GENERIC_READ | GENERIC_WRITE,
    0,
    0,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    0
  );

  if( hComm == INVALID_HANDLE_VALUE ) exit( 1 );
  while(1){
    printf("Input: Send Data >");
    scanf("%s", ss);
    if(strcmp(ss, "exit") == 0) //exitを入力すると終了
      break;
    WriteFile(hComm, ss, strlen(ss), &size, NULL);
  }
  CloseHandle(hComm);
}


渋木宏明(ひどり)  URL  2007-09-30 21:08:04  No: 66510

表示が「aフフフフフフフフフフフフ (1:1)」なのは、受信したデータを「文字列」として扱う時のコードが不適切だからです。

「文字列終端」について勉強してください。

データが1バイトしか受信出きていないのは、「そういうこともある」のがシリアルの性質だから(それ以外の通信手段でもそれほど珍しいパターンではありません)です。

絶対に1バイトずつしか取得できないわけではないけど、期待通りのバイト数のデータが読み出せる保証はありません。


  2007-09-30 22:27:43  No: 66511

有難う御座います。
勉強して出直して参ります!


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加