从C中的串口读取

时间:2014-09-30 10:33:27

标签: serial-port arduino xbee

我正在尝试用XBee从Arduino(不断发送char'4')中读取。

我尝试过从PC写入Arduino,它可以工作,所以连接是正确的。

当我执行de follow代码时,终端没有显示任何内容并且没有完成程序,所以它在阅读时卡住了。

#include <stdio.h>     // Standard input / output functions
#include <stdlib.h>
#include <string.h>     // String function definitions
#include <unistd.h>     // UNIX standard function definitions
#include <fcntl.h>      // File control definitions
#include <errno.h>      // Error number definitions
#include <termios.h>    // POSIX terminal control definitions
#define XBEE "/dev/ttyUSB0"
#define BAUDRATE B9600

int main(int argc,char** argv)
{
    struct termios tio;
    struct termios stdio;
    struct termios old_stdio;

    int tty_fd = open(XBEE , O_RDWR| O_NOCTTY);

    cfsetospeed(&tio,BAUDRATE);
    cfsetispeed(&tio,BAUDRATE);            // Baudrate is declared above
    tcsetattr(tty_fd,TCSANOW,&tio);
    // for(i;i<5;i++){
    // write(tty_fd,&c,1); //If new data is available on the console, send it to the serial port
    // write(tty_fd,&o,1); //If new data is available on the console, send it to the serial port

    // }
    int n=0;
    char buf = '\0';

    /* Whole response*/

    do
    {
       n = read( tty_fd, &buf, sizeof(char) );
    }
    while( n > 0);

    if (n < 0)
    {
        printf("ERROR READING");
    }
       else if (n == 0)
    {
        printf("Read nothing!");
    }
    else
    {
        printf("Response: %c",buf);
    }
    close(tty_fd);
    tcsetattr(STDOUT_FILENO,TCSANOW,&old_stdio);
    return EXIT_SUCCESS;
}

我该如何解决这个问题?

更新

我尝试了其他代码并收到警告:关闭输出刷新然后终端冻结。

#include <stdio.h>      // Standard input / output functions
#include <stdlib.h>
#include <string.h>     // String function definitions
#include <unistd.h>     // UNIX standard function definitions
#include <fcntl.h>      // File control definitions
#include <errno.h>      // Error number definitions
#include <termios.h>    // POSIX terminal control definitions
#define XBEE "/dev/ttyUSB0"
#define BAUDRATE B9600

int main(int argc,char** argv)
{
    struct termios tio;
    struct termios stdio;
    struct termios old_stdio;
    struct termios options;

    int tty_fd = open(XBEE , O_RDWR | O_NOCTTY | O_NDELAY);

    cfsetospeed(&tio,BAUDRATE);
    cfsetispeed(&tio,BAUDRATE);            // Baudrate is declared above
    tcsetattr(tty_fd,TCSANOW,&tio);

    options.c_cflag &= ~PARENB;
    options.c_cflag &= ~CSTOPB;
    options.c_cflag &= ~CSIZE;
    options.c_cflag |= CS8;
    // for(i;i<5;i++){
    // write(tty_fd,&c,1);//if new data is available on the console, send it to serial port
    // write(tty_fd,&o,1);//if new data is available on the console, send it to serial port

    // }
    int n=0;
    char buf = '1';
    int i = 1;
    /* Whole response*/

    while(i==1){
        n = read( tty_fd, &buf, sizeof(char) );

        if (n < 0)
        {
            printf("ERROR READING");
        }
           else if (n == 0)
        {
            printf("Read nothing!");
        }
        else
        {
            printf("Response: %c",buf);
            close(tty_fd);
            break;
        }
    }
    tcsetattr(STDOUT_FILENO,TCSANOW,&old_stdio);
    return EXIT_SUCCESS;
}

2 个答案:

答案 0 :(得分:0)

如果您要打印数据,为什么要使用printf?您必须使用Arduino IDE中的Serial.print()语法。

答案 1 :(得分:0)

如果您打算使用C与XBee模块进行通信,您可能需要查看此Open Source XBee Host library。您可以在代码中使用串行驱动程序,或者将xbee_term示例程序看作一个简单的终端。