0

Windows で COM ポートから行ごとにデータを読み込もうとしています。PuTTY では、COM 接続は問題ないように見えます。私のシリアル デバイス (MSP430 Launchpad) は、文字列 "Data" を 1 秒に 1 回出力します。ただし、単純な C プログラムを使用して COM ポートを読み取り、読み取ったバイト数を出力すると、データ自体が完全に壊れてしまいます。

0
6 Data

2 Data

4 ta


6 Data

3 Data

3 a
a

6 Data

6 Data

2 Data

と言っている行6 Dataは正しいですが (4 文字の場合は\r\n)、完全なメッセージが含まれていない行はどうなるのでしょうか? documentationによると、ReadFileデフォルトでは行全体を読み取る必要があります。これは間違っていますか? 自分でバッファリングして改行文字を待つ必要がありますか?

コードを実行するたびに、これらすべてのエラーが発生するわけではないことに注意してください。私はいくつかの実行を行い、さまざまなエラーをまとめました。私が使用しているコードは次のとおりです。

#include <windows.h>
#include <stdio.h>

static DCB settings;
static HANDLE serial;
static char line[200];
static unsigned long read;
static unsigned int lineLength = sizeof(line) / sizeof(char);

int main(void) {
   int i = 10;

   serial = CreateFile("COM4",
      GENERIC_READ | GENERIC_WRITE,
      0, NULL,
      OPEN_EXISTING,
      0, NULL);

   GetCommState(serial, &settings);
   settings.BaudRate = CBR_9600;
   settings.ByteSize = 8;
   settings.Parity = NOPARITY;
   settings.StopBits = ONESTOPBIT;
   SetCommState(serial, &settings);

   while(i) {
      ReadFile(serial, &line, lineLength, &read, 0);
      printf("%lu %s\n", read, line);
      i--;
   }
   scanf("%c", &read);

   return 0;
}

Visual Studio Express 2012 を使用して Windows 7 64 ビットでコンパイルされました。

4

1 に答える 1

2

何が起こっているかというと、ReadFileがデータを取得した後に返されます。将来のある時点でデータがシリアル ポートに送信される可能性があるため、シリアル ポートである程度ReadFileの量のデータを取得すると、 が返されます。readシリアルポートから接続しようとすると、Linux でも同じことが起こります。返されるデータは、プロセスが再びディスパッチされたときにバッファー内にある情報の量に応じて、行全体である場合とそうでない場合があります。

ドキュメントをもう一度見てみるとHANDLE、コンソール モードの場合にのみ行が返されることに注意してください。

コンソール入力へのハンドルを指定して ReadFile を使用すると、コンソール入力バッファから文字を読み取ることができます。コンソール モードは、ReadFile 関数の正確な動作を決定します。デフォルトでは、コンソール モードは ENABLE_LINE_INPUT です。これは、ReadFile がキャリッジ リターンに到達するまで読み取る必要があることを示します。Ctrl+C を押すと、呼び出しは成功しますが、GetLastError は ERROR_OPERATION_ABORTED を返します。詳細については、CreateFile を参照してください。

于 2013-10-26T02:01:25.007 に答える