的saga繼續...我應該使用哪個非託管API來控制串行端口?
我迅速來,我的串行設備過於挑剔與由System.IO.Ports
提供的SerialPort
類發揮很好的結論。
爲了讓供應商提供的軟件更具說服力,我試圖匹配Portmon(logs here)和HHD's Free Serial Monitor記錄的對話的每個方面。使用託管(.NET)庫,我無法複製以下:
- 特殊字符。如a separate question中所述,SerialPort不允許更改特殊字符集。這是likely that it's irrelevant,但我希望能夠斷然拒絕它。
細粒度超時。由於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。港口開放期間的查詢。在打開端口和設置波特率之間,我的(.NET)應用程序和供應商提供的應用程序都會執行一堆查詢,如
IOCTL_SERIAL_GET_LINE_CONTROL
。 .NET增加了一些供應商的應用程序不能做的,例如IOCTL_SERIAL_GET_MODEMSTATUS
。我希望能夠阻止這一點。多餘的重複。在端口打開期間,由於某些原因,由.NET重複執行一組命令(設置線路控制,波特率,特殊字符和握手,清除RTS和DTR)。供應商提供的軟件在運行此塊後直接跳入。
就像我上面所說的,我不知道這些差異是否是我的悲哀的原因,但我希望能夠找出答案。更重要的是,我認爲對流程的更大控制能夠讓我真正磨合這個問題,無論結果如何。
我的問題是,我如何直接掛接到正確的API來控制串口在螺母和螺栓級別?任何建議或指導表示讚賞!
直接處理串口的Win32 API很難看。雖然我讚揚你接受挑戰,但我可能會建議你採取一個第3部分組件,然後再進行嘗試。我現在一直在使用CommStudio,並且它適合我對定製硬件的需求。 http://www.commstudio.com/commstudio – Brad 2011-04-13 14:32:34
感謝您的好意,但我無法負擔得起。 – 2011-04-13 14:38:08
免費版:http://www.componentsource.com/products/commstudio/downloads.html?rv=42917 – Brad 2011-04-13 16:14:04