我正在编写一个侦听串行端口的程序。我已经有代码利用 VCP 驱动程序(虚拟 COM 端口)打开串行连接,然后在收到数据时添加事件处理程序。该代码大致如下所示:
public void OpenPort(string portNumber)
{
_port = new SerialPort(
portName: portNumber,
baudRate: 9600,
parity: Parity.None,
dataBits: 8,
stopBits: StopBits.One
);
_port.DataReceived += ReadData;
}
private void ReadData(object sender, SerialDataReceivedEventArgs e)
{
string data = _port.ReadExisting().Trim();
Console.WriteLine("Received: " + data);
}
这很好用。我很容易理解如何使用+=
符号设置事件。但我正在尝试从使用 VCP 驱动程序切换到使用 FTDI 提供的D2XX 驱动程序。我有我需要编写的大部分等效代码,除了在发生“数据接收”事件时能够读取数据的显着例外。
D2XX 驱动程序包括一种在接收到数据时设置事件处理程序的方法,称为SetEventNotification
. 下面是方法签名的样子:
SetEventNotification(UInt32 eventMask, EventWaitHandle eventHandle);
第一个参数很简单(它们有一些预定义的 uint,您可以传入以确定事件何时触发),但我以前从未直接使用 EventWaitHandles,而且我发现文档很难掌握,所以我我无法开始。
在一天结束时......我想要一个事件监听器方法来执行读取任务,并且我可以使用+=
操作符分配它,就像我在上面对 VCP 驱动程序所做的那样。
根据我正在阅读的内容,看来我必须创建一个新Thread
的,基本上连续轮询 EventWaitHandle 的信号?或类似的东西?任何让我开始(或完成!)的示例或示例代码将不胜感激。
这是我到目前为止所拥有的:
public void OpenPort(string portNumber)
{
_port = new FTDI();
var status = _port.OpenBySerialNumber(portNumber);
if (FTDI.FT_STATUS.FT_OK != status) throw new Exception();
status = _port.SetBaudRate((UInt32) 9600);
if (FTDI.FT_STATUS.FT_OK != status) throw new Exception();
status = _port.SetDataCharacteristics(
DataBits: FTDI.FT_DATA_BITS.FT_BITS_8,
StopBits: FTDI.FT_STOP_BITS.FT_STOP_BITS_1,
Parity: FTDI.FT_PARITY.FT_PARITY_NONE
);
if (FTDI.FT_STATUS.FT_OK != status) throw new Exception();
var evHandle = new EventWaitHandle(false, EventResetMode.AutoReset, "");
_port.SetEventNotification(FTDI.FT_EVENTS.FT_EVENT_RXCHAR, evHandle);
// ... now what?
}
public void ReadData(object sender, EventArgs e)
{
UInt32 bytesAvailable = 0;
_port.GetRxBytesAvailable(ref bytesAvailable);
string data;
UInt32 bytesRead = 0;
_port.Read(out data, bytesAvailable, ref bytesRead);
data = data.Trim();
Console.WriteLine("Received: " + data);
}