通过C程序从FTDI芯片读取数据

通过C程序从FTDI芯片读取数据,c,C,我正在研究FTDI芯片(VNC2评估板)。我想通过我的程序读取芯片上的串行数据。我现在拥有的读取串行数据的代码是 #include <stdio.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <termios.h> #include <signal.h>

我正在研究FTDI芯片(VNC2评估板)。我想通过我的程序读取芯片上的串行数据。我现在拥有的读取串行数据的代码是

#include <stdio.h>   
#include <string.h>  
#include <unistd.h>  
#include <fcntl.h>   
#include <errno.h>   
#include <termios.h> 
#include <signal.h>
#include <sys/time.h>
#include <signal.h>

void main()
{
    int portfd,rd;
    int n,f,len=0,t;
    char buf,*s;
    struct termios oldtio,newtio;
    portfd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY);
    if (portfd<0) printf("Error opening port\n");
    else if(portfd>0)
    {
        printf("Serial Port open . portfd=%d\n",portfd);
        tcgetattr(portfd,&oldtio);
        bzero(&newtio, sizeof(newtio));
        cfsetispeed(&newtio, B115200);
                cfsetospeed(&newtio, B115200);
                newtio.c_cflag |= (CLOCAL | CREAD);
                newtio.c_cflag &= ~PARENB; // set parity to no 
                newtio.c_cflag &= ~CSTOPB;  /*set one stop bit */
                newtio.c_cflag &= ~CSIZE;   /* Mask the character size bits */
                newtio.c_cflag |= CS8;      /* 8 bit data */
                newtio.c_cflag &= ~(ICANON | ECHO | ECHOE |ISIG);
                newtio.c_iflag &= ~(IXON | IXOFF | IXANY);
                newtio.c_oflag &= ~OPOST;
        newtio.c_cflag     &=  ~CRTSCTS;       // no flow control
            newtio.c_lflag     =   0;          // no signaling chars, no echo, no canonical processing
            newtio.c_oflag     =   0;                  // no remapping, no delays
            newtio.c_cc[VMIN]      =   0;                  // read doesn't block
            newtio.c_cc[VTIME]     =   5;
        tcflush(portfd, TCIFLUSH);

            if(tcsetattr (portfd, TCSANOW, &newtio) != 0)
            {
                    printf("Error from tcsetattr\n");
            }
        n = fcntl(portfd, F_GETFL, 0);
        (void)fcntl(portfd, F_SETFL, n & ~O_NDELAY);
        while(1){

                    rd= read(portfd,&buf,sizeof(char));
                //sleep(3);
                    if(rd==-1) printf("Reading error rd:%d\n",rd);
            else if(!rd) printf("No Data to read rd:%d\n",rd);
            else 
            printf(" data read  %c %d\n",buf,(int)buf);
        }

            tcsetattr(portfd, TCSANOW, &oldtio);
    }
    close(portfd);
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
void main()
{
国际港口,路;
int n,f,len=0,t;
char-buf,*s;
结构termios oldtio、NERTIO;
portfd=open(“/dev/ttyUSB0”,O|RDWR | O|NOCTTY);
如果(端口FD0)
{
printf(“串行端口打开。端口fd=%d\n”,端口fd);
tcgetattr(portfd和oldtio);
bzero(&newtio,sizeof(newtio));
cfsetispeed(&newtio,B115200);
cfsetospeed(和newtio,B115200);
newtio.c|u cflag |=(CLOCAL | CREAD);
newtio.c\u cflag&=~PARENB;//将奇偶校验设置为否
newtio.c_cflag&=~CSTOPB;/*设置一个停止位*/
newtio.c_cflag&=~CSIZE;/*屏蔽字符大小位*/
newtio.c_cflag |=CS8;/*8位数据*/
newtio.c|cflag&=~(ICANON | ECHO | ECHO | ISIG);
newtio.c|u iflag&=~(IXON | IXOFF | IXANY);
newtio.c_of lag&=~OPOST;
newtio.c\u cflag&=~CRTSCTS;//无流量控制
newtio.c_lflag=0;//没有信令字符,没有回音,没有规范处理
newtio.c_of lag=0;//没有重新映射,没有延迟
newtio.c_cc[VMIN]=0;//读取不阻塞
newtio.c_cc[VTIME]=5;
tcflush(端口fd、TCIFLUSH);
if(tcsetattr(端口fd、TCSANOW和newtio)!=0)
{
printf(“来自tcsetattr\n的错误”);
}
n=fcntl(端口fd,F_GETFL,0);
(无效)fcntl(港口FD、F_SETFL、n和O_NDELAY);
而(1){
rd=读取(portfd,&buf,sizeof(char));
//睡眠(3);
如果(rd==-1)printf(“读取错误rd:%d\n”,rd);
否则,如果(!rd)printf(“没有要读取的数据,rd:%d\n”,rd);
其他的
printf(“数据读取%c%d\n”,buf,(int)buf);
}
tcsetattr(端口FD、TCSANOW和oldtio);
}
关闭(端口FD);
}
但我仍然不能读取数据。 请帮我继续


谢谢。

哪个部分在@icktoofay数据读取部分失败。就像我和FTDI芯片无关,它的固件会处理好的。但是芯片上的串行数据正是我想要获取的。或多或少,我希望代码像minicom一样工作。我想更具体地说,我想问的是,它是输出<代码>读取错误还是什么?具体来说,发生了什么,它应该做什么?串行设置正确吗?您是否可以使用像putty这样的终端连接到设备?@ppeterka66正在发生这种情况。我也能使用循环和数组读取数据。但我不确定正在读取的数据,因为我无法以正确的格式显示它们。