반응형

 

노트북에 USB TO SERIAL을 이용해서 연결된 장비의 경우 시리얼포트가 고정되어 있지 않을 경우도 있고.. 고정되더라도 COM1이 아니라 엉뚱한 숫자로 매번 접속할 때 마다 장비에서 사용하는 포트를 변경해가며 접속하는게 번거로워서 사용가능한 시리얼 포트 정보를 가져오는 방법을 찾아봤습니다.


 

http://stackoverflow.com/questions/1388871/how-do-i-get-a-list-of-available-serial-ports-in-win32 에 시리얼 포트 정보를 얻어 올 수 있는 방법들을 나열해놓았는데 그 중에서 레지스터 값을 읽어오는 방법으로 결정하고 방법을 찾았습니다.


 

http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=887656&ref=887655 에 원하는 레지스터 키로부터 값들을 읽어오는 방법을 찾았는데.. 다행히 시리얼 포트를 읽어오는 것을 알려주는 내용이라 찾는 수고를 덜었네요.. 해보니 잘됩니다.. 콤보박스를 드롭다운할때에 아래 함수를 호출하여 목록을 업데이트 하는 것만 추가해주니 잘 작동합니다.

 

시간 나는대로 다른 레지스터 값들도 읽어와봐야 겠습니다.. 


 

  1. //콤보박스가 Dropdown  호출하면 .  
  2. void CSerialDlg::getSerialPort()  
  3. {  
  4.     //http://stackoverflow.com/questions/1388871/how-do-i-get-a-list-of-available-serial-ports-in-win32  
  5.     //HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM   시리얼포트 번호들이 등록되어 있음.  
  6.     //  
  7.     //레지스터 읽어오면 코드는 아래 링크에서 가져옴  
  8.     //http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=887656&ref=887655  
  9.     HKEY hKey;  
  10.     
  11.     //https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms724895(v=vs.85).aspx  
  12.     //오픈할 레지스터 키에 대한 기본키 이름  
  13.     //오픈할 레지스터 서브키 이름  
  14.     //레지스터키에 대한 핸들  
  15.     RegOpenKey(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), &hKey);  
  16.     
  17.     TCHAR szData[20], szName[100];  
  18.     DWORD index = 0, dwSize=100, dwSize2 = 20, dwType = REG_SZ;  
  19.     serialPort.ResetContent();  
  20.     memset(szData, 0x00, sizeof(szData));  
  21.     memset(szName, 0x00, sizeof(szName));  
  22.     
  23.     
  24.     //https://msdn.microsoft.com/en-us/library/windows/desktop/ms724865(v=vs.85).aspx  
  25.     //hKey - 레지스터키 핸들  
  26.     //index - 값을 가져올 인덱스.. 다수의 값이 있을 경우 필요  
  27.     //szName - 항목값이 저장될 배열  
  28.     //dwSize - 배열의 크기  
  29.     while (ERROR_SUCCESS == RegEnumValue(hKey, index, szName, &dwSize, NULL, NULL, NULL, NULL))  
  30.     {  
  31.         index++;  
  32.     
  33.         //https://msdn.microsoft.com/en-us/library/windows/desktop/ms724911(v=vs.85).aspx  
  34.         //szName-레지터스터 항목의 이름  
  35.         //dwType-항목의 타입여기에서는 널로 끝나는 문자열  
  36.         //szData-항목값이 저장될 배열  
  37.         //dwSize2-배열의 크기  
  38.         RegQueryValueEx(hKey, szName, NULL, &dwType, (LPBYTE)szData, &dwSize2);  
  39.         serialPort.AddString(CString(szData));  
  40.     
  41.         memset(szData, 0x00, sizeof(szData));  
  42.         memset(szName, 0x00, sizeof(szName));  
  43.         dwSize = 100;  
  44.         dwSize2 = 20;  
  45.     }  
  46.     
  47.     RegCloseKey(hKey);  
  48. }  


문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts