我想通过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);
}
}
}
答案 0 :(得分:2)
在使用FTDI USB转串口转换器时,必须注意连接设备的顺序。
将FTDI连接到计算机后,操作系统会看到一个新的串行设备。通常,这会使它尝试与串行设备握手(您可以在闪烁LED上的某些FTDI适配器板上看到rx / tx)。
但是,您的外围设备可能无法处理该握手并进入不一致或未知(对您)状态。
因此,首先将FTDI连接到计算机并然后将外围设备(您的笔式驱动器)连接到FTDI是很重要的。这可以确保设备看不到握手,您的程序可以直接与它通信。
答案 1 :(得分:1)
检查时间。在没有连接设备的情况下运行代码:它将结束,因为n == 0。我想程序在数据发送后运行,并且操作系统没有接收数据,因为端口未打开。当它运行正常时,因为你得到了启动程序和开启设备之间的时间。
为避免这种情况,请不要在返回0时停止循环。按下按键或经过一段时间后的状态。并删除一些printf以避免在控制台上看到太多消息。