如何在原始(非规范)模式下等待串行输入?

时间:2016-02-25 19:16:42

标签: c++ arduino serial-port

这个程序在PC上运行,我希望他等到Arduino的串行连接数据可用,并显示它们。如果Arduino没有发送任何东西,我希望程序无限期地等待。

会发生什么,我只收到Resource temporarily unavailable条消息。

Kurt Stutsman 的帮助之后,这是一个等待来自串行连接的二进制输入的工作程序,(在这种情况下来自Arduino)。

#include <string.h>
#include <iostream>
#include <stdint.h>
#include <errno.h>

#include <fcntl.h>    // File control definitions
#include <termios.h>  // POSIX terminal control definitions
#include <unistd.h>   // UNIX standard function definitions

using namespace std;


int connect(const char* serialport)
{
    struct termios toptions;
    int fd;

    fd = open(serialport, O_RDWR );

    if (fd == -1)  {
        return -1;
    }

    if (tcgetattr(fd, &toptions) < 0)
        return -1;

    speed_t brate = B9600; //9600 bauds
    cfsetospeed(&toptions, brate);
    cfmakeraw(&toptions);
    toptions.c_cc[VMIN]  = 1; //I want read to wait for the input
    toptions.c_cc[VTIME] = 0; //indefinitely, until it arrives. Byte after byte.

    tcsetattr(fd, TCSANOW, &toptions);
    if( tcsetattr(fd, TCSAFLUSH, &toptions) < 0) {
        return -1;
    }
    return fd;
}


int main() {
    int fd = connect("/dev/ttyACM0");
    if (fd==-1)
    {
        cout<<"Error in opening serial port\n";
        cout<<strerror(errno)<<'\n';
        return -1;
    }
    while(true)
    {
        uint8_t b=0;
        int ret=read(fd, &b, 1);
        if (ret == 1)
        {
            cout<<"received byte "<<int(b)<<'\n';
        } else if (ret == 0)
        {
            cout<<"EOF\n";
        } else
        {
            cout<<strerror(errno)<<'\n';
        }
    }
    return 0;
}

您可以使用这个简单的Arduino C ++代码进行测试:

void setup() {
  Serial.begin(9600);        // connect to the serial port
}

void loop()
{
    Serial.write(uint8_t(42));
    delay(1000);
}

0 个答案:

没有答案