2011-04-13 24 views
1

saga繼續...我應該使用哪個非託管API來控制串行端口?

我迅速來,我的串行設備過於挑剔與由System.IO.Ports提供的SerialPort類發揮很好的結論。

爲了讓供應商提供的軟件更具說服力,我試圖匹配Portmonlogs here)和HHD's Free Serial Monitor記錄的對話的每個方面。使用託管(.NET)庫,我無法複製以下:

  1. 特殊字符。如a separate question中所述,SerialPort不允許更改特殊字符集。這是likely that it's irrelevant,但我希望能夠斷然拒絕它。
  2. 細粒度超時。由於described on MSDN,有決定所產生的行爲5個超時設置:

    • ReadIntervalTimeout(RI)
    • ReadTotalTimeoutMultiplier(RM)
    • ReadTotalTimeoutConstant(RC)
    • WriteTotalTimeoutMultiplier(WM)
    • WriteTotalTimeoutConstant(廁所)。

    SerialPort.WriteTimeout(int)SerialPort.ReadTimeout(int)只改變WC和RC設置,這是小問題,但它而不是讓別人爲0,.NET設置來設置RI和RM爲-1。

  3. 港口開放期間的查詢。在打開端口和設置波特率之間,我的(.NET)應用程序和供應商提供的應用程序都會執行一堆查詢,如IOCTL_SERIAL_GET_LINE_CONTROL。 .NET增加了一些供應商的應用程序不能做的,例如IOCTL_SERIAL_GET_MODEMSTATUS。我希望能夠阻止這一點。

  4. 多餘的重複。在端口打開期間,由於某些原因,由.NET重複執行一組命令(設置線路控制,波特率,特殊字符和握手,清除RTS和DTR)。供應商提供的軟件在運行此塊後直接跳入。

就像我上面所說的,我不知道這些差異是否是我的悲哀的原因,但我希望能夠找出答案。更重要的是,我認爲對流程的更大控制能夠讓我真正磨合這個問題,無論結果如何。

我的問題是,我如何直接掛接到正確的API來控制串口在螺母和螺栓級別?任何建議或指導表示讚賞!

+0

直接處理串口的Win32 API很難看。雖然我讚揚你接受挑戰,但我可能會建議你採取一個第3部分組件,然後再進行嘗試。我現在一直在使用CommStudio,並且它適合我對定製硬件的需求。 http://www.commstudio.com/commstudio – Brad 2011-04-13 14:32:34

+0

感謝您的好意,但我無法負擔得起。 – 2011-04-13 14:38:08

+1

免費版:http://www.componentsource.com/products/commstudio/downloads.html?rv=42917 – Brad 2011-04-13 16:14:04

回答

0

我已經做了很長時間,因爲我已經做了系列的東西,但我記得這個人是一個非常好的資源 - 網站http://www.lvr.com/serport.htm。希望有所幫助。

0

似乎已經有一段時間,因爲這個線程是活躍的,但由於它沒有解決方案,我想我會回答完整性的問題。

你重新初始化的問題是由於SerialPort類使用的默認握手而發生的,我不知道它爲什麼會這樣做,但它真的很煩人,你可以通過跳過SerialPort屬性並鑽研直接進入DCB結構。

我已經在C#中充滿了擴展方法對於SerialPort類的類,看看我的回答over here on CodeProject

如果你決定走這條路,我建議你直接通過一個串口跳過。寫入SerialPort.BaseStream.Write,他們採用相同的參數,但我很確定SerialPort類在那裏做了額外的不必要的init的東西,與SerialPort.Read一樣。

相關問題