• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    Window 95串口通訊函數集合

    發布: 2007-7-14 21:11 | 作者: 佚名    | 來源: 網絡轉載     | 查看: 30次 | 進入軟件測試論壇討論

    領測軟件測試網 需要說明的是:這是程序的一部分,因此有一些與具體應用無關的部分。
    關鍵是原理,而不是程序本身.后面有些使用介紹,幫助理解這長的程序。

    頭文件(.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);



    具體實現請看下文(為了這文章,我都段線2次了)

    CPP實現部分:

    #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_R
    XCLEAR);
    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),&dwLe

    ngth,TR
    UE))
    UE))
    { 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();//建立聯結它會調用SetupConnection
    DestroyGPSInfo();//解除聯結它會調用CloseConnection

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


    當串口有數據來的時侯,它會通知'被通知的窗口句柄'的窗口數據傳到的消息(自

    定義的)
    SendMessage(hGPSWnd,CN_SEND,nLength,(LONG)(LPSTR)abIn);

    好了,文章結束了!希望能幫助你! 

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>