2012年4月26日 星期四

WIN32 API 通訊操作 - (5) 關閉串口

(5) 關閉串口

利用API函數關閉串口非常簡單,只需使用CreateFile函數返回的控制碼作為參數調用CloseHandle即可:
BOOL CloseHandle( HANDLE hObject );   //關閉handle 

實例
CString fport;
HANDLE hCom;

//開啟COM1
fport = _T("\\\\.\\COM1");    
hCom= CreateFile(fport, GENERIC_READ|GENERIC_WRITE, 0,
                 NULL,  OPEN_EXISTING, 0, NULL);

if(hCom==INVALID_HANDLE_VALUE)
{
    fport = fport + _T(" CAN NOT OPEN HANDLE!");
    AfxMessageBox(fport);
}

DCB dcb;

dcb.fDtrControl = DTR_CONTROL_ENABLE;
GetCommState(hCom,&dcb);
SetupComm(hCom, 1600, 1600);

COMMTIMEOUTS TimeOuts;
TimeOuts.ReadIntervalTimeout = 0;
TimeOuts.ReadTotalTimeoutMultiplier = 0;
TimeOuts.ReadTotalTimeoutConstant = 50;
TimeOuts.WriteTotalTimeoutMultiplier = 5 ;
TimeOuts.WriteTotalTimeoutConstant = 50 ;
SetCommTimeouts(hCom,&TimeOuts);

SetCommMask(hCom, 0);
SetCommMask(hCom, EV_RXCHAR);

dcb.BaudRate=115200;        //波特率為115200
dcb.ByteSize=8;             //每字節有8位
dcb.Parity=NOPARITY;        //無奇偶校驗位
dcb.StopBits=ONESTOPBIT ;   //一個停止位
SetCommState(hCom,&dcb);

PurgeComm(hCom, PURGE_TXABORT | PURGE_RXABORT |
                PURGE_TXCLEAR | PURGE_RXCLEAR);

//看是要讀還是要寫
DWORD dcount = 100;
char buf[1024];
char temp_buf[1024];
while(1)
{
    BOOL bWriteStat;
    
    //寫資料至ComPort
    bWriteStat = ::WriteFile(hCom, buf, dcount, &dcount, NULL);

    //從ComPort讀資料
    bWriteStat = ::ReadFile(hCom, temp_buf, 1024, &dcount, NULL);

    //如果讀寫失敗
    if(!bWriteStat)
    {
        AfxMessageBox(_T("FAIL!"));
        break;
    }
}

CloseHandle( HANDLE hCom);

最後附上這一系列的reference: Win32串口编程

沒有留言:

張貼留言