| 
 
| 
|  Author | Topic: Identifying a particular COM port  (Read 1825 times) |  |  
| 
| 
| g3nrw Junior Member
 
 
 member is offline
 
  
 
 
 
 
  
 
 Posts: 74
 
 | 
|  | Identifying a particular COM port « Thread started on: May 15th, 2014, 7:35pm »
 |  |  I want to communicate with a COM port that talks to a device using the Silicon Labs 210x driver.
 
 For example, on one particular machine, Windows Device Manager says in the "Ports(COM & LPT)" section:
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Silicon Labs CP210x USB to UART Bridge (COM5)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Is there a reliable way that BB4W can obtain this information programmatically, to identify that this driver communicates through COM5?
 
 --
 Ian
 
 |  
| 
|  |  Logged |  
 |  |  |  
| 
| 
| rtr Guest
 
 | 
|  | Re: Identifying a particular COM port « Reply #1 on: May 15th, 2014, 8:30pm »
 |  |  on May 15th, 2014, 7:35pm, g3nrw  wrote:
 | | Is there a reliable way that BB4W can obtain this information programmatically, to identify that this driver communicates through COM5? | 
 | 
 So you want to know how a BASIC program can obtain the information that Device Manager displays, yes?  The likelihood is that you will need to use WMI (Windows Management Instrumentation) for that:
 
 http://msdn.microsoft.com/en-us/library/aa394582.aspx
 
 Specifically, Win32_SerialPort would appear to be the relevant class:
 
 http://msdn.microsoft.com/en-us/library/aa394413.aspx
 
 I can't be sure which member contains the information you are interested in, but a bit of experimentation should provide the answer.
 
 Richard.
 
 |  
| 
| « Last Edit: May 15th, 2014, 8:50pm by rtr » |  Logged |  
 |  |  |  
| 
| 
| rtr Guest
 
 | 
|  | Re: Identifying a particular COM port « Reply #2 on: May 15th, 2014, 8:48pm »
 |  |  on May 15th, 2014, 8:30pm, Richard Russell  wrote:
 | | I can't be sure which member contains the information you are interested in, but a bit of experimentation should provide the answer. | 
 | 
 It looks like it is probably the Caption member:
 
 Code:
       INSTALL @lib$+"COMLIB"
      PROC_cominitlcid(1033)
      ON CLOSE PROCcleanup : QUIT
      ON ERROR PROCcleanup : SYS "MessageBox", @hwnd%, REPORT$, 0, 0 : END
      objSWbemLocator% = FN_createobject("WbemScripting.SWbemLocator")
      objWMIService% = FN_getobject(objSWbemLocator%, \
      \                            "ConnectServer(""."", ""root\CIMV2"")")
      objSWbemObjectSet% = FN_getobject(objWMIService%, \
      \                "execQuery(""select * from Win32_SerialPort"")")
      nObjs% = FN_getvalueint(objSWbemObjectSet%, "Count")
      IF nObjs%=0 ERROR 100, "No serial ports present"
      SYS !(!objSWbemObjectSet%+28), objSWbemObjectSet%, ^pEnum%
      IF pEnum%=0 ERROR 100, "SWbemObjectSet::NewEnum failed"
      DIM Variant{(nObjs%) type%, pad%, ldata%, hdata%}
      SYS !(!pEnum%+20), pEnum% : REM IEnumVARIANT::Reset
      FOR i% = 1 TO nObjs%
        SYS !(!pEnum%+12), pEnum%, 1, Variant{(i%)}, ^celtFetched%
        IF celtFetched%<>1 ERROR 100, "IEnumVARIANT::Next failed"
      NEXT i%
      SYS !(!pEnum%+8), pEnum% : REM IEnumVARIANT::Release
      FOR i% = 1 TO nObjs%
        PRINT "Port ";i%;" name is: ";
        dummy% = FN_getvariant(Variant{(i%)}.ldata%, "Caption", _ret{})
        IF _ret.vartype% = 8 THEN
          PRINT _ret.data$
        ELSE
          PRINT "Not available"
        ENDIF
      NEXT i%
      PROCcleanup
      END
      DEF PROCcleanup
      PROC_releaseobject(objSWbemLocator%)
      PROC_comexit
      ENDPROC Richard.
 |  
