2011-10-26 36 views
2

有點奇特的問題:dC++串行通信的linux 9data比特

我編程C++中的ubuntu 10和我需要編碼,它使用9個數據位中串行通信的MDB(多站總線)協議(YES 9個數據位:D)

某些驅動程序在某些uart芯片上支持9個數據位,但大多數不支持。

簡要解釋: mdb使用8個數據位和9個數據位進行模式設置。 因此,當主機發送第一個BYTE時,它將mode = 9thbit設置爲1,這意味着總線上的所有器件都會中斷並正在尋找保存器件地址的第一個字節。 如果偵聽設備(許多中的一個)在第一個字節中發現它的地址,它就知道以下字節將是它的數據字節。數據字節已位9 =模式位設置爲0

例如以位:000001011 000000010 000000100 000000110(1stbyte地址和3個數據字節)

從從站的返回的情況 - >主模式比特被用於端傳輸。 所以主從串口讀取這麼長時間,直到它發現有9位9位的數據包= 1 usualy最後的9位序列是CHK字節+模式= 1

所以最後我的問題:

我知道如何給termios中的用戶CMPAR標誌以使用奇偶校驗位作爲模式位,例如。其設置要麼MARK(1)或SPACE(0)

例如對於這一切不知道如何:

如果這如果不是在termios的可能不支持定義

首先檢查:

# define CMSPAR 010000000000  /* mark or space (stick) parity */ 

用於標記或空間奇偶校驗的代碼例如。模擬第9位數據

struct termios tio; 
    bzero(&tio, sizeof(tio)); 
    tcgetattr(portFileDescriptor, &tio); 

    if(useMarkParity) 
    { 
      // Send with mark parity 
      tio.c_cflag |= PARENB | CMSPAR | PARODD; 
      tcsetattr(portFileDescriptor, TCSADRAIN, &tio); 

    } 
    else 
    { 
      // Send with space parity 
      tio.c_cflag |= PARENB | CMSPAR; 
      tio.c_cflag &= ~PARODD; 
      tcsetattr(portFileDescriptor, TCSADRAIN, &tio); 
    } 
    write(portFileDescriptor,DATA, DATALEN); 

現在我不知道如何設置奇偶校驗的接收,我已經試過幾乎所有的組合,我不能得到這個錯誤校驗字節序列。

誰能幫助我如何設置奇偶校驗的接收,它不會忽略奇偶校驗,不剝離字節,但它的「壞」接收的字節之前添加DEL:

因爲它在POSIX串行幫助

INPCK和PARMRK如果啓用IGNPAR,則在每個有奇偶校驗錯誤的字符之前發送一個NUL字符(000八進制)爲 。 否則,DEL(177八進制)和NUL字符與 一起發送不良字符。

那麼如何正確設置PARMRK和INPCK,它會檢測模式位= 1個的奇偶校驗位錯誤,並插入DEL返回流中的177進制。

謝謝:d

+0

所以傳輸工作?我也在做Linux,但只關心傳輸。你確定一個字節一個字節的奇偶校驗是否有效,FIFO的設置如何?你正在使用哪種芯片? – Splash

回答

1

像你想設置的接收器空間奇偶校驗和不啓用IGNPAR這聽起來我。這樣當接收到帶有標記奇偶校驗的字節時,它應該與DEL產生奇偶校驗錯誤。

+0

只是在發送後它應該已經設置爲空間純度,但如果沒有發送後,我應該始終呼籲\t \t tio.c_cflag | = PARENB | CMSPAR; tio.c_cflag&=〜PARODD; tcsetattr(portFileDescriptor,TCSADRAIN,&tio); ' 和具有該組在所有時間(只開放口之後)將其設置: newOptions.c_iflag | =(PARMRK | INPCK); newOptions.c_iflag&=〜ISTRIP; newOptions .c_iflag&=〜IGNPAR; tcsetattr(portFileDescriptor,TCSANOW,與newOptions); 我想我已經試過,但我還是從來沒有GOR八路177響應:?S左右明顯錯誤 知道爲什麼這是行不通的 – Lonko

+0

你是否檢查過所有的字節?我想我看到了一些使用Octal 377(0xFF)的DEL實現。 –

+0

Oficialy我放棄了:D – Lonko

0

我在Linux客戶操作系統中運行時遇到同樣的問題。作爲主機操作系統運行Linux的另一臺機器上運行相同的程序。我懷疑虛擬串行端口沒有傳遞奇偶校驗錯誤。見PARMRK termios behavior not working on Linux。虛擬機仍然可能不是問題,因爲它是一臺完全不同的計算機。不過,我可以在Windows中使用Realterm來獲得奇偶校驗錯誤(Linux是guest的計算機上的主機操作系統)。

此外,請注意n_tty.c中的代碼顯示它插入'\ 377''\ 0'而不是'\ 177''\ 0'。這也在工作配置上得到驗證。