0

現在、Cを使用したwin32とのシリアル通信を勉強しています。シリアルポートからの読み取りは以下のようになります。

DWORD dwEventMask;
DWORD dwSize;

if(!SetCommMask(hSerial, EV_RXCHAR)){
    //Error handling
    printf("Error Setting Comm Mask \n");
}

if(WaitCommEvent(hSerial, &dwEventMask, NULL))
{
    unsigned char szBuf[1024];
    DWORD dwIncommingReadSize;

    do
    {
        if(ReadFile(hSerial, &szBuf, 1, &dwIncommingReadSize, NULL) != 0) {
            //Handle Error Condition
        }

        if(dwIncommingReadSize > 0)
        {
            dwSize += dwIncommingReadSize;
            sb.sputn(&szBuf, dwIncommingReadSize);
            printf("Reading from port \n");
        }
        else{
        //Handle Error Condition
        }
        printf("Reading data from port \n");
    } while(dwIncommingReadSize > 0);
}
else
{
        //Handle Error Condition
}

彼らはwhile条件(while(dwIncommingReadSize> 0);にDWORDdwIncommingReadSizeを使用しました。

この条件がどのように満たされているか説明してください。そのための変更は見られません。

もう一度、次の部分を説明してください。

if(dwIncommingReadSize > 0)
{
    dwSize += dwIncommingReadSize;
    sb.sputn(&szBuf, dwIncommingReadSize);
    printf("Reading from port \n");
 }
4

1 に答える 1

2

この行:

if(ReadFile(hSerial, &szBuf, 1, &dwIncommingReadSize, NULL)

のアドレス(スペルが間違っている可能性があります)を関数に渡してdwIncommingReadSize、関数が必要なものに変更できるようにします。

これは次のようなものです。

void fn (int *x) { *x = 42; }
:
int xyzzy = 1;
fn (&xyzzy);
// Here, xyzzy is now 42.

2番目の質問に関しては、コードを詳しく表示せずに判断するのは少し難しいですが、読み込まれたデータの各ブロック(およびsb.sputn実行するはずのデータ)の「合計サイズ」変数を単純に増やしているようです。

これは、1回の読み取りで必要なすべてのデータを取得できない場合によく発生します。取得したデータを保存してから、戻ってさらにデータを取得するだけです。

于 2012-05-11T06:55:13.690 に答える