簡體   English   中英

.NET中SerialPort類的問題

[英]Problems with SerialPort class in .NET

我正在嘗試診斷為什么某些USB串行端口適配器不能與.NET一起正常工作。 受影響的適配器的行為在SerialPort.Write() 調用任何SerialPort.Readxxx()方法都會導致該方法阻塞,直到大約ReadTimout 我發現的解決方法是在BytesToRead <= 0時使用循環阻止,然后一切都按預期方式工作。 為什么?

我已經使用SysinternalsPortmon收集了一些調試日志 為什么會這樣呢?

without.log = bad behavior/bad USB adapter
with.log = with the while loop/bad USB adapter
ftdi.log = good behavior/good USB adapter

我編寫了ReadByte()的兩個本機實現,現在可以更好地描述該問題。 將ReadIntervalTimeout和ReadTotalTimeoutMultiplier設置為MAXDWORD ReadFile()時,應該等待直到接收緩沖區中的一個字節為止,然后按照MSDN的COMMTIMEOUTS結構頁上的說明進行返回。

Portmon日志顯示,這就是ReadByte()設置串行端口的方式。 但是,如果在調用ReadFile()時接收緩沖區為空,它將等待直到ReadTotalTimeoutConstant,然后返回。 微軟的ReadByte()也設置了一個Comm事件。 Portmon日志清楚地顯示了事件正在觸發,但是ReadByte()從不讀取接收緩沖區。 我在本機版本的ReadByte()中實現了此功能,它可以與受影響的USB到串行適配器完美配合。

本機ReadByte()

讀取SerialPort的最佳方法是使用異步方法:

_port = new SerialPort();
_port.DataReceived += new SerialDataReceivedEventHandler(OnComPortDataReceived);

void OnComPortDataReceived(object sender, SerialDataReceivedEventArgs e)
{
   byte[] ba = new byte[_port.BytesToRead];
   total = _port.Read(ba, 0, _port.BytesToRead);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM