《電子技術應用》
您所在的位置:首頁 > 模擬設計 > 設計應用 > 基于VC++6.0的串口通信開發方法
基于VC++6.0的串口通信開發方法
摘要: 在32位windows中,串口和其他通信設備(如磁盤等)都被作為文件進行處理,在使用前必須先將其打開,為保證串口通信數據傳輸的可靠性,串口一般以非共享模式打開,也就是在被串口打開后,其他程序不能在去打開此設備。
Abstract:
Key words :

1.引言

  在當今的工業控制領域,串口通信是計算機與其他設備進行數據通信時經常使用的方法,具有實現簡單、使用靈活、數據傳輸可靠等幾個優點,特別是在實時監控系統中得到廣泛應用,在我們使用的計算機上使用的串口一般是rs232,使用rs232接口只能進行一對一的通信,然而在工業控制領域往往是一臺工控機和多臺智能設備進行通信,并且要求傳輸距離遠,因為這些需求,在工控領域一般使用rs485。

  在win32下,可以使用兩種編程方式實現串口通信,其一是使用mscomm控件,這種方法程序簡單,但欠靈活。其二是調用windows的api函數,這種方法可以清楚地掌握串口通信的機制,并且自由靈活。使用控件的方法在本質上也是使用api進行串口通信,控件只不過是對api的一個封裝處理,本文只介紹使用api進行串口通信編程的方法。
 
2 串口通信的一般步驟

  2.1 打開串口
  在32位windows中,串口和其他通信設備(如磁盤等)都被作為文件進行處理,在使用前必須先將其打開,為保證串口通信數據傳輸的可靠性,串口一般以非共享模式打開,也就是在被串口打開后,其他程序不能在去打開此設備。
  2.2 配置串口
  在使用串口進行數據通信前必須對其進行正確的配置,串口需要配置的主要參數有波特率、數據位、停止位、奇偶校驗、收發數據緩沖區大小。除此之外還要對串口進行超時設置,以防止在串口通信時數據傳輸突然中斷而導致讀寫操作進入無限期等待的狀態,設置了超時,如果在指定時間內沒有完成所進行的操作,則此操作被自動放棄。
  2.3 讀寫串口
  在串口被打開并設置好后,就可以使用串口進行讀寫數據了,讀寫數據可以采用同步、異步及事件驅動等多種方式。
  2.4 關閉串口
  在使用完串口后應該將其關閉,如果沒有關閉,該串口會處于打開狀態,其他的應用程序便無法打開使用該串口。
 
