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

franksunny的個(gè)人技術(shù)空間
獲得人生中的成功需要的專注與堅(jiān)持不懈多過天才與機(jī)會。 ——C.W. Wendte
@import url(http://m.shnenglu.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);

 

枚舉串口四法

 

串口作為最基本的電腦通信 I/O 接口,其使用雖然在 PC 上越來越少,但是在工業(yè)儀器領(lǐng)域仍然用的相當(dāng)普遍,由于筆者工作中需要用到串口,而且發(fā)現(xiàn)枚舉串口至今仍未搞得很清楚,為此自己先整理下,希望大俠和同行們對我不懂和錯誤的地方指點(diǎn)一下。

 

1 、查詢注冊表

查詢注冊表的方法是網(wǎng)上見到的比較常見的方法,該方法就是使用編程方法讀取注冊表內(nèi)信息,相當(dāng)于用戶通過在運(yùn)行框內(nèi)輸入 ”regedit” (或 regedit32 )直接打開注冊表,查看“ HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM ”項(xiàng)來獲取串口信息。以下是源代碼:

CString   strSerialList[256];  // 臨時(shí)定義 256 個(gè)字符串組,因?yàn)橄到y(tǒng)最多也就 256 個(gè)

HKEY hKey;

LPCTSTR data_Set="HARDWARE\\DEVICEMAP\\SERIALCOMM\\";

long ret0 = (::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_Set, 0, KEY_READ, &hKey));

if(ret0 != ERROR_SUCCESS)

{

return -1;

}

int i = 0;

CHAR Name[25];

UCHAR szPortName[25];

LONG Status;

DWORD dwIndex = 0;

DWORD dwName;

DWORD dwSizeofPortName;

DWORD Type;

dwName = sizeof(Name);

dwSizeofPortName = sizeof(szPortName);

do

{

Status = RegEnumValue(hKey, dwIndex++, Name, &dwName, NULL, &Type,

      szPortName, &dwSizeofPortName);

if((Status == ERROR_SUCCESS)||(Status == ERROR_MORE_DATA))

{

strSerialList[i] = CString(szPortName);       // 串口字符串保存

i++;// 串口計(jì)數(shù)

   }

} while((Status == ERROR_SUCCESS)||(Status == ERROR_MORE_DATA));

RegCloseKey(hKey);

以上方法同樣也可以實(shí)現(xiàn)對并口的查詢,只要將 "HARDWARE \\ DEVICEMAP\\ SERIALCOMM\\" 用 "HARDWARE\\DEVICEMAP\\PARALLEL PORTS\\" 代替就行了。

比較:該方法時(shí)間最省,筆者在自己電腦上試過,在 1ms (少于 1ms 的我也不知道怎么編程計(jì)時(shí))內(nèi)即可完成;同時(shí)也可解決 usb 轉(zhuǎn)串口設(shè)備的問題,比較實(shí)用,唯一缺點(diǎn)是,如果用戶在裝某些軟硬件時(shí)在注冊表中注冊了虛擬串口之類的,用此法枚舉得到的該類串口實(shí)際上是不能當(dāng)串口用的。

 

2 、使用 EnumPort 方法

