• [硬件]Urg_viewer数据读取


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

    几个基本概念:

    • 建立连接和关闭连接。
    • 开始记录和停止记录。
    • 保存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 = '';
    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

      2.关于记录Record和停止记录的逻辑:

      开启记录是将接收线程start,停止采集是加锁之后设置一个状态变量,让接收线程退出。等待接收线程退出后,关闭URG连接,保存记录的文件。

     1 //开始记录数据
     2     bool start_recording(void)
     3     {
     4         QString save_timing = QDateTime::currentDateTime().toString("yyyyMMdd_hhmmss");
     5         recording_file_ = "received_" + save_timing + ".txt";
     6 
     7         original_connection_ = urg_.connection();
     8         //打开记录器
     9         if (!receive_recorder_.open(original_connection_,recording_file_.toStdString().c_str())) 
    10         {
    11             error_message_ = receive_recorder_.what();
    12             return false;
    13         }
    14         //打开URG
    15         if (!urg_.open(&receive_recorder_)) {
    16             return false;
    17         }
    18 
    19         receive_thread_.set_mode(Receive_thread::Recording);
    20         
    21         start_receiving();//开始接收数据
    22 
    23         return true;
    24     }
    25     //停止记录数据
    26     void stop_recording(void)
    27     {
    28         stop_measurement();
    29         urg_.close();
    30         receive_recorder_.close();
    31 
    32         delete original_connection_;
    33         original_connection_ = NULL;
    34 
    35         recorder_widget_.stop_recording();
    36         receive_thread_.set_mode(Receive_thread::Normal);
    37     }
    start_recording

      3.需要思考和解决的问题:

    • 点击开始采集数据,建立文件,停止采集保存文件。
    • 保存行列号,形成Organized有序点云,这个要优先实现,保证后面的数据校正!
    • 负责连接的线程是一直运行的吗?如何与负责数据接收的线程产生通讯和交互?(分析:连接线程的Run函数执行完毕,应该线程就退出了,因此没有与数据接收线程进行交互,接收线程自己会在中途断开激光的情况下报错。)
    • Win7下运行能够发现端口号,但是同样的代码在Win10下发现不了端口号?

  • 相关阅读:
    HTML5开发手机项目—个人总结
    将win7电脑无线网变身WiFi热点,让手机、笔记本共享上网
    Docker Compose 入门使用指南
    使用Phoenix通过sql语句更新操作hbase数据
    分布式版本管理git学习资料整理推荐
    博客迁移至新平台ixirong.com
    浅谈PipelineDB系列一: Stream数据是如何写到Continuous View中的
    Postgres是如何管理空值的
    如何简单愉快的上手PipelineDB
    nanomsg 如何写数据到PipelineDB
  • 原文地址:https://www.cnblogs.com/yhlx125/p/6550095.html
Copyright © 2020-2023  润新知