1

Visual C++ でシリアル ポートにアクセスするプログラムを作成しています。コードを以下に示します。

#include "stdafx.h"
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <commdlg.h>

int nread,nwrite;


void main()
{

 COMMTIMEOUTS timeouts;
 COMMCONFIG dcbSerialParams;
 char *words,*buffRead, *buffWrite;
 DWORD dwBytesWritten,dwBytesRead;



 HANDLE hSerial= CreateFile(L"COM1", GENERIC_READ | GENERIC_WRITE,
                       0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
 if ( hSerial == INVALID_HANDLE_VALUE) 
 {
 if (GetLastError() == ERROR_FILE_NOT_FOUND)
 {
 printf(" serial port does not exist \n");
 }
 printf(" some other error occured. Inform user.\n");
 }


 //DCB   dcbSerialParams ;
 //GetCommState( hSerial, &dcbSerialParams.dcb);
 if (!GetCommState(hSerial, &dcbSerialParams.dcb)) 
 {
 printf("error getting state \n");
 }

 dcbSerialParams.dcb.DCBlength = sizeof(dcbSerialParams.dcb);


 dcbSerialParams.dcb.BaudRate = CBR_1200;
 dcbSerialParams.dcb.ByteSize = 8;
 dcbSerialParams.dcb.StopBits = ONESTOPBIT;
 dcbSerialParams.dcb.Parity = NOPARITY;

 dcbSerialParams.dcb.fBinary = TRUE;
 dcbSerialParams.dcb.fDtrControl = DTR_CONTROL_DISABLE;
 dcbSerialParams.dcb.fRtsControl = RTS_CONTROL_DISABLE;
 dcbSerialParams.dcb.fOutxCtsFlow = FALSE;
 dcbSerialParams.dcb.fOutxDsrFlow = FALSE;
 dcbSerialParams.dcb.fDsrSensitivity= FALSE;
 dcbSerialParams.dcb.fAbortOnError = TRUE;


if (!SetCommState(hSerial, &dcbSerialParams.dcb)) 
{
printf(" error setting serial port state \n");
}


GetCommTimeouts(hSerial,&timeouts);

timeouts.ReadIntervalTimeout = 1000;
timeouts.ReadTotalTimeoutConstant = 1000;
timeouts.ReadTotalTimeoutMultiplier = 1000;
timeouts.WriteTotalTimeoutConstant = 1000;
timeouts.WriteTotalTimeoutMultiplier= 1000;

if(!SetCommTimeouts(hSerial, &timeouts)) 
{
printf("error setting port state \n");
}


//****************Write Operation*********************//
words = "B";
nwrite = strlen(words);

buffWrite = words;
dwBytesWritten = 0;

if (!WriteFile(hSerial, buffWrite, nwrite, &dwBytesWritten, NULL)) 
{ 
printf("error writing to output buffer \n");
}
printf("Data written to write buffer is\n %s \n",buffWrite);





//***************Read Operation******************//
buffRead = 0;
dwBytesRead = 0;
nread = strlen(words);

if (!ReadFile(hSerial, buffRead, nread, &dwBytesRead, NULL)) 
{
printf("error reading from input buffer \n");
}
printf("Data read from read buffer is \n %s \n",buffRead);

CloseHandle(hSerial);

}

上記のプログラムは、書き込み操作中(つまり、シリアル ポートにデータを書き込み中) は正常に動作しますが、読み取り操作中はシリアル ポートからデータを読み取っていません。

私はコンソールウィンドウに出力を取得しています:-

Data written to write buffer is
B
error reading from input buffer
Data read from read buffer is
<null>

どこが間違っているのか、どうすれば解決できるのか知りたいです。

4

1 に答える 1

3

2番目のReadFileパラメーターをNULLにすることはできません。これは、いくつかのバッファへの有効なポインタである必要があります。次に例を示します。

dwBytesRead = 0;
nread = strlen(words);
buffRead = new char[nread + 1];
memset(buffRead, 0, nread+1];   // ensure that string will be null-terminated

if (!ReadFile(hSerial, buffRead, nread, &dwBytesRead, NULL)) 
{
    printf("error reading from input buffer \n");
}

...
delete[] buffRead;
于 2013-02-28T08:30:26.250 に答える