這次終於成功寫出來簡易console版本

有實際上跟設備連接側試過

編譯工具:Dev-C++

註解沒有,詳情請洽MSDN!

別人都只講長篇大論,至少我還有一個可以用的完整可以看。

#include <iostream>
#include <windows.h>
#include <conio.h>
using namespace std;
DWORD WINAPI ReadProc(LPVOID);
HANDLE      hCom;
OVERLAPPED osRead = {0}, osWrite = {0};
int main(void)
{
    HANDLE       ReadThread;
    DWORD        dwError,dw;
    DCB          PortDCB;
    COMMTIMEOUTS TimeOuts;
	char		 ComName[15];
	int			 PortNum = 1;
	PortNum > 9 ? sprintf(ComName, "\\\\.\\COM%d", PortNum) : sprintf(ComName, "COM%d", PortNum);
    hCom=CreateFile(ComName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,
                    FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
 
    if(hCom == INVALID_HANDLE_VALUE)
    {
        dwError=GetLastError( );
        cout << "Get Error: " << dwError;
        cout << "\n      Create COM1 failed\n";
        return 0;
    }
 
    if ( !SetupComm( hCom, 1024, 128 ) )
    {
        dwError=GetLastError( );
        cout << "Get Error: " << dwError;
        cout << "\n      Set Comm buffer failed\n";
        return 0;
    }
     
    TimeOuts.ReadIntervalTimeout=MAXDWORD;
    TimeOuts.ReadTotalTimeoutMultiplier=0;
    TimeOuts.ReadTotalTimeoutConstant=0;
    TimeOuts.WriteTotalTimeoutMultiplier=10;
    TimeOuts.WriteTotalTimeoutConstant=1000;
     
    if( !SetCommTimeouts(hCom, &TimeOuts) )
    {
        dwError = GetLastError( );
        cout << "Get Error: " << dwError;
        cout << "\n      Set Timeout failed\n";
        return 0;
    }
 
    GetCommState(hCom, &PortDCB);
     
    PortDCB.BaudRate = CBR_115200;
    PortDCB.ByteSize = 8;
    PortDCB.Parity = NOPARITY;
    PortDCB.StopBits = ONESTOPBIT;
     
    if( !SetCommState(hCom, &PortDCB) )
    {
        dwError = GetLastError( );
        cout << "Get Error: " << dwError;
        cout << "\n      Set DCB failed\n";
        return 0;
    }
     
    if ( !SetCommMask(hCom, EV_RXCHAR) )
    {
            dwError = GetLastError( );
            cout << "Get Error: " << dwError;
            cout << "\n      SetCommMask failed\n";
            return 0;
    }
    osRead.hEvent = CreateEvent(NULL, true, false, NULL);
    if ( osRead.hEvent == NULL )
    {
        dwError = GetLastError( );
        cout << "Get Error: " << dwError;
        cout << "\n      Create Read Event failed\n";
        return 0;
    }
    osWrite.hEvent = CreateEvent(NULL, true, false, NULL);
    if ( osWrite.hEvent == NULL )
    {
        dwError = GetLastError( );
        cout << "Get Error: " << dwError;
        cout << "\n      Create Write Event failed\n";
        return 0;
    }
     
    ReadThread = CreateThread(NULL, 0, ReadProc, NULL, 0, &dw);
     
    while(1)
    {
        char output;
        DWORD dwWrite;
        dwWrite = 1;
        fflush(stdin);
        output = getch();
        if ( output == VK_ESCAPE )
            break;
        if (!WriteFile(hCom, &output, 1, &dwWrite, &osWrite))
        {
            //cout << "Write Error" << endl;
            //break;
        }
    }
    CloseHandle(ReadThread);
    CloseHandle(hCom);
    return 0;
}
 
DWORD WINAPI ReadProc(LPVOID lpParam)
{
    char      Byte;
    DWORD     CommEvent, dwByte, dwE;
     
    while(1)
    {
        // Wait for an event to occur for the port.
        if( WaitCommEvent(hCom, &CommEvent, NULL) )
        {
            do
            {
                if ( ReadFile(hCom, &Byte, 1, &dwByte, &osRead) )
                    if( dwByte > 0 )
                        cout << Byte;
            } while (dwByte);
        }
    }
    return 0;
}