5

シリアル ポート (COM8 など) を使用する C++ MFC アプリケーションを作成しようとしています。DCB を設定しようとするたびに失敗します。誰かが私が間違っていることを指摘できれば、本当に感謝しています。

DCB dcb = {0};

dcb.DCBlength = sizeof(DCB);
port.Insert( 0, L"\\\\.\\" );

m_hComm = CreateFile(
    port,                           // Virtual COM port
    GENERIC_READ | GENERIC_WRITE,   // Access: Read and write
    0,                              // Share: No sharing
    NULL,                           // Security: None
    OPEN_EXISTING,                  // The COM port already exists.
    FILE_FLAG_OVERLAPPED,           // Asynchronous I/O.
    NULL                            // No template file for COM port.
    );

if ( m_hComm == INVALID_HANDLE_VALUE )
{
    TRACE(_T("Unable to open COM port."));
    ThrowException();
}

if ( !::GetCommState( m_hComm, &dcb ) )
{
    TRACE(_T("CSerialPort : Failed to get the comm state - Error: %d"), GetLastError());
    ThrowException();
}

dcb.BaudRate = 38400;               // Setup the baud rate.
dcb.Parity = NOPARITY;              // Setup the parity.
dcb.ByteSize = 8;                   // Setup the data bits.
dcb.StopBits = 1;                   // Setup the stop bits.

if ( !::SetCommState( m_hComm, &dcb ) ) // <- Fails here.
{
    TRACE(_T("CSerialPort : Failed to set the comm state - Error: %d"), GetLastError());
    ThrowException();
}

ありがとう。

追加情報:生成されたエラー コードは 87 です: 「パラメーターが正しくありません。」おそらく Microsoft の最も有用なエラー コードです。j/k

4

5 に答える 5

12

私のお金はこれにあります:

dcb.StopBits = 1; 

MSDN のドキュメントには、StopBits について次のように書かれています。

使用するストップ ビットの数。このメンバーは、次のいずれかの値になります。

ONESTOPBIT    0    1 stop bit.
ONE5STOPBITS  1    1.5 stop bits.
TWOSTOPBITS   2    2 stop bits.

つまり、あなたは 1.5 ストップ ビットを要求しています。おそらくテレプリンター。

このモードをサポートするドライバー/ハードウェアの可能性は低いと思います。したがって、エラーが発生します。

だから、それをdcb.StopBits = ONESTOPBIT;

于 2010-11-15T22:49:18.313 に答える
3

次を使用して問題を解決できましたBuildCommDCB

DCB dcb = {0};

if ( !::BuildCommDCB( _T("baud=38400 parity=N data=8 stop=1"), &dcb ) )
{
    TRACE(_T("CSerialPort : Failed to build the DCB structure - Error: %d"), GetLastError());
    ThrowException();
}
于 2010-11-15T21:42:58.550 に答える
3

以下にいくつかの可能性を順不同で示します。

  • GetCommStateポートがまだ初期化されていないため、構造体がガベージで埋められています。この手順を省略できます。
  • パリティ設定を制御するパラメーターは 2 つありますが、無効な組み合わせがあるかどうかは不明です。
  • StopBits の値はビット数ではなく、マジック ナンバー定数です。値 1 はONE5STOPBITS、他のパラメーターと組み合わせたときに無効になる可能性があるものと同等です。
于 2010-11-15T21:56:35.380 に答える
0

関数に指定するパラメーターを確認してください。エラーコードが示すように、それらはおそらく正しくありません。「SetCommState87」をグーグル検索すると、パラメータ(ボーレートなど)がシリアルポートと互換性がなかったいくつかのインスタンスが表示されます。

于 2010-11-15T21:19:09.393 に答える