| 
| « Last Edit: May 15th, 2014, 9:03pm by rtr » |  Logged |  
 |  |  |  
| 
| 
| movr0r0 New Member
 
 
 member is offline
 
  
 
 
 
 
  
 
 Posts: 7
 
 | 
|  | Re: Identifying a particular COM port « Reply #3 on: Dec 28th, 2014, 10:40am »
 |  |  Hi Richard,
 
 This Win32_SerialPort WMI class support with your code example above works well to enumerate "COMx" ports and getting their actual number 'x', using the "DeviceID" Property.
 However, although everything is fine with Win7 (and I guess 8), when using this method on WinXP, enumeration stops at the first available port, without error.
 On-line MSDN doc appears to relate only to Vista onwards, and obviously there is no more hint about description or changes of the XP version of this class.
 
 Any idea on how to make it fully work on XP too?
 
 Thanks,
 R.
 |  
| 
|  |  Logged |  
 |  |  |  
| 
| 
| rtr2 Guest
 
 | 
|  | Re: Identifying a particular COM port « Reply #4 on: Dec 28th, 2014, 12:06pm »
 |  |  on Dec 28th, 2014, 10:40am, movr0r0  wrote:
 | | Any idea on how to make it fully work on XP too? | 
 | 
 I fear that if you can't make the WMI method work you will have to fall back to reading the Registry.  Do you really need to support XP, given its age and status?
 
 Richard.
 |  
| 
|  |  Logged |  
 |  |  |  
| 
| 
| movr0r0 New Member
 
 
 member is offline
 
  
 
 
 
 
  
 
 Posts: 7
 
 | 
|  | Re: Identifying a particular COM port « Reply #5 on: Dec 28th, 2014, 3:32pm »
 |  |  Many thanks for your quick reply, Richard!
 
 Supporting XP would be nice; I still have a couple of old laptops -- with real serial ports
  -- that prefer this aging version... 
 What's the best way to get Windows version from within bb4w?
 
 R.
 |  
| 
|  |  Logged |  
 |  |  |  
| 
| 
| movr0r0 New Member
 
 
 member is offline
 
  
 
 
 
 
  
 
 Posts: 7
 
 | 
|  | Re: Identifying a particular COM port « Reply #7 on: Dec 28th, 2014, 5:45pm »
 |  |  Many thanks again for your great help, Richard.
 
 R.
 |  
| 
|  |  Logged |  
 |  |  |  
| 
| 
| movr0r0 New Member
 
 
 member is offline
 
  
 
 
 
 
  
 
 Posts: 7
 
 | 
|  | Re: Identifying a particular COM port « Reply #8 on: Jan 20th, 2015, 09:59am »
 |  |  Hi!
 
 It looks like Windows Win32_SerialPort WMI class miserably fails to detect and list most of virtual serial ports (e.g. over an Ethernet link, such as Tibbo), and more annoyingly USB-to-serial adapters, such as ATEN or Prolific.
 
 Any idea about which method could be used to let Windows (and BBCBasic) nicely list what is reported in the "COM ports and LPT" section of the Device Manager?
 
 Thanks,
 R.
 |  
| 
|  |  Logged |  
 |  |  |  
| 
| 
| rtr2 Guest
 
 | 
|  | Re: Identifying a particular COM port « Reply #9 on: Jan 20th, 2015, 12:46pm »
 |  |  on Jan 20th, 2015, 09:59am, movr0r0  wrote:
 | | It looks like Windows Win32_SerialPort WMI class miserably fails to detect and list most of virtual serial ports | 
 | 
 I don't think you should blame Windows, it's more likely that some 'virtual' serial ports fail to follow the rules when they install themselves.  After all, you can pretty much guarantee that all serial ports on a modern PC are 'virtual' so it would be daft if WMI never worked.
 
 Quote:
 | | Any idea about which method could be used to let Windows (and BBCBasic) nicely list what is reported in the "COM ports and LPT" section of the Device Manager? | 
 | 
 I answered that before: "I fear that if you can't make the WMI method work you will have to fall back to reading the Registry".  But you would be entirely justified in using WMI and simply saying that your software is incompatible with 'non-conforming' virtual port drivers.
 
 Richard.
 |  
| 
|  |  Logged |  
 |  |  |  
 |