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

几个基本概念:

  • 建立连接和关闭连接。
  • 开始记录和停止记录。
  • 保存CSV文件。

  1.查找COM端口,Urg_driver::find_ports调用Serial::find_ports()方法。

 std::vector<std::string> Serial::find_ports(void)
{
//4D36E978-E325-11CE-BFC1-08002BE10318
GUID GUID_DEVINTERFACE_COM_DEVICE = {
0x4D36E978L, 0xE325, 0x11CE,
{0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18 }
}; HDEVINFO hdi = SetupDiGetClassDevs(&GUID_DEVINTERFACE_COM_DEVICE, , ,
DIGCF_PRESENT | DIGCF_INTERFACEDEVICE); vector<string> found_ports;
if (hdi == INVALID_HANDLE_VALUE) {
return found_ports;
} SP_DEVINFO_DATA sDevInfo;
sDevInfo.cbSize = sizeof(SP_DEVINFO_DATA);
for (int i = ; SetupDiEnumDeviceInfo(hdi, i, &sDevInfo); ++i){
enum {
BufferSize = ,
ComNameLengthMax = ,
};
char buffer[BufferSize + ];
DWORD dwRegType;
DWORD dwSize; SetupDiGetDeviceRegistryPropertyA(hdi, &sDevInfo, SPDRP_FRIENDLYNAME,
&dwRegType, (BYTE*)buffer, BufferSize,
&dwSize);
int n = (int)strlen(buffer);
if (n < ComNameLengthMax) {
continue;
} char* p = strrchr(buffer, ')');
if (p) {
*p = '\0';
} p = strstr(&buffer[n - ComNameLengthMax], "COM");
if (! p) {
continue;
} found_ports.push_back(p);
}
SetupDiDestroyDeviceInfoList(hdi); return found_ports;
}

Serial::find_ports

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

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

 //开始记录数据
bool start_recording(void)
{
QString save_timing = QDateTime::currentDateTime().toString("yyyyMMdd_hhmmss");
recording_file_ = "received_" + save_timing + ".txt"; original_connection_ = urg_.connection();
//打开记录器
if (!receive_recorder_.open(original_connection_,recording_file_.toStdString().c_str()))
{
error_message_ = receive_recorder_.what();
return false;
}
//打开URG
if (!urg_.open(&receive_recorder_)) {
return false;
} receive_thread_.set_mode(Receive_thread::Recording); start_receiving();//开始接收数据 return true;
}
//停止记录数据
void stop_recording(void)
{
stop_measurement();
urg_.close();
receive_recorder_.close(); delete original_connection_;
original_connection_ = NULL; recorder_widget_.stop_recording();
receive_thread_.set_mode(Receive_thread::Normal);
}

start_recording

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

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

