我正在构建一个通过Xbee API与Xbee模块通信的应用程序。
目前我有一些工作,但它相当简单并且有很多限制。
Sub processPackets() ' this runs as its own thread
'remove data from serial buffer and format in to packet
'if IO response generated remotely, not requested put in IOQueue
'Otherwise put in CMDQueue (response generate from request, ie cmd response or packet Ack
End Sub
然后作为典型命令请求的示例 将数据发送到串行端口 循环(有超时)检查CMDQueue的数据包,出队并检查它是否匹配 否则超时
现在很明显这个方法的潜在问题。特别是,由于Xbee模块可以睡眠,您可能需要等待相当长的时间来进行Ack。另外,它取决于订单等。
我想采取非阻塞方法。在这种情况下,为了在大多数情况下对Ack /响应数据包采取行动,我需要知道响应的发送原始数据包。
我正在考虑创建一些线程。 SendPacket会发送数据包,加载发送的数据包,发送的时间和超时进入内存,还包括回调函数? (阵列?) PacketProc将解析数据包,检查等待响应的数据包数组并调用回调函数。它还会检查是否有超时的等待数据包并调用回调来指示超时?
最终我正在寻找向多个设备发送数据包的能力(可能以任何顺序响应)并根据这些响应采取行动或对超时采取行动。
我不是特别熟悉.NET,任何人都可以评论这种方法或推荐更好的模式来查看吗?我应该查看的任何.Net方法?
答案 0 :(得分:1)
使用Task类。
Imports System.Threading
Imports System.Threading.Tasks
...
Dim buffer As StringBuilder;
Sub processPackets() ' this runs as its own thread
' Wait for packet
' put here command/loop that waits packet
buffer.Append(packet);
'remove data from serial buffer and format in to packet
'if IO response generated remotely, not requested put in IOQueue
If buffer.ToString() = "REMOTELY" Then
' Put IOQueuo
buffer.Clear()
Else
'Otherwise put in CMDQueue (response generate from request, ie cmd response or packet Ack
' Put in CMDQueue
buffer.Clear()
End If
End Sub
...
' Create and execute the Task that will process the packets
Dim t = Task.Factory.StartNew(Sub() processPackets())