3 利用api函數實現串口通信

  3.1 打開串口
  win32系統把文件的概念進行了擴展。無論是文件、通信設備、命名管道、郵件槽、磁盤、還是控制臺,都是用api函數createfile來打開或創建的。該函數的原型為:
  handle createfile( lpctstr lpfilename,
                    dword dwdesiredaccess,
                    dword dwsharemode,
                    lpsecurity_attributes lpsecurityattributes,
                    dword dwcreationdistribution,
  dword dwflagsandattributes,
  handle htemplatefile);
  各個參數說明如下:
  lpfilename:將要打開的串口邏輯名,如“com1”;
  dwdesiredaccess:指定串口訪問的類型,可以是讀取、寫入或二者并列;
  dwsharemode:指定共享屬性,由于串口不能共享,該參數必須置為0;
  lpsecurityattributes:引用安全性屬性結構,缺省值為null;
  dwcreationdistribution:創建標志,對串口操作該參數必須置為open_existing;
  dwflagsandattributes:屬性描述,用于指定該串口是否進行異步操作,該值為       file_flag_overlapped,表示使用異步的i/o;該值為0,表示同步i/o操作;
  htemplatefile:對串口而言該參數必須置為null;

  3.2 配置串口
  在打開通訊設備句柄后,常常需要對串口進行一些初始化配置工作。這需要通過一個dcb結構來進行。dcb結構包含了諸如波特率、數據位數、奇偶校驗和停止位數等信息。在查詢或配置串口的屬性時,都要用dcb結構來作為緩沖區。在打開串口后,可以調用getcommstate函數來獲取串口的默認配置,該函數獲取一個dcb結構體,只要在該結構內對應該先修改dcb結構,然后再調用setcommstate函數以修改后的dcb結構設置串口。dcb主要有以下幾個重要的成員:
  byte bytesize; // 通信字節位數byte parity;   //指定奇偶校驗方法。此成員可以有下列值://evenparity 偶校驗     noparity 無校驗//markparity 標記校驗   oddparity 奇校驗byte stopbits; //指定停止位的位數。此成員可以有下列值://onestopbit   1位停止位   //twostopbits  2位停止位//one5stopbits 1.5位停止位
  除了使用bcd設置串口的一些基本參數外,一般還需要設置串口收發數據緩沖區的大小和超時,超時的作用是在指定的時間內沒有讀入或發送指定數量的字符,讀寫操作仍然會結束。windows用i/o緩沖區來暫存串口輸入和輸出的數據,如果通信的速率較高,則應該設置較大的緩沖區。我們可以使用api函數setupcomm設置串口的輸入和輸出緩沖區的大小,其原型如下:bool setupcomm(    handle hfile,          // 串口句柄     dword dwinqueue,      // 輸入緩沖區的大小(字節數)     dword dwoutqueue );   // 輸出緩沖區的大小(字節數)
關于讀寫串口的超時設置,windows給我們提供一個專門的結構體commtimeouts,其定義如下:typedef struct _commtimeouts {        dword readintervaltimeout;         //讀間隔超時    dword readtotaltimeoutmultiplier;  //讀時間系數    dword readtotaltimeoutconstant;    //讀時間常量    dword writetotaltimeoutmultiplier;  // 寫時間系數    dword writetotaltimeoutconstant;   //寫時間常量} commtimeouts,*lpcommtimeouts;

  commtimeouts結構的成員都以毫秒為單位。總超時的計算公式是:
  總超時=時間系數×要求讀/寫的字符數+時間常量
  例如,要讀入10個字符,那么讀操作的總超時的計算公式為:
  讀總超時=readtotaltimeoutmultiplier×10+readtotaltimeoutconstant
  通過該結構體windowsapi為我們提供兩個函數:getcommtimeouts和setcommtimeouts,前者獲取當前的超時設置,后者使用修改后的commtimeouts設置超時,與設置串口闡述類似。
  在讀寫串口之前,還要用purgecomm(…)函數清空緩沖區,該函數原型:
  bool purgecomm(
      handle hfile,     //串口句柄
      dword dwflags );   // 需要完成的操作
  參數dwflags指定要完成的操作,可以是下列值的組合:
  purge_txabort  中斷所有寫操作并立即返回,即使寫操作還沒有完成。
  purge_rxabort  中斷所有讀操作并立即返回,即使讀操作還沒有完成。
  purge_txclear  清除輸出緩沖區
  purge_rxclear  清除輸入緩沖區

  3.3 讀寫串口
  讀寫串口使用readfile和writefile兩個函數,其原型如下:bool readfile(    handle hfile,                     //串口的句柄    lpvoid lpbuffer,                  // 保存讀入數據的指針,       dword nnumberofbytestoread,     // 要讀入的數據的字節數lpdword lpnumberofbytesread,   //  實際讀入的字節數    lpoverlapped lpoverlapped );    // overlapped,同步為null    
  bool writefile(
    handle hfile,                    //串口的句柄
    lpcvoid lpbuffer,                 // 要寫入數據的地址
    dword nnumberofbytestowrite,     // 要寫入數據的字節數
    lpdword lpnumberofbyteswritten,  //實際寫入的字節數
    lpoverlapped lpoverlapped);      // overlapped,同步為null 在進行同步操作時,讀寫函數  要等到執行完才返回,而在異步操作時函數立即返回,但不保證讀寫操作完成,這時候就需要使用overlapped結構進行異步控制,該結構體有一個重要的成員hevent,該成員是windows事件對象的句柄在控制線程同步及異步操作時常用到,如果是異步操作,我們可以使用createevent(…)創建事件對象并將返回值賦給hevent,然后使用waitforsingleobject或getoverlappedresult等待讀寫操作完成,進而達到控制異步操作的目的。

3.4   關閉串口

  在不使用串口的時候應該將其關閉,以釋放windows的資源供其他程序使用,關閉串口只需調用closehandle(hcomm/*串口句柄*/)即可。

4.串行通信在世紀星組態軟件中的應用

  作為通用的組態軟件,世紀星要與其他plc、智能儀表等設備進行通信,串行通信是主要的方式之一,基于前面所述使用api進行串行通信開發的優點,并考慮程序開發的便捷和可重用等,在世紀星中,我們將串行通信api進行封裝,以類的方式對串口進行操作,其中打開串口及配置串口參數的操作我們通過可視化窗口進行設定,然后在封裝類中實現,相關的操作處理讀寫數據外基本都已實現,因為不同的設備有不同的協議,因而讀寫串口的操作在驅動程序中完成,這樣我們的開發人員就不必關注太多其他的相關操作,只需根據實際設備重寫讀寫串口的成員函數即可。

 5 結論

  windows是當前應用程序開發的主流平臺,vc++6.0是該平臺強大的開發工具,使用windowsapi開發串口通信的程序可是使我們更加清晰的了解串口通信的機制,并且開發人員可以根據需要使用api進行靈活的程序設計,在scada中串行通信是必不可少的技術,所以掌握串行通信的開發方法具有現實意義。

此內容為AET網站原創,未經授權禁止轉載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
欧美影院成人| 亚洲一区二区三区四区视频| 日韩一级欧洲| 亚洲国产成人一区| 国产一区99| 国产精品无人区| 国产精品家教| 欧美网站大全在线观看| 欧美日韩国产精品成人| 欧美电影免费观看高清| 能在线观看的日韩av| 久久婷婷影院| 玖玖玖国产精品| 久久色在线观看| 久久久久久久尹人综合网亚洲| 欧美一区二区三区在线免费观看| 亚洲一区二区三区久久| 亚洲亚洲精品在线观看 | 亚洲电影自拍| 亚洲高清视频在线| 亚洲欧洲精品一区| 亚洲欧洲在线观看| 一本色道久久综合亚洲精品按摩| 亚洲精品视频二区| 99精品热视频| 亚洲午夜在线视频| 亚洲欧美色一区| 欧美在线视频免费| 久久亚洲精品网站| 欧美国内亚洲| 欧美色另类天堂2015| 国产精品v一区二区三区| 国产精品久久一卡二卡| 国产乱码精品一区二区三区av| 国产日产亚洲精品| 在线播放豆国产99亚洲| 亚洲人午夜精品| 一区二区欧美视频| 篠田优中文在线播放第一区| 亚洲二区在线视频| 99re热这里只有精品免费视频| 一区二区久久久久| 欧美在现视频| 欧美va天堂在线| 欧美色网一区二区| 国产亚洲在线观看| 91久久精品www人人做人人爽| 99v久久综合狠狠综合久久| 亚洲男人第一av网站| 亚洲第一天堂av| 亚洲精品日本| 亚洲欧美视频一区| 老**午夜毛片一区二区三区| 欧美极品一区二区三区| 国产精品入口尤物| 永久免费精品影视网站| 亚洲免费观看高清完整版在线观看| 亚洲视频久久| 亚洲国产精品va在线看黑人| 宅男噜噜噜66一区二区| 欧美综合二区| 欧美区二区三区| 国产日韩欧美中文| 亚洲精品久久久久| 午夜精品国产| 日韩一级黄色av| 欧美在线视频一区| 欧美人与禽性xxxxx杂性| 国产欧美日韩一区| 亚洲人成绝费网站色www| 亚洲综合日韩在线| 亚洲精品欧美极品| 久久国产福利国产秒拍| 欧美日韩国产成人| 红桃视频国产一区| 亚洲特级毛片| 亚洲乱码久久| 久久久国产精品一区| 欧美午夜在线视频| 亚洲高清免费| 新狼窝色av性久久久久久| 一区二区三区高清在线观看| 久久人91精品久久久久久不卡| 欧美日韩中文字幕在线| 精品69视频一区二区三区| 亚洲午夜在线| 99爱精品视频| 久久综合伊人77777| 国产精品视频久久久| 最新热久久免费视频| 久久国产主播精品| 欧美一区不卡| 欧美视频不卡中文| 亚洲国产精品久久人人爱蜜臀| 午夜在线精品偷拍| 亚洲欧美激情视频| 欧美日韩一区不卡| 亚洲国产精品久久久久婷婷老年 | 国产精品男人爽免费视频1| 国产在线精品自拍| 亚洲四色影视在线观看| 99精品99| 欧美高清在线视频| 国产在线拍揄自揄视频不卡99| 亚洲一区二区三区乱码aⅴ蜜桃女| 日韩一级精品视频在线观看| 久久一区中文字幕| 国产一区二区三区久久悠悠色av | 美女主播一区| 国内外成人免费激情在线视频| 亚洲永久在线| 亚洲资源av| 欧美午夜电影完整版| 亚洲久久一区| 夜久久久久久| 欧美美女bbbb| 亚洲美女毛片| 亚洲视频在线观看| 欧美日韩国产免费| 日韩网站在线观看| 夜夜夜精品看看| 欧美精品三级| 日韩性生活视频| 亚洲一级片在线观看| 欧美视频精品一区| 一区二区三区.www| 亚洲一区二区三区成人在线视频精品| 欧美日韩精品一区二区在线播放| 91久久国产综合久久91精品网站 | 日韩图片一区| 欧美日本簧片| 一本色道久久99精品综合| 亚洲一本视频| 国产精品你懂的在线欣赏| 亚洲视频在线观看视频| 在线一区二区三区四区五区| 欧美三日本三级少妇三99| 中文国产成人精品| 欧美淫片网站| 国产综合激情| 91久久午夜| 欧美日韩国产一中文字不卡| 亚洲最新视频在线| 性伦欧美刺激片在线观看| 国产午夜精品一区二区三区视频| 久久精品官网| 欧美激情区在线播放| 亚洲巨乳在线| 亚洲女与黑人做爰| 国产日产高清欧美一区二区三区| 亚洲福利专区| 欧美日韩成人综合天天影院| 亚洲美女视频| 欧美一区二区三区喷汁尤物| 韩国亚洲精品| 99在线|亚洲一区二区| 国产精品www| 久久精品夜夜夜夜久久| 欧美精品一区二区三区高清aⅴ| 这里只有精品视频| 久久久国产成人精品| 亚洲精品久久久久中文字幕欢迎你| 亚洲一区免费看| 国产亚洲综合精品| 99riav国产精品| 国产日韩视频| 99re6热只有精品免费观看| 国产精品一二三四| 亚洲激情中文1区| 国产精品白丝jk黑袜喷水| 欧美综合77777色婷婷| 欧美精品不卡| 欧美一级在线视频| 欧美激情第三页| 亚洲欧美在线高清| 欧美连裤袜在线视频| 午夜精品区一区二区三| 欧美高清不卡| 亚洲欧美一区二区三区在线| 欧美大片在线看| 亚洲欧美精品伊人久久| 欧美二区在线| 午夜国产精品视频| 欧美日本亚洲视频| 欧美自拍丝袜亚洲| 国产精品成人一区二区| 亚洲第一页中文字幕| 国产精品久久久久久av下载红粉 | 久久综合伊人| 亚洲综合社区| 欧美极品在线视频| 欧美中文在线免费| 国产精品久久久91| 99国产精品视频免费观看一公开 | 欧美尤物一区| 国产精品wwwwww| 亚洲精品美女91| 国产视频观看一区| 亚洲一区在线免费| 亚洲国产免费|