產品列表PRODUCTS LIST

            聯系信息

            • 電話:
              13521418576
            • 傳真:
              010-62979724
            首頁 > 技術與支持 > 串口開發的另一種方式
            串口開發的另一種方式
            點擊次數:5011 更新時間:2009-12-23

              根據以前的使用過的一系列串口操作軟件發現,大多數的串口操作軟件不具備自動的記錄保存功能,記錄文件是在應用程序目錄下 以時間命名的文本文件。現在發布的這個程序還有一些功能沒有實現不過這不影響使用。如果有需要大家可以自行添加代碼。下面主要說明一下程序的核心類CSuperSerialPort。該類主要功能有:

            控制串口收發數據并利用window系統的消息來轉發接收到的數據;
            支持一個CSuperSerialPort對象向多個窗口發送數據;
            支持發送大塊數據;
            支持動態設置收發緩存區大小;
            支持利用外部線程進行文件傳輸;
            支持收發數據統計;
            支持自定義錯誤信息;
            該類還有兩個輔助的結構體 WIN_ARG 和 tagPackage。WIN_ARG 是窗體描述結構體,該結構體包含了窗體指針、自定義消息和位置ID。


            typedef struct WIN_ARG
            {
                 UINT  winId;
                 CWnd* pWin;
                 DWORD msg;
            }WINARG, *pWINARG;

            tagPackage 是數據包描述結構體,該結構體包含了數據長度、數據類別和數據值。CSuperSerialPort利用這個結構體來分解大塊數據然后發送。
            typedef struct tagPackage
            {
                 enum emMaxSize
                 { emMAX_SIZE = 1024 };
             
                 UINT iLen;
                 UINT iType;
                 BYTE pData[emMAX_SIZE];
            }PACKAGE, * pPACKAGE;

              在串口程序的開發過程中,zui麻煩的問題就是需要事先確定緩存區的大小。如果傳輸時按協議傳輸這個一般沒什么問題,但是如果按一個字節一個字節的進行傳輸,那么在收數據的時候就很麻煩。解決這一問題時我利用了串口中cbInQue這一屬性,同時為了提高程序的性能啟用了一個接收線程,并將收下來的數據都發往的窗體對象然后再進行處理。如:
            pPACKAGE pPack = new PACKAGE;
            DWORD rdLen = pCom->m_comState.cbInQue;
            pPack->iLen   = rdLen;

            為了協同串口的收發,在初始化串口的時候要啟用FILE_FLAG_OVERLAPPED這一屬性,如
            CreateFile(, GENERIC_READ | GENERIC_WRITE, 0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
              當然在接收的線程中還加入了互斥對象和臨界區用于控制線程和數據統計。如果你直接使用CSuperSerialPort類,程序已經替你完成了這些任務。如:
            m_pSSP->Open(m_comName, m_uComRate, m_uComParity, m_uComDataBits, m_fComStopBits);
            m_pSSP->StartReceive(m_pSSP)

            詳細情況可以參照TestSerialPort2Dlg.cpp中的代碼。

              為了解決一個串口實例向多個窗口顯示數據問題,我在CSuperSerialPort類中添加了一個窗體向量表typedef vector vWINLIST;你可以通過Attach和Detach函數來控制窗體數量。如果需要添加其他的功能到CSuperSerialPort類中,有三種方法可以實現:
            直接修改CSuperSerialPort類代碼;
            繼承CSuperSerialPort類;
            調用GetComHandle返回串口句柄;






            <<利用串口“實時”接收短消息的方法


            <<串口服務器的工作方式和應用

            主站蜘蛛池模板: 高清一区二区三区日本久| 精品一区二区三区在线播放| 国产精品视频一区二区三区不卡| 一区二区高清在线观看| 日韩精品无码人妻一区二区三区| 国产成人无码aa精品一区| 成人精品一区久久久久| 久久中文字幕一区二区| 另类ts人妖一区二区三区| 伊人久久大香线蕉av一区| 中文字幕一区视频| 久久久不卡国产精品一区二区| 久久精品国产一区二区三| 波多野结衣一区二区免费视频| 狠狠综合久久AV一区二区三区| 国产精品无码一区二区三区不卡 | 相泽亚洲一区中文字幕| 亚洲一区二区三区深夜天堂| 中文字幕AV一区中文字幕天堂| 国产午夜精品一区二区三区极品| 国产成人久久精品一区二区三区| 亚洲欧美成人一区二区三区| 国产精品视频一区二区三区四| 一区二区三区视频免费| 波多野结衣一区二区三区88| 日韩一区二区三区在线| 亚洲综合av一区二区三区不卡| 日韩精品视频一区二区三区| 香蕉免费一区二区三区| 99精品一区二区三区| 中文字幕精品一区二区日本| 亚洲一区二区影视| 亚洲一区二区观看播放| 精品国产一区二区三区久久影院| 亚洲大尺度无码无码专线一区 | 加勒比无码一区二区三区| 中文字幕在线看视频一区二区三区| 亚洲国产综合精品中文第一区| 亚州日本乱码一区二区三区| 波多野结衣久久一区二区| 国产精品一区二区三区高清在线 |