首先,数据读取部分开启了两个后台线程,一个负责串口的连接和测试;一个负责数据的接收。
几个基本概念:
- 建立连接和关闭连接。
- 开始记录和停止记录。
- 保存CSV文件。
1.查找COM端口,Urg_driver::find_ports调用Serial::find_ports()方法。
1 std::vector<std::string> Serial::find_ports(void) 2 { 3 //4D36E978-E325-11CE-BFC1-08002BE10318 4 GUID GUID_DEVINTERFACE_COM_DEVICE = { 5 0x4D36E978L, 0xE325, 0x11CE, 6 {0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18 } 7 }; 8 9 HDEVINFO hdi = SetupDiGetClassDevs(&GUID_DEVINTERFACE_COM_DEVICE, 0, 0, 10 DIGCF_PRESENT | DIGCF_INTERFACEDEVICE); 11 12 vector<string> found_ports; 13 if (hdi == INVALID_HANDLE_VALUE) { 14 return found_ports; 15 } 16 17 SP_DEVINFO_DATA sDevInfo; 18 sDevInfo.cbSize = sizeof(SP_DEVINFO_DATA); 19 for (int i = 0; SetupDiEnumDeviceInfo(hdi, i, &sDevInfo); ++i){ 20 enum { 21 BufferSize = 256, 22 ComNameLengthMax = 7, 23 }; 24 char buffer[BufferSize + 1]; 25 DWORD dwRegType; 26 DWORD dwSize; 27 28 SetupDiGetDeviceRegistryPropertyA(hdi, &sDevInfo, SPDRP_FRIENDLYNAME, 29 &dwRegType, (BYTE*)buffer, BufferSize, 30 &dwSize); 31 int n = (int)strlen(buffer); 32 if (n < ComNameLengthMax) { 33 continue; 34 } 35 36 char* p = strrchr(buffer, ')'); 37 if (p) { 38 *p = '