w8Ball Ответов: 1

Почему arduino не передает все данные через модуль bluetooth HC-06, как это, и есть ли "исправление" ?


Привет. У меня есть крошечный эскиз Arduino, который отправляет случайные данные через модуль Bluetooth (я использую HC-06) каждые 5 секунд, и у меня есть VB.NET приложение windows, которое получает данные и управляет ими. Данные будут выглядеть следующим образом например: "(255**255**255)"

Мой VB.Сетевое приложение получает текущие данные, отправляемые модулем Bluetooth, всплывает окно сообщения с текущими полученными данными и добавляет эти данные в элемент управления RichTextBox. Так что весь процесс должен выглядеть примерно так:

1. Строку: "(100**390**222)" передаются через Bluetooth в код Arduino
2. появится окно сообщения с текущими данными "(100**390**222)"
3. Строка добавляется в элемент управления richtextbox
...

Вместо этого он фактически не отправляет всю строку в одном экземпляре, вот фактический процесс:

1. Строку: "(100**390**222)" передаются через Bluetooth в код Arduino
2. появится окно сообщения с текущими данными "("
3. Строка добавляется в элемент управления richtextbox
4. появится окно сообщения с текущими данными "100**390**222)"
5. Строка добавляется в элемент управления richtextbox
...

Иногда он посылает первые два символа, а затем остальные. Почему он не отправляет всю строку в одном экземпляре и есть ли исправление для этого?

Что я уже пробовал:

Вот мой скетч:
#include <SoftwareSerial.h>

SoftwareSerial BTserial(15, 17);

uint8_t SomeFirstNumber, SomeSecondNumber, SomeThirdNumber;

void setup()
{
    BTserial.begin(38400);
}

void loop()
{
    SomeFirstNumber = random(255);
    SomeSecondNumber = random(255);
    SomeThirdNumber = random(255);
    
    BTserial.print("(" + String(SomeFirstNumber) + "**" + String(SomeSecondNumber) + "**" + String(SomeThirdNumber) + ")");

    delay(5000);
}

Вот мой VB.Net-Приложения:
https://images2.imgbox.com/9f/54/djv2xbck_o.png[^]

Источник:
Delegate Sub SetTextCallback(ByVal [text] As String)

Private Sub Open_Port(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_OpenPort.Click
    Dim bException As Boolean = False

    SerialPort1.PortName = "COM3"
    SerialPort1.BaudRate = 38400
    SerialPort1.Parity = IO.Ports.Parity.None
    SerialPort1.StopBits = IO.Ports.StopBits.One
    SerialPort1.DataBits = 8

    Try
        SerialPort1.Open()
    Catch ex As Exception
        bException = True
        MsgBox(ex.Message, MsgBoxStyle.Exclamation)
    End Try

    If Not bException Then
        MsgBox("Success!", MsgBoxStyle.Information)
    End If
End Sub

Private Sub Close_Port(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_ClosePort.Click
    SerialPort1.Close()
End Sub

Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    ReceivedText(SerialPort1.ReadExisting())
End Sub

Private Sub ReceivedText(ByVal [text] As String)
    If RichTextBox_Output.InvokeRequired Then
        Dim x As New SetTextCallback(AddressOf ReceivedText)
        Me.Invoke(x, New Object() {(text)})
    Else
        MsgBox([text])
        RichTextBox_Output.Text += [text]
        RichTextBox_Output.ScrollToCaret()

        SerialPort1.DiscardOutBuffer()
    End If
End Sub


Я постарался объяснить как можно лучше. Заранее благодарю вас!

1 Ответов

Рейтинг:
0

Dave Kreskowiak

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

Ваш код приема должен буферизировать все, что получает, и продолжает добавлять к буферизованному содержимому при последующих событиях приема до тех пор, пока не будет получено полное сообщение. Это определяется вашим кодом приема. Что он ищет в данных, чтобы знать, что "да, я получил целое сообщение"? В вашем случае это выглядит как символ")". Маркером, указывающим на то, что начинается новое сообщение, является символ" (". Когда вы получаете полное сообщение, вы можете отправить это сообщение в любой код вашего приложения, который будет его обрабатывать.


w8Ball

Спасибо за ваш ответ. Вот ответ, который я ищу. Я только что понял, что лучшее решение для пометки сообщения "завершено" - это сопоставление его с шаблоном регулярного выражения.
Я не очень разбираюсь в сетях, как вы можете судить. Интернет полон смежных тем, но если вы совсем не возражаете, я открыт для сайтов.

Ваше здоровье!

Dave Kreskowiak

В интернете полно примеров.
Google: "клиент c# tcp/ip[^]

Bluetooth работает точно так же.

w8Ball

Большое спасибо!