2015-11-04 99 views
1

的Linux操作我必須遷移程序到Linux使用Windows手柄和DCB e.g:手柄和DCB

int DLMSClient::GXGetCommState(HANDLE hWnd, LPDCB DCB) { //code } 

我怎麼會去這些遷移到Linux?

here,我已經想出瞭如何遷移DWORD,WORD和BYTE,但我將如何去處理這些新類型?

此外,我可以獲得這個過程的理解來源可能會有所幫助。

+0

LPDCB將是一個指向某個地方定義的DCB結構體的指針,您必須通過成員轉換成員。 HANDLE通常是一個內核句柄,它會翻譯成posix上的一個文件描述符(一個int) - 但是在這裏我看到它被誤用來攜帶一個HWND - 並且將它轉換爲linux將會很有趣,因爲目標類型將會是完全由您正在轉換的窗口框架決定。如果有的話。 –

+1

我的理解是,您需要與串行總線上的設備進行通信。這可能會更容易尋找一個linux串行通信庫,而不是移植它。 – Emilien

+0

@Emilien您能指點我一個解釋Windows背後功能的頁面嗎?我使用Linux並且不熟悉Windows串行通信庫。 –

回答

2

您可能正在使用seri但是在Linux中,串行端口的管理與Windows中的管理有所不同。它們之間沒有簡單的一對一映射。而且,在Linux下,串口都是終端,他們可能會讓你大吃一驚。

我會試着解釋一下:

  • 一個Windows HANDLE將映射到Linux文件描述符。這是一個普通的值。
  • 在Windows中,您將獲得HANDLECreateFile("\\\\.\\COM1", ...)。在Linux中,您可以通過open("/dev/ttyS0", O_RDWR | O_NOCTTY)獲得。 O_NOCTTY標誌是爲了避免將此端口作爲您的控制終端(您不希望令人驚訝的控制終端!)。
  • 在Windows中,您可以用CloseHandle(handle)關閉HANDLE。在Linux中,使用close(fd)
  • 在Windows中,您使用BuildCommDCB()SetCommState(...)配置串口。在Linux中,您可以使用tcgetattr()cfmakeraw(),cfsetspeed()tcsetattr()等等......您可能需要raw模式。
  • 在Windows中,您使用WriteFile()發送數據並使用ReadFile()接收數據。在Linux中,您使用read()write()

我希望這足以讓你開始。

+0

這是非常好的描述,但是我們能否舉一個例子來收集所有這些觀點。 – YAcaCsh