/******************************************************************************* * * FindAppUART.cpp - PC command line utility for enumerating MSP430 EVM's * Application UARTs. * * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * Neither the name of Texas Instruments Incorporated nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ //------------------------------------------------------------------------------ // Desc: PC command line utility for enumerating MSP430 EVM's Application UARTs. // The application returns the COM port number of the first UART that is // found. If this is successful the error code is set to '0'. In case of // the UART string could not be determined '1' is returned. // // The code was developed with the Express Edition of Visual C++ 2008 // http://www.microsoft.com/express/ // // Ver.: 0.1 (February 2011) // - Alpha version // // Auth: Andreas Dannenberg // MSP430 Applications // Texas Instruments, Inc. //------------------------------------------------------------------------------ // Windows Header Files #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff // from Windows headers #include #include #include #include // "setupapi.lib" must be linked // to the project // C Runtime Header Files #include #include #include //------------------------------------------------------------------------------ // DWORD WINAPI EnumComPorts(DWORD dwIndex, LPTSTR lptszName, // DWORD dwNumOfElements) // // User-mode code fragment to identify attached VCP COMnn port[s] with a // specific device instance ID based on USB VID and PID and returns the COMnn // port that the OS embeds into the device instance ID. When called with // dwIndex = 0, the function will enumerate all COMPORT class devices and // return the name of the first one that was found. Subsequent calls using an // incremented dwIndex parameter can be performed until ERROR_NO_MORE_ITEMS // is returned. // // IN: dwIndex COMPORT class device # 0, 1, 2, ... to check // dwNumOfElements The size of the lptszName buffer // OUT: lptszName COMnn name of given device # // return() ERROR_SUCCESS - lpszName is valid // ERROR_NO_MORE_ITEMS - End of device list reached //------------------------------------------------------------------------------ DWORD WINAPI EnumComPorts(DWORD dwIndex, LPTSTR lptszName, DWORD dwNumOfElements) { HDEVINFO hDevInfo; SP_DEVINFO_DATA DeviceInfoData; DWORD i; TCHAR *pcParse; // Create a HDEVINFO with all present devices hDevInfo = SetupDiGetClassDevs( NULL, 0, // Enumerator 0, DIGCF_PRESENT | DIGCF_ALLCLASSES); if (INVALID_HANDLE_VALUE == hDevInfo) { return GetLastError(); } // Enumerate through all devices in set DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); i++) { LPTSTR buffer = NULL; DWORD buffersize = 0; // Get the device instance ID that is associated with the device information element while (!SetupDiGetDeviceInstanceId( hDevInfo, &DeviceInfoData, buffer, buffersize, &buffersize)) { if (buffer) { LocalFree(buffer); } if (ERROR_INSUFFICIENT_BUFFER == GetLastError()) { // Change the buffer size. Double the size to avoid problems on // W2K MBCS systems per KB 888609. buffer = (LPTSTR)LocalAlloc(LPTR, buffersize * 2); } else { // Error: could not get device instance ID // Cleanup and return error code SetupDiDestroyDeviceInfoList(hDevInfo); return GetLastError(); } } if (buffer) { // Look for the "Application UART" of common MSP430 EVMs. The application UART // has an USB VID of 0x0451 (Texas Instruments) and an PID of 0xF432. const TCHAR testval[] = _T("USB\\VID_0451&PID_F432&MI_00"); if (NULL != _tcsstr(buffer, testval)) { TCHAR szFriendlyName[MAX_PATH]; if (SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_FRIENDLYNAME, NULL, (PBYTE)szFriendlyName, sizeof(szFriendlyName) - 1, NULL)) { // Check if we have reached the dwIndex-th element, if not keep looking if (dwIndex == 0) { // Find pointer to "COM" substring (secure) szFriendlyName[sizeof(szFriendlyName) - 1] = 0x00; pcParse = _tcsstr(szFriendlyName, _T("COM")); if (pcParse != NULL) { // Zero-terminate COM port string after last digit if (!isdigit(pcParse[4])) { pcParse[4] = 0; } else if (!isdigit(pcParse[5])) { pcParse[5] = 0; } else { pcParse[6] = 0; } // Pass string to the return parameter _tcscpy_s(lptszName, dwNumOfElements, pcParse); // Cleanup SetupDiDestroyDeviceInfoList(hDevInfo); return ERROR_SUCCESS; } } else { dwIndex--; } } } } } // Cleanup SetupDiDestroyDeviceInfoList(hDevInfo); return ERROR_NO_MORE_ITEMS; } //------------------------------------------------------------------------------ // Main application entry point. Simply return the first Application UART // COM port that was found to STDOUT. //------------------------------------------------------------------------------ int _tmain(int argc, _TCHAR* argv[]) { TCHAR szDeviceName[MAX_PATH]; DWORD dwReturnValue; dwReturnValue = EnumComPorts(0, szDeviceName, _countof(szDeviceName)); if (dwReturnValue == ERROR_SUCCESS) { _ftprintf_s(stdout, _T("%s\r\n"), szDeviceName); return 0; } return 1; }