Đây là những gì chức năng của tôi trông như thế để mở cổng nối tiếp (sử dụng Ubuntu 12.04):Xoá các cổng nối tiếp của bộ đệm
int open_port(void)
{
int fd; /* File descriptor for the port */
fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1)
{
// Could not open the port.
perror("open_port: Unable to open /dev/ttyUSB0 - ");
}
else
fcntl(fd, F_SETFL, 0);
struct termios options;
tcgetattr(fd, &options);
//setting baud rates and stuff
cfsetispeed(&options, B19200);
cfsetospeed(&options, B19200);
options.c_cflag |= (CLOCAL | CREAD);
tcsetattr(fd, TCSANOW, &options);
tcsetattr(fd, TCSAFLUSH, &options);
options.c_cflag &= ~PARENB;//next 4 lines setting 8N1
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
//options.c_cflag &= ~CNEW_RTSCTS;
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); //raw input
options.c_iflag &= ~(IXON | IXOFF | IXANY); //disable software flow control
return (fd);
}
gì vấn đề là, là khi tôi chạy chương trình này và nếu thiết bị nối tiếp của tôi đã được cắm vào, bộ đệm có nội dung trong đó. Tôi cần một cách để xóa bộ đệm trước khi tôi bắt đầu đọc nó. Tôi nghĩ rằng việc sử dụng tcsetattr(fd, TCSAFLUSH, &options);
sẽ khắc phục vấn đề này, bằng cách xóa bộ đệm IO trước khi khởi tạo cổng, nhưng không có may mắn như vậy. Có cái nhìn sâu sắc nào không?
hy vọng một người nào đó có thể khai sáng cho chúng tôi lý do tại sao điều này hoạt động :-) –
+1 Tôi cũng hơi bối rối vì điều này. –
Tôi nghĩ rằng đó là lỗi này trong hạt nhân Linux: xem http://lkml.iu.edu//hypermail/linux/kernel/0707.3/1776.html –