青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

山寨:不是最好的,是最適合我們的!歡迎體驗(yàn)山寨 中文版MSDN

Blog @ Blog

當(dāng)華美的葉片落盡,生命的脈絡(luò)才歷歷可見(jiàn)。 -- 聶魯達(dá)

常用鏈接

統(tǒng)計(jì)

積分與排名

BBS

Blog

Web

最新評(píng)論

簡(jiǎn)單封裝的串口通信類(lèi)

#include "stdafx.h"
#include 
"SerialPort.h"

#include 
"assert.h"

CSerialPort::CSerialPort()
{
    memset(
&m_OverlappedRead, 0sizeof(m_OverlappedRead));
    memset(
&m_OverlappedWrite, 0sizeof(m_OverlappedWrite));
    m_bOpened 
= false;
    m_ReadComThread 
= NULL;
    m_hIDCom 
= NULL;
    m_dwReadLen 
= 0;
}

CSerialPort::
~CSerialPort()
{

}

BOOL CSerialPort::OpenPort(UINT nPort, UINT nBaud)
{
    ASSERT(nPort 
> 0 && nPort < 5);  
    
if(m_bOpened)
        
return true;
    
    TCHAR szPort[
15];
    TCHAR szComParams[
50];
    DCB dcb;

    wsprintf(szPort, _T(
"COM%d"), nPort);
    m_hIDCom 
= ::CreateFile(szPort, 
        GENERIC_READ 
| GENERIC_WRITE, 
        
0
        NULL,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL 
| FILE_FLAG_OVERLAPPED,
        NULL);
    
if(m_hIDCom == NULL)
        
return false;

    memset(
&m_OverlappedRead, 0sizeof(OVERLAPPED));
    memset(
&m_OverlappedWrite, 0sizeof(OVERLAPPED));

    COMMTIMEOUTS CommTimeOuts;
    CommTimeOuts.ReadIntervalTimeout 
= 0xFFFFFFFF;
    CommTimeOuts.ReadTotalTimeoutConstant 
= 0;
    CommTimeOuts.ReadTotalTimeoutMultiplier 
= 0;
    CommTimeOuts.WriteTotalTimeoutMultiplier 
= 0;
    CommTimeOuts.WriteTotalTimeoutConstant 
= 5000;
    ::SetCommTimeouts(m_hIDCom, 
&CommTimeOuts);

    wsprintf(szComParams, _T(
"COM%d:%d,N,8,1"), nPort, nBaud);
    m_OverlappedRead.Offset 
= 0;
    m_OverlappedRead.OffsetHigh 
= 0;
    m_OverlappedRead.hEvent 
= ::CreateEvent(NULL, truefalse, NULL);
    m_OverlappedWrite.Offset 
= 0;
    m_OverlappedWrite.OffsetHigh 
= 0;
    m_OverlappedWrite.hEvent 
= ::CreateEvent(NULL, truefalse, NULL);

    dcb.DCBlength 
= sizeof(DCB);
    ::GetCommState(m_hIDCom, 
&dcb);
    dcb.BaudRate 
= nBaud;
    dcb.ByteSize 
= 8;
    dcb.Parity 
= 0;

    
if(!SetCommState(m_hIDCom, &dcb) || !SetupComm(m_hIDCom, 40964096||
        m_OverlappedRead.hEvent 
== NULL || m_OverlappedWrite.hEvent == NULL)
    {
        DWORD dwError 
= ::GetLastError();
        
if(m_OverlappedRead.hEvent != NULL)
            ::CloseHandle(m_OverlappedRead.hEvent);
        
if(m_OverlappedWrite.hEvent != NULL)
            ::CloseHandle(m_OverlappedWrite.hEvent);
        ::CloseHandle(m_hIDCom);
        
return false;
    }
    ::SetCommMask(m_hIDCom, EV_RXCHAR);
    ::PurgeComm(m_hIDCom, PURGE_TXABORT 
| PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
    ::EscapeCommFunction(m_hIDCom, SETDTR);

    m_bOpened 
=true;
    m_bExitThread 
=false;

    StartMonitoring();
    
return m_bOpened;
}

BOOL CSerialPort::Close()
{
    
if(!m_bOpened || m_hIDCom == NULL)
        
return true;
    m_bExitThread 
= true;
    ::SetCommMask(m_hIDCom, 
0);
    StopMonitoring();
    
    
if(m_OverlappedRead.hEvent != NULL)
        ::CloseHandle(m_OverlappedRead.hEvent);

    
if(m_OverlappedWrite.hEvent != NULL)
        ::CloseHandle(m_OverlappedWrite.hEvent);

    ::CloseHandle(m_hIDCom);

    m_bOpened 
= false;
    m_hIDCom 
= NULL;

    
return true;
}


//向串口寫(xiě)數(shù)據(jù)
void CSerialPort::WriteToPort(BYTE *Byte, int Len)
{
    
if(!m_bOpened || m_hIDCom == NULL)
        
return;

    BOOL bWriteStat;
    DWORD dwBytesWritten;
    ClearReadBuf();
    bWriteStat 
= ::WriteFile(m_hIDCom, Byte, Len, &dwBytesWritten, &m_OverlappedWrite);

    
if(!bWriteStat && (::GetLastError() == ERROR_IO_PENDING))
    {
        
//WaitForSingleObject函數(shù)用來(lái)檢測(cè)hHandle事件的信號(hào)狀態(tài),當(dāng)函數(shù)的執(zhí)行時(shí)間超過(guò)dwMilliseconds就
        
//返回,但如果參數(shù)dwMilliseconds為INFINITE時(shí)函數(shù)將直到相應(yīng)時(shí)間事件變成有信號(hào)狀態(tài)才返回,
        
//否則就一直等待下去,直到WaitForSingleObject有返回直才執(zhí)行后面的代碼。
        DWORD dw = ::WaitForSingleObject(m_OverlappedWrite.hEvent, INFINITE );
        
if(dw == WAIT_TIMEOUT)
        {
            dwBytesWritten 
= 0;
            DCB dcb;
            ::GetCommState(m_hIDCom, 
&dcb);
            ::PurgeComm(m_hIDCom, PURGE_TXCLEAR);
            
return;
        }
        
else
        {
            ::GetOverlappedResult(m_hIDCom, 
&m_OverlappedWrite, &dwBytesWritten, false);//等待服務(wù)器完成IO操作
            m_OverlappedWrite.Offset += dwBytesWritten;
        }
    }
    
return ;
}


//從串口讀取數(shù)據(jù)
int CSerialPort::ReadFromPort(BYTE *lpszBlock, int nRLen)
{
    
if(!m_bOpened || m_hIDCom == NULL)
        
return 0;

    BOOL bReadStat;
    DWORD dwBytesRead, dwErrorFlags;
    COMSTAT ComStat;
    ::ClearCommError(m_hIDCom, 
&dwErrorFlags, &ComStat);
    
if(!ComStat.cbInQue)
        
return 0;

    dwBytesRead 
= (DWORD) ComStat.cbInQue;
    
if(nRLen < (int)dwBytesRead)
        dwBytesRead 
= (DWORD) nRLen;

    bReadStat 
= ::ReadFile(m_hIDCom, lpszBlock, dwBytesRead, &dwBytesRead, &m_OverlappedRead);
    
if(!bReadStat)
    {
        
if(::GetLastError() == ERROR_IO_PENDING)
        {
            ::WaitForSingleObject(m_OverlappedRead.hEvent, INFINITE);
            
return (int)dwBytesRead;
        }
        
return 0;
    }
    
return (int)dwBytesRead;
}



UINT CSerialPort::CommThread(LPVOID pParam)
{
    CSerialPort
* pSerialPort = (CSerialPort*)pParam;
    BYTE Buffer[
4096];
    DWORD dwEvent, dwError;
    COMSTAT ComStat;
    
int ReadLen = 0;
    memset(pSerialPort
->m_ReadBuf, '\0'sizeof(pSerialPort->m_ReadBuf));
    ::SetCommMask(pSerialPort
->m_hIDCom, EV_RXCHAR);
    
while(!pSerialPort->m_bExitThread)
    {
        memset(Buffer, 
'\0'4096);
        ::WaitCommEvent(pSerialPort
->m_hIDCom, &dwEvent, NULL);
        ::ClearCommError(pSerialPort
->m_hIDCom, &dwError, &ComStat);
        
if((dwEvent & EV_RXCHAR) && ComStat.cbInQue)
        {
            pSerialPort
->m_dwReadLen = pSerialPort->ReadFromPort(Buffer,4096);
            pSerialPort
->m_dwReadLen = ReadLen >4096 ? 4096 : ReadLen;
            
if(pSerialPort->m_dwReadLen > 0)
            {
                memcpy(pSerialPort
->m_ReadBuf, Buffer,pSerialPort->m_dwReadLen);
            }
        }
        ::PurgeComm(pSerialPort
->m_hIDCom, PURGE_RXCLEAR);
    }
    
return 0;
}

BOOL CSerialPort::StartMonitoring()
{
    
if(m_ReadComThread == NULL)
    {
        
if(!(m_ReadComThread = ::AfxBeginThread(CommThread, this)))
            
return false;
    }
    
return true;
}

BOOL CSerialPort::StopMonitoring()
{
    
if(m_ReadComThread != NULL)
    {
        ::TerminateThread(m_ReadComThread
->m_hThread, 0); //終結(jié)線(xiàn)程
        m_ReadComThread = NULL;
    }
    
return true;
}

void CSerialPort::ClearReadBuf()
{
    memset(m_ReadBuf, 
'\0'sizeof(m_ReadBuf));
    m_dwReadLen 
= 0;
}

posted on 2008-01-07 21:11 isabc 閱讀(2820) 評(píng)論(3)  編輯 收藏 引用 所屬分類(lèi): 分享代碼

評(píng)論

# re: 簡(jiǎn)單封裝的串口通信類(lèi) 2008-01-07 21:11 isabc

在C語(yǔ)言中格式化字符串可以使用printf
但是在WINDOWS編程設(shè)計(jì)中卻行不通了,但是卻有變通的方法
那就是用 wsprintf這個(gè)函數(shù) 它的格式如下:
wsprintf(緩沖區(qū),格式,要格式化的值);
第一個(gè)參數(shù)是字符緩沖區(qū),后面是格式字符串,wsprintf不是將格式化結(jié)果寫(xiě)到標(biāo)準(zhǔn)輸出,而是將其寫(xiě)入緩沖區(qū)中,該函數(shù)返回該字符串的長(zhǎng)度。

比如我們想通過(guò)MessageBox來(lái)輸出一個(gè)整形變量的值,可以用以下代碼實(shí)現(xiàn):

char szBuffer[100];
ing number=100;
wsprintf(szBuffer, “%d”,number);
MessgaeBox(NULL,szBrffer,TEXT(“格式化字符串”),0);

這個(gè)函數(shù)除了將內(nèi)容格式化輸出到第一個(gè)參數(shù)所提供的字符串緩沖區(qū)以外,其它功能與printf函數(shù)相同。
  回復(fù)  更多評(píng)論   

# re: 簡(jiǎn)單封裝的串口通信類(lèi) 2008-01-08 10:09 isabc

HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes,
// 指定對(duì)象的安全描述符,一般設(shè)為NULL (安全屬性結(jié)構(gòu)如下)
BOOL bManualReset, // 指定是否人工重置
BOOL bInitialState, // 返回的句柄是否可繼承
LPCTSTR lpName // 對(duì)象的名字,用于多進(jìn)程間共享對(duì)象
);
返回的為event對(duì)象的句柄
安全屬性結(jié)構(gòu)
typedef struct _SECURITY_ATTRIBUTES {
DWORD nLength;
LPVOID lpSecurityDescriptor;
BOOL bInheritHandle;
} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES;


  回復(fù)  更多評(píng)論   

# re: 簡(jiǎn)單封裝的串口通信類(lèi) 2008-01-08 16:58 isabc

查詢(xún)當(dāng)前的超時(shí)設(shè)置應(yīng)調(diào)用GetCommTimeouts函數(shù),該函數(shù)會(huì)填充一個(gè)COMMTIMEOUTS結(jié)構(gòu)。調(diào)用SetCommTimeouts可以用某一個(gè)COMMTIMEOUTS結(jié)構(gòu)的內(nèi)容來(lái)設(shè)置超時(shí)。
  讀寫(xiě)串口的超時(shí)有兩種:間隔超時(shí)和總超時(shí)。間隔超時(shí)是指在接收時(shí)兩個(gè)字符之間的最大時(shí)延。總超時(shí)是指讀寫(xiě)操作總共花費(fèi)的最大時(shí)間。寫(xiě)操作只支持總超時(shí),而讀操作兩種超時(shí)均支持。用COMMTIMEOUTS結(jié)構(gòu)可以規(guī)定讀寫(xiě)操作的超時(shí)。
COMMTIMEOUTS結(jié)構(gòu)的定義為: typedef struct _COMMTIMEOUTS {
DWORD ReadIntervalTimeout; //讀間隔超時(shí)
DWORD ReadTotalTimeoutMultiplier; //讀時(shí)間系數(shù)
DWORD ReadTotalTimeoutConstant; //讀時(shí)間常量
DWORD WriteTotalTimeoutMultiplier; // 寫(xiě)時(shí)間系數(shù)
DWORD WriteTotalTimeoutConstant; //寫(xiě)時(shí)間常量
} COMMTIMEOUTS,*LPCOMMTIMEOUTS;

COMMTIMEOUTS結(jié)構(gòu)的成員都以毫秒為單位。總超時(shí)的計(jì)算公式是:
總超時(shí)=時(shí)間系數(shù)×要求讀/寫(xiě)的字符數(shù)+時(shí)間常量
例如,要讀入10個(gè)字符,那么讀操作的總超時(shí)的計(jì)算公式為:
讀總超時(shí)=ReadTotalTimeoutMultiplier×10+ReadTotalTimeoutConstant
可以看出:間隔超時(shí)和總超時(shí)的設(shè)置是不相關(guān)的,這可以方便通信程序靈活地設(shè)置各種超時(shí)。

如果所有寫(xiě)超時(shí)參數(shù)均為0,那么就不使用寫(xiě)超時(shí)。如果ReadIntervalTimeout為0,那么就不使用讀間隔超時(shí)。如果ReadTotalTimeoutMultiplier 和 ReadTotalTimeoutConstant 都為0,則不使用讀總超時(shí)。如果讀間隔超時(shí)被設(shè)置成MAXDWORD并且讀時(shí)間系數(shù)和讀時(shí)間常量都為0,那么在讀一次輸入緩沖區(qū)的內(nèi)容后讀操作就立即返回,而不管是否讀入了要求的字符。
  在用重疊方式讀寫(xiě)串口時(shí),雖然ReadFile和WriteFile在完成操作以前就可能返回,但超時(shí)仍然是起作用的。在這種情況下,超時(shí)規(guī)定的是操作的完成時(shí)間,而不是ReadFile和WriteFile的返回時(shí)間。
配置串口的示例代碼: SetupComm(hCom,1024,1024); //輸入緩沖區(qū)和輸出緩沖區(qū)的大小都是1024

COMMTIMEOUTS TimeOuts;
//設(shè)定讀超時(shí)
TimeOuts.ReadIntervalTimeout=1000;
TimeOuts.ReadTotalTimeoutMultiplier=500;
TimeOuts.ReadTotalTimeoutConstant=5000;
//設(shè)定寫(xiě)超時(shí)
TimeOuts.WriteTotalTimeoutMultiplier=500;
TimeOuts.WriteTotalTimeoutConstant=2000;
SetCommTimeouts(hCom,&TimeOuts); //設(shè)置超時(shí)
  回復(fù)  更多評(píng)論   

廣告信息(免費(fèi)廣告聯(lián)系)

中文版MSDN:
歡迎體驗(yàn)

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲欧美国产毛片在线| 久久久久久婷| 激情综合网激情| 国产日韩一区二区三区| 亚洲国产日韩欧美在线动漫| 久久精品最新地址| 久久久久久久91| 美女精品网站| 亚洲国产综合在线| 欧美福利电影在线观看| 亚洲国产一区二区a毛片| 亚洲欧洲一区二区三区在线观看| 亚洲成色精品| 在线一区观看| 久久久久久久999| 欧美精品日韩www.p站| 欧美午夜精品久久久| 国产亚洲综合在线| 日韩午夜三级在线| 欧美一区二区三区四区夜夜大片| 麻豆freexxxx性91精品| 亚洲精品永久免费| 久久av一区二区| 欧美理论大片| 国产婷婷色综合av蜜臀av| 亚洲国产日韩在线| 性色av一区二区三区在线观看 | 欧美黄色aaaa| 国产精品亚洲а∨天堂免在线| 精品二区视频| 午夜精品久久久久久久白皮肤| 亚洲二区在线视频| 午夜伦理片一区| 欧美日韩一区国产| 亚洲私人影吧| 亚洲精品一二三| 亚洲一区国产一区| 欧美激情第三页| 欧美精品v日韩精品v韩国精品v | 欧美日韩国产不卡| 欧美精品日韩| 欧美香蕉大胸在线视频观看| 久久亚洲影院| 亚洲精品国产精品国自产观看浪潮| 亚洲天堂av在线免费观看| 欧美 日韩 国产 一区| 亚洲一区二区三区乱码aⅴ| 欧美v日韩v国产v| 国外成人在线| 欧美一区二区三区四区在线观看 | 欧美在线观看www| 亚洲精品国久久99热| 久久三级视频| 国产一区二区三区黄视频| 亚洲欧美在线高清| 在线亚洲观看| 国产精品豆花视频| 亚洲伊人一本大道中文字幕| 亚洲欧洲一区二区三区在线观看| 欧美va亚洲va日韩∨a综合色| 亚洲国产精品99久久久久久久久| 久久久国产精品一区| 亚洲一区亚洲| 国产欧美日韩精品专区| 翔田千里一区二区| 亚洲制服丝袜在线| 国产精品一区二区三区久久| 性欧美1819性猛交| 欧美一级片久久久久久久| 国产欧美日韩亚州综合| 欧美一级免费视频| 欧美一区二区播放| 黄色资源网久久资源365| 另类天堂av| 免费在线播放第一区高清av| 亚洲国产专区| 日韩视频在线观看国产| 欧美日韩在线视频首页| 亚洲免费在线观看视频| 亚洲制服少妇| 一区在线播放视频| 亚洲国产婷婷综合在线精品| 欧美日韩人人澡狠狠躁视频| 性做久久久久久免费观看欧美| 在线亚洲美日韩| 国产精品欧美一区二区三区奶水 | 久久精品欧洲| 国产日韩免费| 亚洲精品免费网站| 亚洲精品日韩在线| 亚洲视频一区| 欧美日本在线观看| 亚洲视频在线看| 欧美一区亚洲| 亚洲精品视频免费观看| 在线综合视频| 在线免费观看欧美| 夜夜爽av福利精品导航| 国产一区二区高清不卡| 91久久中文字幕| 国内精品视频在线观看| 日韩视频一区二区三区在线播放免费观看| 国产精品第十页| 亚洲高清在线精品| 国产一区二区三区黄| 日韩亚洲在线| 亚洲激情在线视频| 欧美一级淫片播放口| 一区二区高清在线观看| 久久久久久国产精品一区| 亚洲在线成人精品| 欧美成人日本| 狂野欧美激情性xxxx| 国产精品亚洲片夜色在线| 亚洲高清视频在线观看| 国产欧美综合一区二区三区| 亚洲毛片在线看| 亚洲精品久久久久久久久久久久| 午夜一区不卡| 午夜精品美女久久久久av福利| 欧美成人国产一区二区| 久久欧美中文字幕| 国产精品日本精品| 99在线热播精品免费99热| 亚洲精美视频| 美女视频黄免费的久久| 老司机成人网| 国外成人在线视频| 99热在这里有精品免费| 久久xxxx精品视频| 午夜一区二区三区在线观看| 欧美日韩另类国产亚洲欧美一级| 亚洲第一精品影视| 亚洲激情偷拍| 欧美电影免费观看网站| 欧美国产高清| 91久久久一线二线三线品牌| 免费一级欧美片在线播放| 欧美高清免费| 亚洲黄色一区二区三区| 激情成人综合网| 欧美日韩国产综合网| 欧美一区激情| 久久精品一区二区三区四区| 亚洲无亚洲人成网站77777| 亚洲精品欧美激情| 亚洲国产精品女人久久久| 久久久xxx| 午夜激情亚洲| 亚洲精品久久| 国产精品久久久久久影视| 久久国内精品视频| 国产一区美女| 久久久久国产一区二区三区| 久久久国产精品亚洲一区 | 久久精品国产视频| 久久一区二区三区超碰国产精品| 国模精品一区二区三区| 久久野战av| 亚洲精品视频一区二区三区| 亚洲在线视频一区| 韩国av一区二区三区| 可以看av的网站久久看| 亚洲精品久久久蜜桃| 午夜精品久久久久99热蜜桃导演| 国产性做久久久久久| 另类春色校园亚洲| 一区二区三区波多野结衣在线观看| 亚洲欧美日韩精品综合在线观看 | 免费日韩av片| 亚洲国产美女精品久久久久∴| 欧美精品久久一区二区| 一区二区日韩| 欧美成人激情在线| 亚洲男人第一av网站| 在线观看欧美| 欧美日韩美女一区二区| 欧美在线视频导航| 亚洲日本中文字幕| 久久久久久久高潮| 亚洲色诱最新| 亚洲国产成人高清精品| 国产精品免费在线| 欧美电影在线观看| 欧美在线三级| 亚洲网站在线| 欧美xxx成人| 欧美一区二区三区日韩| 9久草视频在线视频精品| 尤物九九久久国产精品的特点| 欧美日本在线一区| 麻豆精品在线视频| 久久福利电影| 亚洲伊人观看| 亚洲精品日韩久久| 亚洲电影毛片| 欧美成人乱码一区二区三区| 免费欧美在线视频| 久久综合狠狠综合久久激情| 国产亚洲人成网站在线观看|