2011-10-18 41 views
5

我看不到使用termios結構正確設置串口,所以我正在查看第三方庫。是否可以使用boost.asio標記和空格奇偶校驗?

我被建議嘗試boost.asio,但通過例子看時,它似乎不支持標記和空間奇偶校驗,這是真的嗎?

如果可能有人可以在boost.asio中顯示如何做標記和空間奇偶校驗的示例代碼。我使用8個數據位,115220波特率和1個停止位。

有誰知道任何支持linux上的標記和空間奇偶校驗的第三方庫,我可以使用它來代替boost嗎?

回答

5

關於這個問題有一篇很好的文章here

特別

標記和間隔的奇偶校驗,儘管在大多數硬件實現,都沒有在POSIX標準中定義 。例如,Unix/Linux termios庫的聯機幫助頁不會丟失關於這兩個奇偶校驗模式的單個字。 (請注意,PARMRK與MARK 奇偶校驗無關。)

這就是爲什麼我認爲這些選項沒有在Boost.Asio中實現。

有一些解決方案的建議: 例如:

模式8M1(8個數據位,MARK奇偶校驗,1位停止位)可以與8N2仿真。 而不是發送一個奇偶校驗位和一個停止位,發送兩個 停止位。由於停止位始終爲1(標記位),因此兩種模式是等效的。

如果這些不符合您的要求,那麼您可以在升壓asio中獲得串口的本地表示。 從文檔:

basic_serial_port::native_handle 

Get the native serial port representation. 

native_handle_type native_handle(); 
This function may be used to obtain the underlying representation of the serial port. This is intended to allow access to native serial port functionality that is not otherwise provided. 

要獲得使用的想法看看

boost_1_45_0/boost/asio/serial_port_base.hpp 

,特別是代碼做平價在Linux上:

switch (value_) 
    { 
    case none: 
    storage.c_iflag |= IGNPAR; 
    storage.c_cflag &= ~(PARENB | PARODD); 
    break; 
    case even: 
    storage.c_iflag &= ~(IGNPAR | PARMRK); 
    storage.c_iflag |= INPCK; 
    storage.c_cflag |= PARENB; 
    storage.c_cflag &= ~PARODD; 
    break; 
    case odd: 
    storage.c_iflag &= ~(IGNPAR | PARMRK); 
    storage.c_iflag |= INPCK; 
    storage.c_cflag |= (PARENB | PARODD); 
    break; 
    default: 
    break; 
    } 

我想你想用native_handle來設置標誌,像這樣:

cflag |= PARENB | CMSPAR // To select SPACE parity 
cflag &= ~PARODD 

cflag |= PARENB | CMSPAR | PARODD // to select MARK parity 

(根據here,反正) 另見wrong sequence of libserial received data

+0

你給的例子是termios結構,我不能去工作,CMSPAR未定義我的系統上並不起作用。謝謝你的答案無論如何,現在我知道我必須在Java中做到這一點:( – Skeith

+0

@Skeith - 看看鏈接 - 你可以通過使用額外的停止位模擬Mark和Space(Mark更容易) - 這是直接的由Boost.Asio支持,無需使用不支持的CMSPAR。順便說一句 - 我不確定如果你的內核不支持它,切換語言將會有所幫助。 – Tom

+0

我們有一個java程序,它與外部設備通信,但是由我的前任構建。如果可能的話,我只是不想嘗試切割串行代碼,因爲將功能代碼從C++重寫爲java將是一項重要工作,因爲我們缺少的是Linux的串行代碼,但我別無選擇現在。 – Skeith