从c程序读取串行数据部分工作

时间:2013-11-23 09:08:16

标签: c ftdi

我想通过c程序读取连接到FTDI板的笔驱动器数据的内容。我有以下代码,我可以使用它来读取部分数据,但有时也不会在每次我将电路板连接到PC时发生。你能否告诉我应该对代码进行哪些更改

#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<errno.h>
#include <termios.h>
#include <unistd.h>
#include<string.h>
int n = 0;
struct termios tty;
struct termios tty_old;


main()
{
    unsigned char buf[100];
    int fd;
    fd= open("/dev/ttyUSB0", O_RDWR| O_NOCTTY);

    if(fd>0)
    {
         printf("Port opened\n");
    }
    memset (&tty, 0, sizeof tty);
    printf("set attributes\n");
    /* Error Handling */
    if ( tcgetattr ( fd, &tty ) != 0 )
    {
        printf("Error from tcgetattr:%d \n",strerror(errno));
    }

    /* Save old tty parameters */
    tty_old = tty;
    memset(&tty,0,sizeof(tty));
        tty.c_iflag=0;
        tty.c_oflag=0;
    tty.c_lflag=0;


    /* Set Baud Rate */
    cfsetospeed (&tty, (speed_t)B9600);
    cfsetispeed (&tty, (speed_t)B9600);

    /* Setting other Port Stuff */
    tty.c_cflag     &=  ~PARENB;        // Make 8n1
    tty.c_cflag     &=  ~CSTOPB;
    tty.c_cflag     &=  ~CSIZE;
    tty.c_cflag     |=  CS8;

    tty.c_cflag     &=  ~CRTSCTS;       // no flow control
    tty.c_cc[VMIN]      =   1;                  // read doesn't block
    tty.c_cc[VTIME]     =   5;                  // 0.5 seconds read timeout
    tty.c_cflag     |=  CREAD | CLOCAL;     // turn on READ & ignore ctrl lines

    /* Make raw */
    cfmakeraw(&tty);


    /* Flush Port, then applies attributes */
    tcflush( fd, TCIFLUSH );
    if (tcsetattr (fd, TCSANOW, &tty) != 0)
    {
        printf("Error from tcsetattr:%d \n");
    }


    while(1)
    {
        printf("Do read and write\n");
        n = read(fd,&buf, sizeof buf);
        if (n < 0)
        {
            printf("Error reading:\n ");
            break;
        }
        else if (n == 0)
        {
                printf("Read nothing!\n");
            break;
        }
        else
        {
            buf[n]='\0';
            printf("%s",buf);
        }
    }   
}

2 个答案:

答案 0 :(得分:2)

在使用FTDI USB转串口转换器时,必须注意连接设备的顺序。

将FTDI连接到计算机后,操作系统会看到一个新的串行设备。通常,这会使它尝试与串行设备握手(您可以在闪烁LED上的某些FTDI适配器板上看到rx / tx)。

但是,您的外围设备可能无法处理该握手并进入不一致或未知(对您)状态。

因此,首先将FTDI连接到计算机并然后将外围设备(您的笔式驱动器)连接到FTDI是很重要的。这可以确保设备看不到握手,您的程序可以直接与它通信。

答案 1 :(得分:1)

检查时间。在没有连接设备的情况下运行代码:它将结束,因为n == 0。我想程序在数据发送后运行,并且操作系统没有接收数据,因为端口未打开。当它运行正常时,因为你得到了启动程序和开启设备之间的时间。

为避免这种情况,请不要在返回0时停止循环。按下按键或经过一段时间后的状态。并删除一些printf以避免在控制台上看到太多消息。