- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何将 sock.async_read_some 的 read_handler 调用同步到特定频率,同时读取 812 字节的流(以 125 Hz 的频率流式传输)。
我有一个与从机器人读取流相关的问题。我对 boost asio 很陌生。我对这个概念知之甚少。这是我的代码中的示例 block 。 read_handler 所做的是,它处理来自机器人的数据。这个循环应该每 8 毫秒执行一次,这是我的采样时间,并且在它开始执行时,应该完成从机器人读取数据流。当我查看机器人的流数据时,数据每 8 毫秒出现一次。所以机器人数据没问题。但是 read_handler 的执行有点问题。例如,第一个循环从时间 = 0 开始,第二个循环从时间 = 2 开始,第三个循环从时间 = 16 开始,第四个循环从时间 = 18 开始,第五个循环再次从时间 = 32 开始。因此,触发时间循环的每一次从第一次变为第二次。但是在第三次它再次同步到 8 毫秒的倍数。我需要的是 read_handler 应该每 8 毫秒触发一次(当数据到达时),但它会在每两次调用(总共 16 毫秒)时捕获此采样时间。这是至关重要的,因为我正在进行计算,并在稍后将命令反馈给机器人(控制系统)。这段代码没有详细介绍发送命令等,只包含非常基本的数据处理。那么,是什么导致了调用之间的这些差异,我该如何解决?
我通过网络和堆栈溢出进行了搜索,但我无法遇到另一个与时间相关的问题。
void read_handler(const boost::system::error_code &ec, std::size_t bytes_transferred)
{
if (!ec)
{
thisLoopStart = clock();
loopInstant[iterationNum]=diffclock(startTime, endLoopTime);
std::cout << "Byte transfered: " << bytes_transferred << std::endl;
printf("Byte transfered: %d", bytes_transferred);
printf("Byte transfered: %d", bytes_transferred);
printf("Byte transfered: %d\n", bytes_transferred);
//std::cout << std::string(buffer.data(), bytes_transferred) << std::endl;
char myTempDoubleTime[8];
for (int j = 0; j<1; j++)
{
for (int i = 0; i < 8; i++ )
{
myTempDoubleTime[7-i]=buffer[4+i+8*j]; //636
}
memcpy(&controllerTime[iterationNum], myTempDoubleTime, 8);
}
endLoopTime = clock();
thisLoopDuration = diffclock(thisLoopStart, endLoopTime);
loopTimes[iterationNum] = thisLoopDuration;
if (iterationNum++>500)
{//io_service.~io_service();
//io_service.reset();
//io_service.run();
exitThread = 1;
printf("Program terminates...\n");
GlobalObjects::myFTSystem->StopAcquisition();
for(int i=1;i<iterationNum;i++)
fprintf(LoopDurations, "%f\t%f\t%f\n", loopTimes[i], controllerTime[i], loopInstant[i]);
fclose(LoopDurations);
closeConnectionToServer();
printf("Connection is closed...\n");
io_service.stop();
}
sock.async_read_some(boost::asio::buffer(buffer), read_handler);
}
}
最佳答案
如果传入流的时间由机器人本身控制,那么您就不必担心在某时某时尝试专门读取。如果您期望机器人每 X 秒爆发一次 812 字节,只需从您的客户端套接字中保持 async_reading。 boost::asio 将在读取完成后立即调用您的回调。
至于神秘的延迟,请尝试在调用 async_read_some 时明确说明缓冲区的大小,如下所示:
sock.async_read_some(boost::asio::buffer(buffer, 812), read_handler);
如果您确定您总是传输足够的数据来填充这样的缓冲区,那么这应该会导致您的回调被一致调用,因为提供给 boost::asio 的缓冲区已满。如果这不能解决您的问题,请按照 sehe 的建议执行并实现 dealine_timer您可以使用它来更好地基于时间控制您的异步操作。
编辑
您还应该检查 OnRead 处理程序中的 bytes_transferred 以确保您已从机器人进行了完整读取。现在你只是打印它。你可能有一个不完整的读取,这意味着你应该立即从套接字开始重复读取,直到你确定你已经消耗了你期望的所有数据。否则,您将尝试对不完整的数据采取行动,从而搞砸自己,很可能在那里失败,然后启动另一个 ::async_read
假设您正在开始一个干净的新读取,而实际上您是我们只是要读取您忽略并留在套接字上的旧数据,并开始对您的读取进行分段。
这可以解释为什么您会看到比预期间隔更短和更长的不一致时间。显式指定缓冲区大小并检查您在处理程序中传递的 bytes_transferred 将保证您捕获此类问题。另请查看文档,了解可以传递给::asio 的 completion_condition 类型,例如 ::transfer_exactly(num_bytes)
,但我不确定这些是否适用于异步读取操作。
关于c++ - 如何将 socket.async_read_some 的读取处理程序调用同步到特定频率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29647855/
我有一个包含 34 个变量和大约 25,000 个观测值的数据集。每个观察都涉及一个特定事件。它的格式如下: no id date .... 1 363 006
我已将 R 连接到 Twitter 并使用 R 中的 searchTwitter 函数进行抓取,并清除标点符号、小写字母等结果数据。现在我正在尝试执行以下操作: 计算自 2015 年 1 月 至 20
我正在研究项目,需要可视化频谱分析以设置一些精确参数。现在,我将垃圾箱转换为屏幕空间,因为在线性空间中,较低频率的幅度被压缩在一起。这是我在C++中的代码: float windowSize = 64
我正在尝试使用MATLAB导入WAV文件并创建如下所示的图表类型。我基本上是在尝试获取频率信息并根据分贝对其进行绘制。这是我正在使用的代码,但似乎无法正确提取频率信息: [x fs]=wavread(
我有一个 GUI,可以计算字符串中第一个字母的出现次数。我希望它以列格式计算所有字母,例如: 这是我到目前为止所拥有的: import java.awt.BorderLayout; import ja
我有一个由许多变量组成的全国调查,就像这个(为了简单起见,我省略了一些变量): year id y.b sex income married pens weight 2002
我被要求报告我们客户的联系频率,即每周、每月、每季度或每年看到多少客户。 当在论坛中讨论“频率”时,它们通常是指某个值在表中存在的次数。 我可以获得客户的联系人数量:- select A.cl
我正在尝试制作一款游戏,当麦克风发出足够响亮的声音时,我的角色会射击(在 Unity 中)。但是我不知道如何开始。 感谢您的帮助! 最佳答案 您可以通过使用 AudioSource.GetOutput
尝试计算字符数并改进我的代码,我做了一些更改,而不是使用 while 循环。好奇是否有人对我如何改进我的代码以使其更专业且更便宜有任何建议? #include int countingCharact
我正在创建一个 MySQL 数据库,其中包含大量带有时间戳的条目。这些条目将附加到特定用户和另一个索引(例如博客作者和他的几个网站)。计算用户/全局每日条目图表的最佳方法是什么。 我的两种方法是使用
我创建了一项调查并将其发送出去。该调查要求用户提供电子邮件,然后要求他们从包含 8 个不同选项的下拉菜单中选择要吃哪顿饭。有些人使用同一封电子邮件多次填写调查,但食物选择不同。 我有一个如下所示的 M
我有一个 MySQL 数据库: Date Customer_ID 我怎样才能把它变成: Customer_ID | Count_Visits_Past_Week | Count_Visits_
对于非常大的数据集,如何使用 gnuplot 仅在第一个和最后一个数据点的 x 轴上放置标记/标签? 最佳答案 在 gnuplot 4.6 及更高版本中,您可以使用命令 stats 'data.dat
我正在寻找一种方法来为具有共同词根/含义的单个词生成数值概率值。 用户将使用“舞者”、“跳舞”、“跳舞”等词生成内容。 如果“dancer”被提交了 30 次,跳舞了 5 次,我只需要一个值“danc
给定一个包含如下内容的数据集: [2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 65, 75, 85, 86, 87,
我想将声音的音高绘制成图表。 目前我可以绘制幅度。下图是由 getUnscaledAmplitude() 返回的数据创建的: AudioInputStream audioInputStream = A
在 Javascript 中,我试图获取一个初始的数值数组并计算其中的元素。理想情况下,结果将是两个新数组,第一个指定每个唯一元素,第二个包含每个元素出现的次数。不过,我愿意接受有关输出格式的建议。
我正在编写一个多线程OpenMPI应用程序,使用来自多个线程的MPI_Isend和MPI_Irecv在InfiniBand RDMA的各个列之间每秒交换数百条消息。 传输量约为400-800KByte
这个站点上有很多问题,询问如何在给定频率下创建简单的正弦波。我想做的是获取阵列或列表或任何频率,然后连续连续播放它们(而不是和弦),听起来有点像旧PC扬声器。我尝试使用Console.Beep,但是它
我使用我的App捕获声音。假设此声音是正弦1 KHz声音,并且存在背景声音。如何识别此1 KHz声音出现在声音上? 我的意思是,我可以想象如何在图像中找到元素,例如,如果您要在图像上寻找黄色正方形,那
我是一名优秀的程序员,十分优秀!