該方法調(diào)用 EnumPort () API 函數(shù),該函數(shù)本身就是枚舉電腦端口用的,它枚舉的并非只有串口,所以必須對其所得串口進(jìn)行分析選擇,以下是源代碼:

       int m_nSerialPortNum(0);// 串口計(jì)數(shù)

       CString          strSerialList[256];  // 臨時(shí)定義 256 個(gè)字符串組

       LPBYTE pBite  = NULL;

       DWORD pcbNeeded = 0;  // bytes received or required

       DWORD pcReturned = 0;  // number of ports received

       m_nSerialPortNum = 0;

       // 獲取端口信息,能得到端口信息的大小 pcbNeeded

       EnumPorts(NULL, 2, pBite, 0, &pcbNeeded, &pcReturned);

       pBite = new BYTE[pcbNeeded];

       // 枚舉端口,能得到端口的具體信息 pBite 以及端口的的個(gè)數(shù) pcReturned

       EnumPorts(NULL, 2, pBite, pcbNeeded, &pcbNeeded, &pcReturned);

       PORT_INFO_2 *pPort;

       pPort = (PORT_INFO_2*)pBite;

       for ( i = 0; i < pcReturned; i++)

       {

              CString str = pPort[i].pPortName;

              // 串口信息的具體確定

              if (str.Left(3) == "COM")

              {                  

                     strSerialList[m_nSerialPortNum] = str.Left(strlen(str) - 1);

                     //CString temp = str.Right(strlen(str) - 3);// 下面兩行注釋獲取串口序號用

                     //m_nSerialPortNo[m_nSerialPortNum] = atoi(temp.Left(strlen(temp) - 1));

                     m_nSerialPortNum++;                

              }

       }

以上方法除了串口,還可以枚舉所有的并口和打印機(jī)等接口,而且能找到虛擬串口(這些串口有些未使用時(shí),在注冊表和硬件設(shè)備管理器中是不能取得的)。但是該方法稍微耗時(shí)些,筆者在自己電腦上試過,大概需要幾十 ms ,主要問題是該方法有些 usb 串口并不能查到,所以該方法并不可靠。

 

3 、依次打開串口的方法

該方法就是中規(guī)中矩的依次打開串口,看打開是否成功來判斷串口的有無,該方法源代碼如下:

       int m_nSerialPortNum(0);// 串口數(shù)

       CString          strSerialList[256];  // 臨時(shí)定義 30 個(gè)字符串組

       int nCom = 0;

       int count = 0;

       HANDLE hCom;

       do {

              nCom++;

              strCom.Format("COM%d", nCom);

              hCom = CreateFile(strCom, 0, 0, 0,

                     OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

              if(INVALID_HANDLE_VALUE == hCom )

                     break;

              strSerialList[m_nSerialPortNum] = strCom;

              m_nSerialPortNum++;         

              CloseHandle(hCom);

       } while(1);

以上方法枚舉的都是當(dāng)前可用的串口,如果有一個(gè)串口當(dāng)前被占用則其后的串口也將無法枚舉得到,當(dāng)然以上方法也可以改成調(diào)用 for 循環(huán)讓其枚舉打開 256 個(gè)串口的方法以避免上述情況,不過該方法比前兩種更耗時(shí)(一般查找一個(gè)串口就要 15ms 左右),不過可以枚舉得到所有當(dāng)前可打開的串口,當(dāng)然不能枚舉得到一些虛擬串口。

 

4 、使用 SetupAPI 函數(shù)集的方法

此種方法是我所見過最簡單的方法,之所以簡單是因?yàn)橐呀?jīng)有人將復(fù)雜的代碼封裝起來了,我只需像傻子一樣調(diào)用就可以完成工作了,具體的說明請看http://www.codeguru.com/Cpp/W-P/system/hardwareinformation/article.php/c5721/ ,下面給出本人調(diào)用該方法的例子代碼:

       int m_nSerialPortNum(0);// 串口計(jì)數(shù)

       CString          strSerialList[256];  // 臨時(shí)定義 256 個(gè)字符串組

       CArray<SSerInfo,SSerInfo&> asi;

       EnumSerialPorts(asi,TRUE);// 參數(shù)為 TRUE 時(shí)枚舉當(dāng)前可以打開的串口, 
// 否則枚舉所有串口

       m_nSerialPortNum = asi.GetSize();

       for (int i=0; i<asi.GetSize(); i++)

       {

              CString str = asi[i].strFrien dlyName;

       }

補(bǔ)充說明一下,使用該方法只要在你的程序中,添加“ EnumSerial.cpp ”和“ EnumSerial.h ”兩個(gè)文件,并且將 Setupapi.lib 包含進(jìn)你的工程文件中就行了,該方法時(shí)間上來說可能和第三種方法差不多,但該方法獲取的串口完完全全就是硬件設(shè)備管理器中的串口。

