2012-04-02 26 views
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); 
    } 
} 
+1

您可以包含您用於從該fd讀取/寫入的代碼示例嗎?您可能還需要'strace GTKTerm'和您的代碼,並從每個'TCSETS'ioctl調用中進行比較。 – je4d 2012-04-02 19:46:50

+1

@ rm5248:配置端口的代碼似乎沒問題。也許I/O如何完成是問題。另外,當你的程序打開並且GTK打開它時,一定要仔細地將端口設置與'stty -a -F/dev/ttyWhatever'進行比較,看看有沒有什麼不同。 – wallyk 2012-04-02 20:51:12

+0

那麼,檢查stty後,我和GTKTerm之間唯一的區別是hupcl,這應該不重要,因爲我連接到的只使用發送/接收線。我在閱讀代碼中編輯過,編寫代碼基本上是一樣的。 – rm5248 2012-04-03 14:17:11

回答

2

好吧,我發現了這個問題。

對於一些bizzare的原因,我發送的設備似乎沒有什麼大的緩衝區或什麼東西;事實證明,當我一次發送一個字符串命令時,我不會總是得到迴應。發送人物之間的睡眠可以解決問題(儘管我承認,這不是一個很好的解決方案)。可能發生的情況是,我在點上被打斷,這會讓設備有足夠的時間處理一些輸入。 GTKTerm會在收到每個字符時發送出去,並且不可能輸入足夠快的速度來發生此錯誤。