除非第三方程序打开端口,否则无法读取串行数据

时间:2016-11-01 16:37:03

标签: c++ c arduino serial-port xbee

我试图通过串口从Xbee读取数据。如果我通过调用xbee_init()来初始化端口,那么我调用xbee_read()由于某种原因,我总是读取没有数据并得到-1的错误。然而,当我使用某些第三方程序(如gtkterm或Arduino串行监视器)查看端口时,我突然开始从我的程序中读取数据。然后它将正常工作,直到我结束我的程序并重新启动它,然后它又回来读取没有数据。

有谁知道为什么会这样?我用Xbee和Arduino对它进行了测试,它的行为相同。我从一个更大的C ++程序中调用这些函数。谢谢!

@if (User.IsInRole("Admin") || User.IsInRole("SuperUser") {
//Link goes here.
}

这是调用我的xbee函数的主函数。这是ROS项目的一部分,该节点旨在简单地通过串行读取xbee中的数据,并以10Hz的频率将其发布到/ xbee主题。

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <termios.h>
#include "../include/m545_wireless_communication/readXbee.h"

int xbee_init (char *port, struct termios *tty) {

    int fd=open(port,O_RDWR | O_NOCTTY | O_NONBLOCK);

    if(fd == -1){return 0;}
    else {
        if(tcgetattr(fd, tty)!=0){return 0;}
        else{
                cfsetospeed(tty, B57600);
                cfsetispeed(tty, B57600);

                tty->c_cflag &= ~PARENB;
                tty->c_cflag &= ~CSTOPB;
                tty->c_cflag &= ~CSIZE;
                tty->c_cflag |= CS8;
                tty->c_cflag &= ~CRTSCTS; 
                tty->c_cflag |= CLOCAL | CREAD;

                tty->c_iflag |= IGNPAR | IGNCR;
                tty->c_iflag &= ~(IXON | IXOFF | IXANY);
                tty->c_lflag |= ICANON;
                tty->c_oflag &= ~OPOST;
                tcsetattr(fd, TCSANOW, tty);

                }
            }

    return fd;
}


char* xbee_read (int fd, char *buffer) {

    if(fd){
        int n=read(fd,buffer,11);
        printf("%d\n", n);
        return buffer;
    }else{
        return NULL;
    }
}

void xbee_close(int fd){
    close(fd);
}

1 个答案:

答案 0 :(得分:0)

我能够弄清楚问题在于我是如何声明c_cflags的。需要在原始模式下读取Xbee,而不是自己设置标志我只使用cfmakeraw()。但是,我仍然不确定我到底做错了什么,或者如何打开第三方程序的端口有助于连接。

class ThreadController(Controller, threading.Thread):
    def __init__(self, *args, **kwargs):
        threading.Thread.__init__(self, target=self.run_forever)
        Controller.__init__(self, *args, **kwargs)
        self.daemon = True
        self.start()