以上是筆者對枚舉串口幾種方法的小結(jié),有些沒弄明白或含糊的地方,還請指正。

 

 

posted on 2006-10-10 23:31 frank.sunny 閱讀(9758) 評論(4)  編輯 收藏 引用 所屬分類: MFC相關(guān)技術(shù)

FeedBack:
# re: 枚舉串口四法
2006-10-11 12:13 | 開個(gè)玩笑
好,頂一下  回復(fù)  更多評論
  
# re: 枚舉串口四法
2007-09-13 18:43 | 1111
但是得不到com口對應(yīng)的設(shè)備名字   回復(fù)  更多評論
  
# re: 枚舉串口四法
2007-09-14 09:28 | freanksunny
@1111
你想得到具體怎么樣的串口設(shè)備名字?
  回復(fù)  更多評論
  
# re: 枚舉串口四法
2011-07-05 14:39 | No
第一個(gè)方法代碼有問題,,
需要把這兩句加到do while循環(huán)的中
dwName = sizeof(Name);

dwSizeofPortName = sizeof(szPortName);

每次調(diào)用RegEnumValue 都需要重設(shè)這2個(gè)值。
否則只能重復(fù)得到dwIndex==0 的那個(gè)值。  回復(fù)  更多評論
  

常用鏈接

留言簿(13)

隨筆分類

個(gè)人其它博客

