gpt4 book ai didi

从 linux 到 arduino 的 C++ ifstream

转载 作者:搜寻专家 更新时间:2023-10-31 01:37:04 24 4
gpt4 key购买 nike

原始代码

#include<iostream>
#include<fstream>
using namespace std;

int main()
{
ofstream arduino_output("/dev/ttyACM0");
ifstream arduino_input("/dev/ttyACM0");

int value;
string txt;

while(cin >> value){
arduino_output << value << endl;
arduino_input >> txt;//I never recieve the "OK" (Which I should get)
cout << txt;
}

arduino_input.close();
arduino_output.close();
return(0);
}

问题是:

        cin >> value;
arduino_output << value << endl;
arduino_input >> txt;//I never recieve the "OK" (Which I should get)
cout << txt;

但如果我这样做,它会起作用:

        cin >> value;
arduino_output << value << endl;

for(int i=0;i<10000;++i)
for(int j=0;j<10000;++j){ //Waste a lot of time
++value;
--value;
}

arduino_input >> txt; //I always recieve the "OK"
cout << txt; //I can see the "OK"

那么如何让我的快速计算机能够读取 arduino 的慢速输出? (无需使用 for 循环来浪费时间)

这里说了一些关于回调的事情http://www.cplusplus.com/reference/ios/ios_base/register_callback/但我永远无法让它工作。它说它支持 3 个事件,但都不是:“如果输入缓冲区不为空,则调用此函数”。

因为最终的解决方案是在输入缓冲区不为空时使用回调函数。

可接受的解决方案是 arduino 版本“Serial.available()”的 c++ 等效版本。

另一个可以接受的解决方案是任何迫使我不依赖两个 for 循环的方法。如果您这么想,3 个 for 循环是 Not Acceptable 。

EDIT1:显示原始代码
EDIT2:我正在使用 linux(lubuntu)
EDIT3:有人对代码的编写位置感到困惑。奇怪。

最佳答案

如果您的 arduino 开发板已连接 - 例如通过一些电缆连接到 Linux 笔记本电脑和你的 C++程序在 Linux 端(所以在 Arduino 微 Controller 上运行,你在独立 C 中编程),你最好直接使用 syscalls(2)和低级 IO(不是 C++ ifstream,它添加了一些缓冲)例如 open(2) & read(2) & write(2) & close(2)

读取 Advanced Linux Programming 。考虑使用 termios(3) 将您的 tty(揭秘 here )设置为原始模式。使用 poll(2) 复用(并等待)输入(或输出能力),例如就像 Arduino 内部的 Serial.available() 一样。

一些事件循环库(例如 libeventlibev )提供回调,但您可以围绕 poll 创建自己的事件循环。

要进行一些延迟,可以使用 usleep(3)(但很有可能,您需要改为轮询)。

附言。如果您的 Linux 应用程序是图形应用程序,使用一些 GUI 工具包,如 QtGTK,您应该使用该工具包提供的 event loop(该循环正在调用 pollselect 等...)。顺便说一句,您的问题实际上与 Arduino 无关,而是与串行端口相关(插入同一串行端口的任何其他设备都会出现相同的问题)。

关于从 linux 到 arduino 的 C++ ifstream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34798335/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com