• <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 冰凍熱狗 閱讀(3682) 評論(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 | 水煮魚丸
            狠狠人妻久久久久久综合| 中文精品久久久久人妻| 国产精品欧美久久久天天影视| 精品伊人久久大线蕉色首页| 一本久道久久综合狠狠爱| 久久久久久免费一区二区三区| 久久综合九色综合精品| 一本大道久久香蕉成人网| 久久大香香蕉国产| 欧美精品福利视频一区二区三区久久久精品| 2019久久久高清456| 久久精品中文无码资源站| 99久久国产综合精品五月天喷水| 午夜精品久久久内射近拍高清| 熟妇人妻久久中文字幕| 久久久无码精品亚洲日韩软件| 久久人人爽人人爽人人片av高请 | 伊人久久精品无码av一区| 久久精品国产免费一区| 久久亚洲熟女cc98cm| 久久国产午夜精品一区二区三区| 久久精品国产99国产精品亚洲| 久久国产V一级毛多内射| 亚洲欧洲日产国码无码久久99| 久久久久黑人强伦姧人妻| 97精品伊人久久大香线蕉app| 亚洲国产一成久久精品国产成人综合 | 久久亚洲高清观看| 亚洲国产另类久久久精品 | 欧美国产成人久久精品| 国产精品成人久久久久三级午夜电影 | 一本色综合久久| 久久人妻少妇嫩草AV蜜桃| 久久国产成人午夜aⅴ影院| 国产精品九九久久免费视频| 99久久免费国产特黄| 国内精品久久久久伊人av| 久久久无码精品亚洲日韩按摩| 久久亚洲精品无码aⅴ大香 | 久久er国产精品免费观看2| 少妇久久久久久被弄高潮|