<style id="7i3y3"></style>

      <sub id="7i3y3"><i id="7i3y3"></i></sub>

        午夜精品一区二区三区成人,中文字幕av一区二区,亚洲AVAV天堂AV在线网阿V,肥臀浪妇太爽了快点再快点,国产网友愉拍精品视频手机,国产精品无码a∨麻豆,久久中文字幕一区二区,a级国产乱理伦片在线观看al

         用 VC 在win95下編寫用于串行通訊的程序


        源自http://www.sixthnet.com/netech/articles/195.htm

        頭文件(.H)

        #include "StdAfx.h"

        #define GWL_PGPSINFO 0
        #define GPSEXTRABYTES sizeof( LONG )

        #define MAXPORTS 4

        #define CN_SEND WM_USER+100

        #define RXQUEUE 4096
        #define TXQUEUE 4096

        // cursor states

        #define CS_HIDE 0x00
        #define CS_SHOW 0x01

        // Flow control flags

        #define FC_DTRDSR 0x01
        #define FC_RTSCTS 0x02
        #define FC_XONXOFF 0x04

        // ascii definitions

        #define ASCII_BEL 0x07
        #define ASCII_BS 0x08
        #define ASCII_LF 0x0A
        #define ASCII_CR 0x0D
        #define ASCII_XON 0x11
        #define ASCII_XOFF 0x13

        // data structures

        typedef struct tagGPSINFO
        {
        HANDLE idComDev;
        BYTE bPort;
        BOOL fConnected;
        BYTE bByteSize,bParity,bStopBits;
        DWORD dwBaudRate;

        HANDLE hPostEvent,hWatchThread,hWatchEvent;
        HWND hTermWnd;
        DWORD dwThreadID;
        OVERLAPPED osWrite,osRead;
        } GPSINFO, *PGPSINFO ;

        #define COMDEV( x ) (x -> idComDev)
        #define PORT( x ) (x -> bPort)
        #define CONNECTED( x ) (x -> fConnected)
        #define BYTESIZE( x ) (x -> bByteSize)
        #define PARITY( x ) (x -> bParity)
        #define STOPBITS( x ) (x -> bStopBits)
        #define BAUDRATE( x ) (x -> dwBaudRate)

        #define POSTEVENT( x ) (x -> hPostEvent)
        #define HTHREAD( x ) (x -> hWatchThread)
        #define THREADID( x ) (x -> dwThreadID)
        #define WRITE_OS( x ) (x -> osWrite)
        #define READ_OS( x ) (x -> osRead)

        // function prototypes (private)

        LRESULT NEAR CreateGPSInfo(HWND,BYTE nPort=1);
        BOOL NEAR DestroyGPSInfo();

        int NEAR ReadCommBlock(LPSTR,int);
        BOOL NEAR WriteCommBlock(LPSTR,DWORD);
        BOOL NEAR OpenConnection();
        BOOL NEAR SetupConnection();
        BOOL NEAR CloseConnection();

        // function prototypes (public)

        DWORD FAR PASCAL CommWatchProc(LPSTR);
        CPP實現(xiàn)部分:

        #include "StdAfx.h"
        #include "Com.h"

        HWND hGPSWnd=NULL;
        PGPSINFO npGPSInfo=NULL;

        LRESULT NEAR CreateGPSInfo(HWND hWnd,BYTE nPort)
        {
        if (NULL==(npGPSInfo=(PGPSINFO)LocalAlloc(LPTR,sizeof(GPSINFO))))
        return ((LRESULT)-1) ;

        hGPSWnd=hWnd;

        COMDEV(npGPSInfo)=0;
        CONNECTED(npGPSInfo)=FALSE;
        PORT(npGPSInfo)=nPort;
        BAUDRATE(npGPSInfo)=CBR_9600;
        BYTESIZE(npGPSInfo)=8;
        PARITY(npGPSInfo)=NOPARITY;
        STOPBITS(npGPSInfo)=ONESTOPBIT;

        WRITE_OS(npGPSInfo).Offset=0;
        WRITE_OS(npGPSInfo).OffsetHigh=0;
        READ_OS(npGPSInfo).Offset=0;
        READ_OS(npGPSInfo).OffsetHigh=0;

        // create I/O event used for overlapped reads / writes

        READ_OS(npGPSInfo).hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
        if (READ_OS(npGPSInfo).hEvent==NULL)
        { LocalFree( npGPSInfo ) ;
        return ( -1 ) ;
        }
        WRITE_OS(npGPSInfo).hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
        if (NULL==WRITE_OS(npGPSInfo).hEvent)
        { CloseHandle(READ_OS(npGPSInfo).hEvent);
        LocalFree(npGPSInfo) ;
        return (-1) ;
        }

        return ( (LRESULT) TRUE ) ;
        }

        BOOL NEAR DestroyGPSInfo()
        {
        if (!npGPSInfo) return (FALSE);

        if (CONNECTED(npGPSInfo)) CloseConnection();

        CloseHandle(READ_OS(npGPSInfo).hEvent);
        CloseHandle(WRITE_OS(npGPSInfo).hEvent);
        CloseHandle(POSTEVENT(npGPSInfo));

        LocalFree(npGPSInfo);
        return (TRUE);
        }

        BOOL NEAR OpenConnection()
        {
        char szPort[15];
        BOOL fRetVal;
        HCURSOR hOldCursor,hWaitCursor;

        HANDLE hCommWatchThread;
        DWORD dwThreadID;
        COMMTIMEOUTS CommTimeOuts;

        if (!npGPSInfo) return (FALSE);

        hWaitCursor=LoadCursor(NULL,IDC_WAIT) ;
        hOldCursor=SetCursor(hWaitCursor) ;

        wsprintf(szPort,"COM%d",PORT(npGPSInfo));

        if ((COMDEV(npGPSInfo)=CreateFile(szPort,GENERIC_READ|GENERIC_WRITE,
        0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
        NULL))==(HANDLE)-1)
        return ( FALSE ) ;
        else
        { SetCommMask(COMDEV(npGPSInfo),EV_RXCHAR);
        SetupComm(COMDEV(npGPSInfo),4096,4096);
        PurgeComm(COMDEV(npGPSInfo),PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
        CommTimeOuts.ReadIntervalTimeout=0xFFFFFFFF;
        CommTimeOuts.ReadTotalTimeoutMultiplier=0;
        CommTimeOuts.ReadTotalTimeoutConstant=1000;
        CommTimeOuts.WriteTotalTimeoutMultiplier=0;
        CommTimeOuts.WriteTotalTimeoutConstant=1000;
        SetCommTimeouts(COMDEV(npGPSInfo),&CommTimeOuts);
        }

        fRetVal=SetupConnection();

        if (fRetVal)
        { CONNECTED(npGPSInfo)=TRUE;
        if (NULL==(hCommWatchThread=CreateThread((LPSECURITY_ATTRIBUTES)NULL,
        0,(LPTHREAD_START_ROUTINE)CommWatchProc,
        (LPVOID)NULL,0,&dwThreadID)))
        { CONNECTED(npGPSInfo)=FALSE;
        CloseHandle(COMDEV(npGPSInfo));
        fRetVal=FALSE;
        }
        else
        { THREADID(npGPSInfo)=dwThreadID;
        HTHREAD(npGPSInfo)=hCommWatchThread;
        EscapeCommFunction(COMDEV(npGPSInfo),SETDTR);
        }
        }
        else
        { CONNECTED(npGPSInfo)=FALSE;
        CloseHandle(COMDEV(npGPSInfo));
        }

        SetCursor(hOldCursor);
        return (fRetVal);
        }

        BOOL NEAR SetupConnection()
        { BOOL fRetVal;
        DCB dcb;

        if (!npGPSInfo) return(FALSE);

        dcb.DCBlength=sizeof(DCB);

        GetCommState(COMDEV(npGPSInfo),&dcb);

        dcb.BaudRate=BAUDRATE(npGPSInfo);
        dcb.ByteSize=BYTESIZE(npGPSInfo);
        dcb.Parity=PARITY(npGPSInfo);
        dcb.StopBits=STOPBITS(npGPSInfo);

        dcb.fOutxDsrFlow=FALSE;
        dcb.fDtrControl=DTR_CONTROL_ENABLE;

        dcb.fOutxCtsFlow=FALSE;
        dcb.fRtsControl=RTS_CONTROL_ENABLE;
        dcb.fInX=dcb.fOutX=FALSE;
        dcb.fBinary=TRUE;
        dcb.fParity=TRUE;

        fRetVal=SetCommState(COMDEV(npGPSInfo),&dcb);
        return (fRetVal);
        }

        BOOL NEAR CloseConnection()
        {
        if (!npGPSInfo) return(FALSE);

        CONNECTED(npGPSInfo)=FALSE;

        SetCommMask(COMDEV(npGPSInfo),0);
        while(THREADID(npGPSInfo)!=0);

        EscapeCommFunction(COMDEV(npGPSInfo),CLRDTR);
        PurgeComm(COMDEV(npGPSInfo),PURGE_TXABORT|PURGE_RXABORT|
        PURGE_TXCLEAR|PURGE_RXCLEAR);
        CloseHandle(COMDEV(npGPSInfo));

        return (TRUE);
        }

        int NEAR ReadCommBlock(LPSTR lpszBlock,int nMaxLength)
        {
        BOOL fReadStat ;
        COMSTAT ComStat ;
        DWORD dwErrorFlags;
        DWORD dwLength;
        DWORD dwError;

        if (!npGPSInfo) return(FALSE);

        ClearCommError(COMDEV(npGPSInfo),&dwErrorFlags,&ComStat);
        dwLength=min((DWORD)nMaxLength,ComStat.cbInQue);

        if (dwLength>0)
        { fReadStat=ReadFile(COMDEV(npGPSInfo),lpszBlock,
        dwLength,&dwLength,&READ_OS(npGPSInfo));
        if (!fReadStat)
        { if (GetLastError()==ERROR_IO_PENDING)
        { OutputDebugString("\n\rIO Pending");
        while(!GetOverlappedResult(COMDEV(npGPSInfo),&READ_OS(npGPSInfo),&dwLength,TRUE))
        { dwError=GetLastError();
        if(dwError == ERROR_IO_INCOMPLETE) continue;
        }

        }
        else
        { dwLength=0;
        ClearCommError(COMDEV(npGPSInfo),&dwErrorFlags,&ComStat);
        }
        }
        }
        return ( dwLength ) ;
        }

        BOOL NEAR WriteCommBlock(LPSTR lpByte,DWORD dwBytesToWrite)
        { BOOL fWriteStat;
        DWORD dwBytesWritten;
        DWORD dwErrorFlags;
        DWORD dwError;
        COMSTAT ComStat;

        if (!npGPSInfo) return(FALSE);

        fWriteStat=WriteFile(COMDEV(npGPSInfo),lpByte,dwBytesToWrite,
        &dwBytesWritten,&WRITE_OS(npGPSInfo));

        if (!fWriteStat)
        { if(GetLastError()==ERROR_IO_PENDING)
        { while(!GetOverlappedResult(COMDEV(npGPSInfo),
        &WRITE_OS(npGPSInfo),&dwBytesWritten,TRUE))
        { dwError=GetLastError();
        if(dwError == ERROR_IO_INCOMPLETE) continue;
        else
        { ClearCommError(COMDEV(npGPSInfo),&dwErrorFlags,&ComStat);
        break;
        }
        }
        }
        else
        { ClearCommError(COMDEV(npGPSInfo),&dwErrorFlags,&ComStat);
        return ( FALSE );
        }
        }
        return ( TRUE ) ;

        }

        DWORD FAR PASCAL CommWatchProc(LPSTR)
        { DWORD dwEvtMask;
        OVERLAPPED os;
        int nLength;
        BYTE abIn[1024];

        memset(&os,0,sizeof(OVERLAPPED));

        // create I/O event used for overlapped read

        os.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
        if (os.hEvent==NULL)
        { MessageBox(NULL,"Failed to create event for thread!","GPS Error!",MB_ICONEXCLAMATION|MB_OK);
        return ( FALSE ) ;
        }

        if (!SetCommMask(COMDEV(npGPSInfo),EV_RXCHAR)) return (FALSE);

        while (CONNECTED( npGPSInfo))
        { dwEvtMask=0 ;
        WaitCommEvent(COMDEV(npGPSInfo),&dwEvtMask,NULL);

        if ((dwEvtMask&EV_RXCHAR)==EV_RXCHAR)
        { do
        { if (nLength=ReadCommBlock((LPSTR)abIn,1024))
        { //WriteCommBlock((LPSTR)abIn,nLength );
        *(abIn+nLength)=0;
        ::SendMessage(hGPSWnd,CN_SEND,nLength,(LONG)(LPSTR)abIn);
        }
        }
        while ((nLength>0)&&(CONNECTED( npGPSInfo)));
        }
        }

        CloseHandle(os.hEvent);
        THREADID(npGPSInfo)=0;
        HTHREAD(npGPSInfo)=NULL;
        return(TRUE);
        }
        一般使用的順序是:
        CreateGPSInfo(被通知的窗口句柄,串口端口號1或2);
        OpenConnection();//建立聯(lián)結(jié)它會調(diào)用SetupConnection
        DestroyGPSInfo();//解除聯(lián)結(jié)它會調(diào)用CloseConnection

        可以用ReadCommBlock/WriteCommBlock來讀/寫串口
        CommWatchProc是監(jiān)視串口的線程,由OpenConnection建立

        當串口有數(shù)據(jù)來的時侯,它會通知'被通知的窗口句柄'的窗口數(shù)據(jù)傳到的消息(自定義的)
        ∶:SendMessage(hGPSWnd,CN_SEND,nLength,(LONG)(LPSTR)abIn);
        (2001-8-3 23:57:38)

        主站蜘蛛池模板: 老汉色老汉首页a亚洲| 永久免费av无码网站直播| 少妇人妻偷人免费观看| 欧美激情视频一区二区三区免费| 国产精品久久久久鬼色| 97视频精品全国在线观看| 国产亚洲精品福利片| 色色97| 欧美亚洲另类自拍偷在线拍| 一级片黄色一区二区三区| 99久久精品国产一区二区蜜芽| 国产综合欧美| 老司机精品一区在线视频| 亚洲av理论在线电影网| 国产日韩综合av在线| 色吊a中文字幕一二三区| 人妻在线无码一区二区三区| 久久人人妻人人爽人人爽| 深夜宅男福利免费在线观看| 妓女妓女一区二区三区在线观看| 精品亚洲国产成人av| 日韩在线视频观看免费网站| 国精品午夜福利视频不卡| 亚洲欧美日韩国产国产a| 亚洲国产一成人久久精品| 中文字幕亚洲人妻系列| 精品久久久久国产免费| 亚洲AV无码国产精品夜色午夜 | 亚洲三级香港三级久久| 成人国产精品一区二区不卡| 99热精品毛片全部国产无缓冲| 亚洲av网一区天堂福利| 猛男被狂c躁到高潮失禁男男小说| 成全我在线观看免费第二季| 亚洲激情在线一区二区三区| 日韩人妻系列无码专区| 国产精品中文字幕久久| 久久91精品国产一区二区| 亚洲经典av一区二区| 中国熟女仑乱hd| 日韩人妻无码一区二区三区|