[硬件]Urg_viewer数据读取的更多相关文章

  1. 数据读取速度达1.5G/s,UFS 2.1存储技术曝光

    目前最快的是苹果NVME,当然UFS2.1也不差 iPhone6s与iPhone6s Plus在硬件的规格上有了很大的提升,但是它们身上的变化远没有苹果在发布会上所提到的A9处理器.1200万摄像头以 ...

  2. 【caffe I/O】数据读取层 代码中文注释

    caffe.proto中DataParameter部分 message DataParameter { //输入数据使用的DB类型 enum DB { LEVELDB = ;//使用LEVELDB L ...

  3. OleDbDataReader快速数据读取方式

    查询得到OleDbDataReader后,有三种方式支持数据读取,如下: //方法一**速度中等 OleDbDataReader reader = command.ExecuteReader(); w ...

  4. DataTable to Excel(使用NPOI、EPPlus将数据表中的数据读取到excel格式内存中)

    /// <summary> /// DataTable to Excel(将数据表中的数据读取到excel格式内存中) /// </summary> /// <param ...

  5. geotrellis使用(二)geotrellis-chatta-demo以及geotrellis框架数据读取方式初探

    在上篇博客(geotrellis使用初探)中简单介绍了geotrellis-chatta-demo的大致工作流程,但是有一个重要的问题就是此demo如何调取数据进行瓦片切割分析处理等并未说明,经过几天 ...

  6. GPS数据读取与处理

    GPS数据读取与处理 GPS模块简介 SiRF芯片在2004年发布的最新的第三代芯片SiRFstar III(GSW 3.0/3.1),使得民用GPS芯片在性能方面登上了一个顶峰,灵敏度比以前的产品大 ...

  7. 【原】Learning Spark (Python版) 学习笔记(二)----键值对、数据读取与保存、共享特性

    本来应该上周更新的,结果碰上五一,懒癌发作,就推迟了 = =.以后还是要按时完成任务.废话不多说,第四章-第六章主要讲了三个内容:键值对.数据读取与保存与Spark的两个共享特性(累加器和广播变量). ...

  8. MATLAB对于文本文件(txt)数据读取的技巧总结(经典中的经典)

    振动论坛原版主eight的经典贴http://www.chinavib.com/thread-45622-1-1.html MATLAB对于文本文件(txt)进行数据读取的技巧总结(经典中的经典)由于 ...

  9. TableInputFormat分片及分片数据读取源码级分析

    我们在MapReduce中TextInputFormat分片和读取分片数据源码级分析 这篇中以TextInputFormat为例讲解了InputFormat的分片过程以及RecordReader读取分 ...

随机推荐

  1. linux log

    adb shell logcat GOODIX:v *:s cat /proc/kmsg | grep "<<" ./cbootimg.sh adb shell get ...

  2. IOS 请求数据解析 XML 和 JSON

    好久没写文章了,回忆一下以前的内容记录一下吧. 这一段主要接触的就是数据解析,就说一下数据解析 现在数据解析一般解析两种数据 xml 和 JSON 那就从xml解析说起吧 xml解析需要用到一个类 N ...

  3. day_5.02 py

    ''' 2018-5-2 18:43:54 设计4s店类 设计模式: 简单工厂模式(通过一个类的分离模式) 讨论耦合性的问题 类与类之间应该是低耦合性 通过有个 初始化 __init__ 来解耦 这样 ...

  4. 关于OpenJDK和Orcale JDK区别

    一.环境Centos 今天搞tomcat发现了一个问题,众所周知,tomcat需要java环境支持,然后我今天就想着尝试yum安装java,命令 yum install -y java* 确实可以安装 ...

  5. python列表操作方法

    系统的列表操作方法不加赘述,这里增添一些列表操作技巧: 1.利用sum函数把多元列表变成一元: >>> texts_filtered_stopwords [['writing', ' ...

  6. MySQL使用mysqldump备份及还原

    MySQL可以使用mysqldump进行数据的逻辑备份,配合开启bin log日志可以实现数据的全量恢复及增量恢复 MySQL版本查看 修改配置文件记录bin log日志 [mysqld] #bin ...

  7. CentOs安装和使用

    ● 去掉图形界面 http://blog.csdn.net/op_zoro/article/details/44993881 ● centos 7覆盖windows vi /boot/grub2/gr ...

  8. 常见的压缩文件格式案例tarZ

    在AIX上最常见的压缩文件就是.tar压缩格式的文件了.  而除了tar文件以外,有时会遇到数据是用其它的压缩文件格式,所以偶顺手整理了一些常见的压缩文件格式,在AIX要怎么解压缩 : 一. .tar ...

  9. VMware与Centos系统安装 和重置root密码

    VMware与Centos系统安装   今日任务 1.Linux发行版的选择 2.vmware创建一个虚拟机(centos) 3.安装配置centos7 4.xshell配置连接虚拟机(centos) ...

  10. struts2 中 paramsPrepareParamsStack 拦截器

    struts2二次参数拦截器内容: 规定了请求的执行顺序 在struts2中,其拦截器为框架精华部分,而二次参数拦截器paramsPrepareParamsStack  对于解决数据回显,对象修改属性 ...