2012-12-30 51 views
2

我正在實現一個串行接口,使用/ dev/ttyS0與外部硬件進行通信。由於數據流是數據包格式,並且使用「消息開始」,「長度字節」和「二進制數據」進行封裝,因此我配置了RAW輸入和輸出。輸入數據流中的任何DC1或DC3字符(0x11或0x13)都被Linux操作系統(最新Ubuntu)所使用。串行通信消耗傳入的ASCII DC1字符

我有一臺Windows PC和Realterm監視通信並在顯示器上看到0x11和0x13字符。據我所知,沒有其他缺失的字符。

這裏是我的序列設置代碼(注意IXON,IXOFF,IXANY被禁用):

void Ser_Open_Port(unsigned char *port) 
{ 
    tcgetattr(ser_handle, &ser_old_settings); 
    tcgetattr(ser_handle, &ser_new_settings); 

    // Set Baud Rate 
    cfsetospeed(&ser_new_settings, baud); 

    // ~BRKINT - No Flush on Break 
    // ~PARMRK, ~IGNPAR - Parity Error result in \0 char 
    // ~ISTRIP - No 8th bit Strip 
    // ~INLCR - No NL to CR Translate 
    // ~IGNCR No Ignore CR 
    // ~ICRNL No CR to NL Translate 
    // ~IXON - No Software Flow Control on Output 
    // ~IXOFF - No Software Flow Control on Output 
    // ~IXANY - No Software Flow Control on Output 
    // ~INPCK - Ignore Parity Checking 
    ser_new_settings.c_iflag &= ~(BRKINT|PARMRK|IGNPAR|ISTRIP|INLCR|IGNCR|ICRNL|IXON|IXOFF|IXANY|INPCK); 
    // IGNBRK - Ignore Break 
    ser_new_settings.c_iflag |= (IGNBRK); 

    // ~OPOST - Implementation Defined Output Processing Off - Raw Output 
    // All Other c_oflag bits are ignored 
    ser_new_settings.c_oflag &= ~(OPOST); 

    // ~ICANON - Not Canonical Input Mode 
    // ~ECHO - No Echo 
    // ~ECHOE - No Echo Erase 
    // ~ECHONL - No Echo NL 
    // ~ISIG - No Signals 
    // ~IEXTEN - Implementation Defined Input Processing Off - Raw Input 
    ser_new_settings.c_lflag &= ~(ICANON|ECHO|ECHOE|ECHONL|ISIG|IEXTEN); 

    // ~PARENB - No Parity 
    // ~CSTOPB - 1 stop bit 
    // ~CSIZE - Clear Character Size Bits 
    ser_new_settings.c_cflag &= ~(PARENB|CSTOPB|CSIZE); 
    // CS8 - Character Size 8 bits 
    // CLOCAL - Ignore Modem Control Lines 
    ser_new_settings.c_cflag |= (CS8|CLOCAL); 

    // apply the settings 
    tcsetattr(ser_handle, TCSANOW, &ser_new_settings); 
    tcflush(ser_handle, TCOFLUSH); 

    // Open Serial Port for Read/Write, and Non Blocking 
    ser_handle = open(port, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK); 
} 

這裏就是我從串口緩衝讀取:

ser_charin_count = read(ser_handle, ser_charin, 30); 
    if(ser_charin_count > 0 && ser_charin_count != 0xFFFFFFFF) 
    { 
    // Code to Process Message Bytes Here 
    } 

感謝您幫助。

+5

而不是編輯問題,你應該自己發佈這個答案,這對任何其他人來說都很有用,而且看起來不像一個沒有答案的問題。 – PeterJ

+0

如何將其更改爲答案? – PeterHouse

+0

你只需向下滾動到底部,你應該看到一個框鍵入答案,然後按'發佈你的答案'。然後回去編輯問題以刪除該部分。只是爲了澄清不要移動整個很多 - 只是最後一段,並可能放棄doh等 – PeterJ

回答

2

錯誤在於未打開端口首先將ser_handle初始化爲正確的端口attr結構。我將open放在子例程的頂部,然後使用tcgetattr和tcsetattr函數正確修改端口值。