0
我從Linux上的串口讀取這個奇怪的問題。大約有50%的時間,當我讀取數據時,我不會從串口獲取任何數據,但如果使用GTKTerm,我可以在100%的時間內恢復數據。我已經仔細檢查了我的設置,並且我使用的終端設置與GTKTerm使用的完全相同,所以我很困惑爲什麼會出現這種情況。我能想到的唯一的事情是,端口被設置爲規範模式,而不是原始模式,但我正確設置 - 我正在閱讀的設備不會將所有命令的換行符都發送回去。但是,當設備使用換行符發回命令時,一切正常。串口不能讀
下面是我使用的代碼:
int fd = open(serial_port, O_RDWR);
if(fd < 0){
perror("open");
}
//Set the serial port settings
struct termios newio;
if(tcgetattr(fd, &newio) < 0)
perror("tcgetattr");
if(cfsetospeed(&newio, B9600) < 0)
perror("cfsetospeed");
newio.c_cflag &= ~CSTOPB;
newio.c_cflag &= ~CSIZE;
newio.c_cflag |= CS8;
newio.c_cflag |= CREAD;
newio.c_iflag |= IGNPAR;
newio.c_iflag |= IGNBRK;
newio.c_iflag &= ~BRKINT;
newio.c_iflag &= ~ICRNL;
newio.c_iflag &= ~IXON;
newio.c_cflag |= CLOCAL;
newio.c_oflag = 0;
newio.c_lflag = 0;
newio.c_cc[VTIME] = 0;
newio.c_cc[VMIN] = 1;
if(tcsetattr(fd, TCSANOW, &newio) < 0)
perror("tcsetattr");
tcflush(fd, TCOFLUSH);
tcflush(fd, TCIFLUSH);
識別代碼(在單獨的線程)
void* thr(void* ign){
char buffer[10];
while(1){
int got = read(fd, buffer, 10);
buffer[got] = 0;
printf("got %s\n", buffer);
}
}
您可以包含您用於從該fd讀取/寫入的代碼示例嗎?您可能還需要'strace GTKTerm'和您的代碼,並從每個'TCSETS'ioctl調用中進行比較。 – je4d 2012-04-02 19:46:50
@ rm5248:配置端口的代碼似乎沒問題。也許I/O如何完成是問題。另外,當你的程序打開並且GTK打開它時,一定要仔細地將端口設置與'stty -a -F/dev/ttyWhatever'進行比較,看看有沒有什麼不同。 – wallyk 2012-04-02 20:51:12
那麼,檢查stty後,我和GTKTerm之間唯一的區別是hupcl,這應該不重要,因爲我連接到的只使用發送/接收線。我在閱讀代碼中編輯過,編寫代碼基本上是一樣的。 – rm5248 2012-04-03 14:17:11