原始码

#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循环。

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

最佳答案

你的问题很奇怪。通常,问题在于速度较慢的一方无法读取速度较快的一方发送的内容。因此,看来您这里还有一个更基本的问题。

如果arduino_output是串行端口(UART)的表示,我建议使用特定于平台的访问方式。在Windows上,具有UART函数,在Linux上,具有termios(也可能在大多数其他类似POSIX的系统上)。这将为您提供一种控制通信参数,并获取有关事件(包括奇偶校验/成帧错误)的信息和/或通知的方法。

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

10-16 04:52