Подтвердить что ты не робот

Как обрабатывать пакет send/ack

Я создаю приложение для связи с модулем Xbee через Xbee API.

В настоящее время у меня есть что-то работающее, но оно довольно простое и имеет довольно много ограничений.

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

Затем в качестве примера типичного запроса команды Отправка данных на последовательный порт Loop (с таймаутом), проверяющий CMDQueue для пакета, dequeue и проверяем, соответствует ли он В противном случае тайм-аут

Теперь его довольно очевидные потенциальные проблемы с этим методом. В частности, поскольку модули Xbee могут спать, вам, возможно, придется долго ждать Ack. Плюс это зависит от порядка и т.д.

Я хотел бы использовать неблокирующий подход. В этом случае, чтобы действовать в пакете Ack/response, в большинстве случаев мне нужно знать исходный пакет, который он был отправлен в ответ.

Я думаю о создании нескольких потоков. SendPacket отправит пакет, загрузит отправленный пакет, отправленное время и тайм-аут в память, также включит функцию обратного вызова? (Массив?) PacketProc будет анализировать пакеты, проверять массив пакетов, ожидающих ответа, и вызывать функцию обратного вызова. Он также проверит наличие ожидающих пакетов, которые имеют тайм-аут, и вызовет обратный вызов для указания времени ожидания?

В конечном счете я ищу возможность отправлять пакеты на несколько устройств (может отвечать в любом порядке) и действовать на эти ответы или действовать в таймаут.

Я не очень хорошо знаком с .NET. Кто-нибудь может прокомментировать этот подход или рекомендовать лучший образец для поиска? Любые методы .NET, на которые я должен обратить внимание?

4b9b3361

Ответ 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())

http://www.dotnetcurry.com/ShowArticle.aspx?ID=491