Return to Snippet

Revision: 43273
at March 20, 2011 13:50 by liouys


Initial Code
#include <iostream>
#include <windows.h>
#include <assert.h>

using namespace std;

HANDLE g_hCom = INVALID_HANDLE_VALUE;
const unsigned MAX_BUF_LEN = 32;
const char* const g_pData = "hello";


DWORD WINAPI ThreadRead( LPVOID lpParameter )
{
	char szBuf[ MAX_BUF_LEN ] = { 0 };
	DWORD dwRead;
	OVERLAPPED ov;
	memset( &ov, 0, sizeof( ov ) );
	ov.hEvent = CreateEvent( NULL, TRUE, TRUE, NULL );
	assert( ov.hEvent );

	if( !ReadFile( g_hCom, szBuf, strlen( g_pData ), &dwRead, &ov ) )
	{
		if( GetLastError() != ERROR_IO_PENDING )
		{
			cout << "Read com failed." << endl;
			return 0;
		}
		WaitForSingleObject( ov.hEvent, INFINITE );
		GetOverlappedResult( g_hCom, &ov, &dwRead, TRUE );
	}
	if( dwRead != strlen( g_pData ) )
	{
		cout << "Failed to get all the data." << endl;
		return 0;
	}
	cout << "Read: " << szBuf << endl;
	return 1;
}


int main()
{
	g_hCom = CreateFile( "com1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL );
	assert( g_hCom != INVALID_HANDLE_VALUE );

	HANDLE hThread = CreateThread( NULL, 0, ThreadRead, NULL, 0, NULL );
	assert( hThread );

	Sleep( 100 );

	DWORD dwWritten;
	OVERLAPPED ov;
	memset( &ov, 0, sizeof( ov ) );
	ov.hEvent = CreateEvent( NULL, TRUE, TRUE, NULL );
	assert( ov.hEvent );

	if( !WriteFile( g_hCom, g_pData, strlen( g_pData ), &dwWritten, &ov ) )
	{
		if( GetLastError() != ERROR_IO_PENDING )
		{
			cout << "Write com failed." << endl;
			return 0;
		}
		WaitForSingleObject( ov.hEvent, INFINITE );
		GetOverlappedResult( g_hCom, &ov, &dwWritten, TRUE );
	}
	if( dwWritten != strlen( g_pData ) )
	{
		cout << "Failed to write all the data." << endl;
		return 0;
	}
	cout << "Write: " << g_pData << endl;

	Sleep( 100 );
	return 1;
}

Initial URL


Initial Description


Initial Title
windows下串口通信同步与异步方式

Initial Tags
windows

Initial Language
C