3

writefile関数と関数を使用して、シリアル ポート接続で文字列を送受信しようとしていreadfileます。読み取るバイト数は常に異なり、readfile正しいバイト数を取得するまでハングまたはブロックするため、これを非同期で行う必要があります。これを非同期で実行しようとするwritefileと、関数はデータを送信せずreadfile、次の行が文字を読み取らずに処理を開始するため、関数がスキップされたように見えます。オーバーラップ構造の問題なのか、タイムアウトの問題なのかわかりません。しかし、私はこの瞬間に立ち往生しています。

タイムアウト

void Serial::OpenPortRead()
{
HANDLE sSerial =  CreateFile(L"COM3",GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);
//Timeout Settings
COMMTIMEOUTS    CommTimeouts;   
GetCommTimeouts(sSerial, &CommTimeouts);
CommTimeouts.ReadIntervalTimeout            = 5000; 
    CommTimeouts.ReadTotalTimeoutMultiplier     = 2; 
    CommTimeouts.ReadTotalTimeoutConstant       = 10; 
    CommTimeouts.WriteTotalTimeoutMultiplier    = 50; 
    CommTimeouts.WriteTotalTimeoutConstant      = 500; 

//Port Settings
DCB dcbSerialParams = {0};
dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
dcbSerialParams.BaudRate=CBR_19200;
dcbSerialParams.ByteSize=8;
dcbSerialParams.StopBits=ONESTOPBIT;
dcbSerialParams.Parity=NOPARITY;

SetCommState(sSerial,&dcbSerialParams);//Apply Settings to Handle




}

ファイル書き込み機能

void Serial::WritePort(CString buffer)
{


DWORD bytes;//pointer to hold number of bytes written
USES_CONVERSION;
CW2A buf((LPCWSTR)buffer);//Convert unicode to ascii



OpenPortRead();
OVERLAPPED overlapped_structure;
memset(&overlapped_structure, 0, sizeof(overlapped_structure));
overlapped_structure.Offset = 0;
overlapped_structure.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

WriteFile(sSerial, buf,strlen(buf),&bytes,&overlapped_structure);//Send string


}

ファイル読み込み機能

int Serial::ReadPort(CString buf){

OpenPortRead();// Open Serial Communication for reading

const int buffer_size = 10;
 char buffer[10];//buffer to hold recieved string

memset (buffer, 0, buffer_size * sizeof (char));
int n, num,iTemp,i=0;
OVERLAPPED overlapped_structure;
memset(&overlapped_structure, 0, sizeof(overlapped_structure));
overlapped_structure.Offset = 0;
overlapped_structure.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

DWORD bytesRead;//pointer to number bytes read


ReadFile(sSerial,&buffer,buffer_size,&bytesRead,&overlapped_structure);// begin read



//Used this function because return would be filled with extra raw data characters
buffer[n] = StringLength(buffer, &n);//find length of string returned
num = n;
4

1 に答える 1

2

MSDN には、シリアル ポート通信でオーバーラップ I/O を使用する方法に関する詳細情報が含まれています。

シリアル通信

于 2013-02-15T21:16:49.657 に答える