现在想做一个数据采集的功能,就是把程序收发的数据全部记录下来。当然,可以在程序内部在收发的时候就同时把数据写到文件,但是这样会影响到正常通讯,因为有的通讯对时间非常敏感,相差几毫秒都不行,所以是否可以做一个单独的外部exe来做这个事情?比如bus hound就有这个功能,虽然有时候会丢一两帧数据
请求大家指点, 前提是不影响原程序的正常通讯,通讯设备的VID和PID都是固定且已知的,如果用单独exe不好实现,有没有其他办法,比如开一个记录的线程?对通讯不太了解,谢谢各位!
13 个解决方案
#1
就用 bus hound 把数据保存下来吧!你这大半夜的不睡觉。。。
#2
但是bus hound不能自动保存数据,只能手动点save然后指定一个文件来保存,而且我希望是保存成我想要的格式,去掉通讯数据中的一些头和尾之类的。最好就是做一个exe后台记录,悄无声息
#3
bus hound 是不是挂载了一个过滤驱动来捕获IRP的,那么bus hound仍然会影响到通讯的效率。
可以在驱动中开一个记录线程 开辟一块缓存, 有数据传输时 将数据记录下来, 线程就慢慢写文件了。只是拷贝一些数据 是很快的
可以在驱动中开一个记录线程 开辟一块缓存, 有数据传输时 将数据记录下来, 线程就慢慢写文件了。只是拷贝一些数据 是很快的
#4
在驱动中开一个记录线程?太高端了吧。。。另外貌似开线程也不好记,因为我现在才发现那个封装的USB类被用来生成了一个lib库,然后程序是用lib库来通讯的。
#5
那你们和驱动通信的接口是不是在 封装的lib中。 没有源码吗, 有源码自己改, 方法一样的
#6
既然是写log,那就开线程单独写好了
#7
lib库中开线程怎么操作?lib库有源码
#8
开一个循环缓冲区,开启一个通信线程A,该线程不断的将数据写到缓冲区的尾部,使用一个尾部指针记录最后写的位置
开启一个线程B,从缓冲区中读出数据并保存,使用一个当前头指针指示未读的开始位置
A不断写入缓冲区,B不断的读出缓冲区,因为缓冲区是循环的,应该可以无限的进行下去。限制是读出的速度必须必写入快,否则缓冲区数据可能会被覆盖
开启一个线程B,从缓冲区中读出数据并保存,使用一个当前头指针指示未读的开始位置
A不断写入缓冲区,B不断的读出缓冲区,因为缓冲区是循环的,应该可以无限的进行下去。限制是读出的速度必须必写入快,否则缓冲区数据可能会被覆盖
#9
大致明白了,操作起来还得试一下。现在主要问题就是如何在lib库中开线程,因为程序是多处用到此lib库,那要多处开线程的话又麻烦了,涉及到同步之类的问题。。。
#10
原来程序里面的其他线程你都不用管了 一个线程写数据 一个线程读数据 相对来说控制不麻烦 lib嘛 没用过,。。。
#11
你可以不放到lib,专门搞一个模块来写数据等,lib只是调用,这样lib就不会被影响。相当于一个单独的日志模块类似
#12
循环链表缓冲就可以了
#13
可以就直接UDP发送到当地的一个端口,另一个程序读取写文件
#1
就用 bus hound 把数据保存下来吧!你这大半夜的不睡觉。。。
#2
就用 bus hound 把数据保存下来吧!你这大半夜的不睡觉。。。
但是bus hound不能自动保存数据,只能手动点save然后指定一个文件来保存,而且我希望是保存成我想要的格式,去掉通讯数据中的一些头和尾之类的。最好就是做一个exe后台记录,悄无声息
#3
bus hound 是不是挂载了一个过滤驱动来捕获IRP的,那么bus hound仍然会影响到通讯的效率。
可以在驱动中开一个记录线程 开辟一块缓存, 有数据传输时 将数据记录下来, 线程就慢慢写文件了。只是拷贝一些数据 是很快的
可以在驱动中开一个记录线程 开辟一块缓存, 有数据传输时 将数据记录下来, 线程就慢慢写文件了。只是拷贝一些数据 是很快的
#4
bus hound 是不是挂载了一个过滤驱动来捕获IRP的,那么bus hound仍然会影响到通讯的效率。
可以在驱动中开一个记录线程 开辟一块缓存, 有数据传输时 将数据记录下来, 线程就慢慢写文件了。只是拷贝一些数据 是很快的
在驱动中开一个记录线程?太高端了吧。。。另外貌似开线程也不好记,因为我现在才发现那个封装的USB类被用来生成了一个lib库,然后程序是用lib库来通讯的。
#5
那你们和驱动通信的接口是不是在 封装的lib中。 没有源码吗, 有源码自己改, 方法一样的
#6
既然是写log,那就开线程单独写好了
#7
既然是写log,那就开线程单独写好了
lib库中开线程怎么操作?lib库有源码
#8
开一个循环缓冲区,开启一个通信线程A,该线程不断的将数据写到缓冲区的尾部,使用一个尾部指针记录最后写的位置
开启一个线程B,从缓冲区中读出数据并保存,使用一个当前头指针指示未读的开始位置
A不断写入缓冲区,B不断的读出缓冲区,因为缓冲区是循环的,应该可以无限的进行下去。限制是读出的速度必须必写入快,否则缓冲区数据可能会被覆盖
开启一个线程B,从缓冲区中读出数据并保存,使用一个当前头指针指示未读的开始位置
A不断写入缓冲区,B不断的读出缓冲区,因为缓冲区是循环的,应该可以无限的进行下去。限制是读出的速度必须必写入快,否则缓冲区数据可能会被覆盖
#9
开一个循环缓冲区,开启一个通信线程A,该线程不断的将数据写到缓冲区的尾部,使用一个尾部指针记录最后写的位置
开启一个线程B,从缓冲区中读出数据并保存,使用一个当前头指针指示未读的开始位置
A不断写入缓冲区,B不断的读出缓冲区,因为缓冲区是循环的,应该可以无限的进行下去。限制是读出的速度必须必写入快,否则缓冲区数据可能会被覆盖
大致明白了,操作起来还得试一下。现在主要问题就是如何在lib库中开线程,因为程序是多处用到此lib库,那要多处开线程的话又麻烦了,涉及到同步之类的问题。。。
#10
原来程序里面的其他线程你都不用管了 一个线程写数据 一个线程读数据 相对来说控制不麻烦 lib嘛 没用过,。。。
#11
开一个循环缓冲区,开启一个通信线程A,该线程不断的将数据写到缓冲区的尾部,使用一个尾部指针记录最后写的位置
开启一个线程B,从缓冲区中读出数据并保存,使用一个当前头指针指示未读的开始位置
A不断写入缓冲区,B不断的读出缓冲区,因为缓冲区是循环的,应该可以无限的进行下去。限制是读出的速度必须必写入快,否则缓冲区数据可能会被覆盖
大致明白了,操作起来还得试一下。现在主要问题就是如何在lib库中开线程,因为程序是多处用到此lib库,那要多处开线程的话又麻烦了,涉及到同步之类的问题。。。
你可以不放到lib,专门搞一个模块来写数据等,lib只是调用,这样lib就不会被影响。相当于一个单独的日志模块类似
#12
循环链表缓冲就可以了
#13
可以就直接UDP发送到当地的一个端口,另一个程序读取写文件