首先,数据读取部分开启了两个后台线程,一个负责串口的连接和测试;一个负责数据的接收。

几个基本概念:

  • 建立连接和关闭连接。
  • 开始记录和停止记录。
  • 保存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 = '\0';
39         }
40 
41         p = strstr(&buffer[n - ComNameLengthMax], "COM");
42         if (! p) {
43             continue;
44         }
45 
46         found_ports.push_back(p);
47     }
48     SetupDiDestroyDeviceInfoList(hdi);
49 
50     return found_ports;
51 }
Serial::find_ports

相关文章: