2014-02-11 34 views
2

我想通過串口發送一些chars。問題是,如果我發送AASCII 65),我收到其他東西(ASCII 225)。我發送的任何字母或字符串都會收到其他內容。如何解決串口傳輸錯誤?

這裏是我的代碼:

#include <stdio.h>  
#include <string.h>  
#include <unistd.h> 
#include <fcntl.h>  
#include <errno.h>  
#include <termios.h> 

int open_port(void) 
{ 
      int port; 
      port = open("/dev/ttySAC3", O_RDWR | O_NOCTTY | O_NDELAY); 
      if (port == -1){ 
       perror("open_port: Unable to open /dev/ttySAC3 - "); 
      }else{ 
       fcntl(port, F_SETFL, 0); 
      } 
      return (port); 
} 


int main() 
{ 
      int port,n; 
      char str = 'A';  
      struct termios specs; 

      port = open_port(); 
      tcgetattr(port, &specs); 

      specs.c_cflag = (CLOCAL | CREAD); 

      specs.c_oflag = (OPOST | CR3| CS8); 

     cfsetospeed(&specs,B9600); 

     tcsetattr(port,TCSANOW,&specs); 
     n = write(port, &str, 1); 
     if (n<0) { 
       printf("\nError"); 
     } 

     close(port); 
     return(0); 
} 

我用示波器測量,這是離開設備的數據,所以它不是我的電腦上讀取問題。

我在網上搜索了最近2天,無法弄清楚我做錯了什麼。一些幫助將不勝感激。

+0

你怎麼接收數據? – anishsane

+0

從我的設備中,一個'tiny210'我有一條串口線連接到我的電腦,在那裏我使用'Realterm'來讀取數據。 –

+2

檢查波特率,流量控制等其他參數。另外,嘗試'minicom'或'kermit',然後嘗試您的PC端'C'代碼。這個問題可能在微控制器端代碼中。 – anishsane

回答

2

如果你得到226爲「'B'」然後我會說的最多發送'b'使用數據位使用奇偶校驗。


ň亞歷克斯的評論下面我得出結論:

  1. 我的上述假設是錯誤的。
  2. 他可以簡單地添加合適的初始化到termios結構:

    struct termios specs = {0}; 
    
+0

是的,你是對的。我改變了代碼,並添加了 'specs.c_cflag&=〜PARENB; specs .c_cflag&=〜CSTOPB; specs.c_cflag&=〜CSIZE。 specs.c_cflag | = CS8;'而現在它的工作原理 –

+0

我想你的假設是對的,我還真沒收到'B',如果在我的接收器。我使用了7個數據位和奇偶校驗 –

+0

@NAlex:Err ...但是您在註釋中顯示的代碼確實設置了無奇偶校驗和8個數據位 – alk

1

波特率是一個參數,也有數據位數,停止位,奇偶校驗和流量控制(RTS/CTS,無等)。如果雙方的硬件都支持這些參數,那麼這兩個參數必須相同。如果是這種情況,則電纜Rx,Tx必須將Rx(A側)連接至Tx(B側),將Tx(A側)連接至Rx(B側)。

這是最低要求,如果我們忽略地面和電網的干擾,流量控制引腳。

接下來的考慮是距離。由於附近靜電發射器(手機,電機等)的干擾,RS232無法在標準電纜上走得太遠。最後,最難的是RS232沒有糾錯。如果在傳輸過程中某些位發生了變化,那麼另一方只能檢查數據包是否正確,但是不能糾正。爲此,您需要雙方都使用糾錯協議,或者至少需要一個ACK/NAK機制。

希望這會有所幫助。