• <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>

            edog

            冰凍熱狗
            數據加載中……

            一個串口通訊的類

            /* CommUtils.h */
            #ifndef _CommUtils_H__
            #define _CommUtils_H__

            class CommUtils  
            {
            public:
                
            bool ReadCom(unsigned char * ReceiveData, DWORD& ReceiveLength);
                
            void CloseCom();
                
            bool WriteCom(unsigned char * sendchar,int sendsize);
                
            bool OpenCom(int Port);

                CommUtils();
                
            virtual ~CommUtils();
                
            int m_Port;
                
            char szCurPath[256];

            private:
                OVERLAPPED ReadovReady, WriteovReady;
                HANDLE hComm;
                
            bool bOpenCom;
            }
            ;

            #endif

            /* 
                CommUtils.cpp    串口通訊類
                Author: edog    2007-11-21
                EMail: comwell@126.com
             
            */

            #include 
            "stdafx.h"
            #include 
            "CommUtils.h"
            #include 
            "stdio.h"
            const int READ_TIMEOUT = 500;

            CommUtils::CommUtils()
            {
                bOpenCom 
            = false;
            }


            CommUtils::
            ~CommUtils()
            {
                
            this->CloseCom();
            }


            bool CommUtils::OpenCom(int Port)
            {
                
            if (bOpenCom)
                
            {
                    
            this->CloseCom();
                    bOpenCom 
            = false;
                }

                
            char szport[10];
                sprintf(szport,
            "COM%d",Port);
                hComm 
            = CreateFile(    szport,
                                    GENERIC_READ
            |GENERIC_WRITE,
                                    
            0,
                                    NULL,
                                    OPEN_EXISTING,
                                    FILE_FLAG_OVERLAPPED, 
            //FILE_ATTRIBUTE_NORMAL|
                                    NULL);
                
                
                
            if (hComm == INVALID_HANDLE_VALUE)        return false;
                
            if (!SetupComm(hComm, 1024512))        return false;
                
                COMMTIMEOUTS commtimeouts;
                commtimeouts.ReadIntervalTimeout 
            = MAXDWORD;
                commtimeouts.ReadTotalTimeoutConstant 
            =0;
                commtimeouts.ReadTotalTimeoutMultiplier 
            =0;
                commtimeouts.WriteTotalTimeoutConstant 
            =0;
                commtimeouts.WriteTotalTimeoutMultiplier
            =0;
                
                
            if (!SetCommTimeouts(hComm, &commtimeouts))        return false;

                memset(
            &ReadovReady,0,sizeof(OVERLAPPED));
                memset(
            &WriteovReady,0,sizeof(OVERLAPPED));
                ReadovReady.hEvent 
            = CreateEvent(NULL,TRUE,FALSE,NULL);
                WriteovReady.hEvent 
            =CreateEvent(NULL,TRUE,FALSE,NULL);
                
                SECURITY_ATTRIBUTES sa;
                sa.nLength
            =sizeof(SECURITY_ATTRIBUTES);
                sa.lpSecurityDescriptor
            =NULL;
                sa.bInheritHandle
            =TRUE;
                
                DCB dcb;
                GetCommState(hComm, 
            &dcb);
                dcb.fBinary 
            = TRUE;
                dcb.fParity 
            = TRUE;
                dcb.BaudRate 
            = CBR_9600;        // 波特率 9600
                dcb.ByteSize = 8;                // 8 位數據位
                dcb.Parity = NOPARITY;            // 無奇偶校驗
                dcb.StopBits = ONESTOPBIT;        // 1 個停止位
                
                
            if (!SetCommState(hComm, &dcb ))        return false;

                bOpenCom 
            = true;
                
            return bOpenCom;
            }


            bool CommUtils::WriteCom(unsigned char *sendchar, int sendsize)
            {
                
            if (!bOpenCom)    return false;
                
                DWORD    BytesSent;
                DWORD    resD;        
                
                PurgeComm(hComm, PURGE_RXCLEAR 
            | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
                
                BytesSent
            =0;
                BOOL hr 
            = WriteFile(hComm,                            // Handle to COMM Port
                                    sendchar,                        // Pointer to message buffer in calling finction
                                    sendsize,                        // Length of message to send
                                    &BytesSent,                        // Where to store the number of bytes sent
                                    &WriteovReady);                    // Overlapped structure
                if(!hr)
                
            {
                    
            if(GetLastError() != ERROR_IO_PENDING)
                    
            {
                        
            return false;
                    }

                    
            else
                    
            {
                        resD
            =WaitForSingleObject(WriteovReady.hEvent,INFINITE);
                    }

                    
            switch(resD)
                    
            {
                        
            case WAIT_OBJECT_0:
                        
            {
                            
            if(!GetOverlappedResult(hComm,&WriteovReady,&BytesSent,false))
                                
            return false;
                            
            else
                                
            return true;
                            
                        }

                        
            default:
                            
            return false;
                            
            break;
                    }

                }

                
            return true;
            }


            void CommUtils::CloseCom()
            {
                
            if (!bOpenCom)    return;

                CloseHandle(hComm);
                hComm
            =NULL;
                
                CloseHandle(ReadovReady.hEvent);
                CloseHandle(WriteovReady.hEvent );
                ReadovReady.hEvent 
            =NULL;
                WriteovReady.hEvent 
            =NULL;
            }


            bool CommUtils::ReadCom(unsigned char * ReceiveData, DWORD& ReceiveLength)
            {
                
            if (!bOpenCom)    return false;
                
            if (ReadovReady.hEvent == NULL)    return false;
                
                ReceiveLength 
            = 0;
                
            if (ReadFile(hComm, ReceiveData, 128&ReceiveLength, &ReadovReady) == FALSE) 
                
            {
                    
            if (GetLastError() != ERROR_IO_PENDING)    return false;
                }


                
            if(ReceiveLength == 0)    return false;
                ReceiveData[ReceiveLength] 
            = 0;

                DWORD dwRead;
                DWORD dwRes 
            = WaitForSingleObject(ReadovReady.hEvent, READ_TIMEOUT);
                
            switch(dwRes)
                
            {
                    
            case WAIT_OBJECT_0:
                        
            if (!GetOverlappedResult(hComm, &ReadovReady, &dwRead, FALSE))    return false;
                        
            break;

                    
            case WAIT_TIMEOUT:
                        
            break;                
                        
                    
            default:
                        
            break;
                }

                
            return true;
            }




            以下為使用方法:
            // 1. 包含頭文件,定義變量
            #include "CommUtils.h"
            CommUtils theComm;
            unsigned 
            char data[1024];
            unsigned 
            long len = 0;

            // 2. 打開串口,設置接收定時器
            theComm.OpenCom(1);        // 打開COM1口
            SetTimer(1500);

            // 3. 發送數據
            theComm.WriteCom(data, len);

            // 4. 接收數據處理
            void CUARTDlg::OnTimer(UINT nIDEvent) 
            {
                
            if (nIDEvent == 1)
                
            {
                    
            if (theComm.ReadCom(data, len))
                    
            {
                        
            if (len > 0)    
                        
            {
                            
            // 接收數據處理。。。
                        }

                    }

                }

                CDialog::OnTimer(nIDEvent);
            }

            posted on 2007-11-21 10:28 冰凍熱狗 閱讀(3680) 評論(4)  編輯 收藏 引用 所屬分類: 應用程序

            評論

            # re: 一個串口通訊的類  回復  更多評論   

            謝謝。 正要找這么一個東西,搜索到這里,順利用上了~~~
            沒有條件測試,應該沒有問題。
            2008-10-19 21:40 | summer

            # re: 一個串口通訊的類  回復  更多評論   

            thinks a lot!
            2008-12-20 00:17 | 王建壯

            # re: 一個串口通訊的類  回復  更多評論   

            @Sharman
            廣告都作到這了,安哥拉的沙曼。。。
            2013-04-13 11:59 | ileson

            # re: 一個串口通訊的類  回復  更多評論   

            多謝樓主!正好需要!
            2014-03-16 21:55 | 水煮魚丸
            91视频国产91久久久| 一本久道久久综合狠狠躁AV| 97久久精品国产精品青草| 久久99精品国产一区二区三区| 亚洲国产精品热久久| 中文字幕亚洲综合久久菠萝蜜| 91精品国产高清久久久久久io| 伊人热人久久中文字幕| 久久久久久国产精品美女| 免费观看成人久久网免费观看| 色老头网站久久网| 久久精品国产福利国产秒| 精产国品久久一二三产区区别| 久久综合久久综合久久| 伊人久久大香线蕉综合Av| 人妻无码久久精品| 精品久久一区二区三区| 77777亚洲午夜久久多喷| 99久久精品国产一区二区蜜芽| 人妻丰满AV无码久久不卡| 亚洲国产成人精品久久久国产成人一区二区三区综 | 久久av免费天堂小草播放| 日韩AV无码久久一区二区| 欧美久久一级内射wwwwww.| 欧美一区二区精品久久| 久久精品国产亚洲av水果派| 精品久久久久久久久免费影院| 狠狠色丁香婷婷综合久久来来去| 成人久久精品一区二区三区| 久久AV无码精品人妻糸列| 亚洲国产天堂久久久久久| 久久久久亚洲AV成人网| 国产精品成人99久久久久| 91久久精品国产91性色也| 老司机国内精品久久久久| WWW婷婷AV久久久影片| 99麻豆久久久国产精品免费| 久久精品人人做人人妻人人玩| 色婷婷综合久久久久中文一区二区 | 欧美精品福利视频一区二区三区久久久精品 | 91精品国产91久久综合|