基礎(chǔ)知識鏈接

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美精品日韩| 欧美怡红院视频一区二区三区| 亚洲午夜性刺激影院| 亚洲精品乱码久久久久久久久| 欧美成人tv| 亚洲一区二区在线播放| 欧美在线免费观看视频| 亚洲国产精品综合| 日韩亚洲欧美成人| 国产视频久久网| 欧美国产先锋| 国产精品美女久久久久久免费| 久久一区二区三区四区| 欧美日韩免费观看一区二区三区 | 免费在线亚洲欧美| 亚洲一区二区三区四区在线观看| 午夜在线视频一区二区区别| 欧美在线视频一区| 激情成人综合网| 久久狠狠久久综合桃花| 欧美高清在线播放| 亚洲欧美日韩在线观看a三区| 在线成人免费观看| 亚洲精品中文字幕在线观看| 国外成人在线视频网站| 一本色道久久综合狠狠躁篇怎么玩 | 国产精品色在线| 亚洲国产精品女人久久久| 国产日韩欧美成人| 在线一区二区三区四区五区| 亚洲激情国产精品| 久久精品一区二区国产| 亚洲女女女同性video| 欧美成人高清| 米奇777超碰欧美日韩亚洲| 国产精品视频xxx| 一本久道久久久| 日韩视频在线观看| 免费日韩一区二区| 免费久久99精品国产自在现线| 国产精品视频精品| 一区二区三区四区五区精品视频| 亚洲日本一区二区| 麻豆成人av| 免费日韩成人| 加勒比av一区二区| 欧美中文在线视频| 久久爱www.| 国产日韩精品久久久| 亚洲一区二区三区免费视频| 亚洲午夜免费视频| 欧美日韩在线播| 一区二区三区精密机械公司| 在线视频欧美一区| 欧美日韩综合精品| 亚洲无限av看| 午夜国产精品影院在线观看| 国产精品久久久久久久久婷婷| 在线视频精品一| 亚洲在线观看免费视频| 国产精品高潮呻吟久久av黑人| 一区二区不卡在线视频 午夜欧美不卡'| 99精品国产高清一区二区| 欧美久久一区| 国产精品99久久久久久久久| 国产自产精品| 久久久久www| 欧美~级网站不卡| 亚洲日本成人| 欧美区在线观看| 国产精品99久久不卡二区| 亚洲欧洲av一区二区| 国产一区亚洲| 麻豆精品一区二区av白丝在线| 欧美国产综合视频| 一区二区日韩精品| 国产精品一二三视频| 久久国内精品自在自线400部| 国产精品一区二区三区成人| 亚洲精品在线二区| 1000部精品久久久久久久久| 裸体歌舞表演一区二区| 99在线热播精品免费99热| 小黄鸭视频精品导航| 狠狠色狠狠色综合系列| 欧美激情中文字幕乱码免费| 亚洲无吗在线| 亚洲电影免费观看高清完整版在线| 一区二区成人精品 | 久久看片网站| 91久久精品美女高潮| 亚洲欧美另类国产| 欧美国产日韩一区二区| 亚洲午夜久久久久久尤物| 黄色精品一区二区| 欧美日韩国产a| 久久久久国产精品www| 99精品国产在热久久| 久久全国免费视频| 亚洲免费影视第一页| 1024亚洲| 国产欧美日韩另类视频免费观看| 欧美freesex8一10精品| 午夜精品久久| 日韩一区二区福利| 免费短视频成人日韩| 欧美一区二区高清在线观看| 亚洲国产另类久久久精品极度| 欧美日韩中文精品| 另类成人小视频在线| 亚洲免费视频在线观看| 亚洲国产天堂久久综合| 久久精品中文字幕免费mv| 一区二区久久| 亚洲国产精彩中文乱码av在线播放| 国产精品九色蝌蚪自拍| 浪潮色综合久久天堂| 亚洲欧美激情视频| 日韩午夜在线电影| 亚洲国产精品va在线看黑人| 久久久一二三| 欧美一级淫片aaaaaaa视频| 夜夜夜精品看看| 亚洲日本va在线观看| 亚洲国产日韩欧美在线图片| 韩国av一区二区三区| 国产欧美va欧美不卡在线| 国产精品成人国产乱一区| 欧美精品一二三| 女人香蕉久久**毛片精品| 久久久www免费人成黑人精品| 午夜精品三级视频福利| 中文久久精品| 在线亚洲自拍| 亚洲在线观看视频| 亚洲自拍16p| 久久综合久久美利坚合众国| 欧美亚洲免费高清在线观看| 在线亚洲免费| 亚洲一区不卡| 亚洲视频你懂的| 一区二区三区不卡视频在线观看| 亚洲精品久久久久久久久久久久| 亚洲大片av| 亚洲精品国产视频| 亚洲精品一区在线| 99精品热视频只有精品10| 国产日韩欧美综合在线| 国产亚洲成人一区| 国产一区二区久久精品| 国产亚洲网站| 精品成人久久| 午夜在线一区| 亚洲第一中文字幕在线观看| 欧美+亚洲+精品+三区| 欧美福利视频在线| 亚洲国产美女久久久久| 亚洲精品日韩在线观看| 亚洲最新色图| 性欧美长视频| 亚洲一区久久久| 久久精彩免费视频| 免费成人黄色片| 欧美日韩免费观看一区二区三区 | 午夜精彩视频在线观看不卡| 翔田千里一区二区| 欧美不卡视频一区| 亚洲精品日产精品乱码不卡| 一区二区三区精品国产| 欧美成人激情视频| 99精品国产福利在线观看免费| 午夜欧美视频| 欧美激情精品久久久久久蜜臀| 欧美新色视频| 亚洲成人在线视频网站| 中文国产一区| 久久久精品欧美丰满| 亚洲福利免费| 亚洲综合视频一区| 欧美高清自拍一区| 国产欧美精品一区aⅴ影院| 亚洲第一综合天堂另类专| 中文国产成人精品| 麻豆精品91| 亚洲精品中文字| 亚洲高清在线观看| 日韩小视频在线观看| 亚洲一二三区在线| 麻豆成人av| 欧美香蕉视频| 欧美日韩伦理在线免费| 在线观看成人一级片| 亚洲日本在线视频观看| 亚洲性感激情| 欧美激情亚洲综合一区| 中文国产成人精品| 久久野战av| 国产日韩成人精品| 亚洲免费不卡| 欧美淫片网站|