Как обрабатывать отправку / подтверждение пакета - PullRequest
17 голосов
/ 02 октября 2011

Я создаю приложение для связи с модулем 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 / response в большинстве случаев мне нужно знать исходный пакет, в который он был отправлен в ответ.

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

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

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

1 Ответ

1 голос
/ 17 сентября 2013

Используйте класс 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

...