Как сделать сравнение строки с входящим сообщением - PullRequest
0 голосов
/ 07 февраля 2020

Я знаю, это звучит просто, но у меня возникли некоторые проблемы с этим. Я пытаюсь создать систему с микроконтроллером pi c (MCU) и приложением xamarin android. Отправка части из приложения в pi c MCU решена, но когда я хочу отправить данные из MCU в приложение, она не будет go безупречной. Я использую H C -06 в качестве устройства Bluetooth для приема и отправки сообщений.

Код для приема от MCU к приложению:

public void beginListenForData()
    {
        try
         {
             inStream = btSocket.InputStream;
         }
         catch (IOException ex)
         {
             Console.WriteLine(ex.Message);
         }
         Task.Factory.StartNew(() => {
             byte[] buffer = new byte[1024];
             int bytes;
             while (true)
             {
                 try
                 {
                     Array.Reverse(buffer, 0, buffer.Length);
                     bytes = inStream.Read(buffer, 0, buffer.Length);
                     if (bytes > 0)
                     {
                         string valor = Encoding.ASCII.GetString(buffer);
                         System.Diagnostics.Debug.WriteLine(buffer);
                         System.Diagnostics.Debug.WriteLine(bytes);
                         System.Diagnostics.Debug.WriteLine(valor);
                         if (valor == "D0O")
                         {
                             System.Diagnostics.Debug.WriteLine("Vergelijking gelukt!");
                             break;
                         }
                         //Result.Text = Result.Text + "\n" + valor;
                     }
                 }
                 catch (Java.IO.IOException)
                 {
                     //Result.Text = string.Empty;
                     break;
                 }
             }
         });
    }

Как вы, возможно, мог бы получить сообщение, которое я пытаюсь отправить от MCU, это D0O (доблесть), когда сравнение работало с входящим сообщением, которое я хочу отладить, запись была успешной:

System.Diagnostics.Debug.WriteLine("Vergelijking gelukt!");

Следующая часть для проверки что за данные поступают:

System.Diagnostics.Debug.WriteLine(buffer);
System.Diagnostics.Debug.WriteLine(bytes);
System.Diagnostics.Debug.WriteLine(valor);

Я заметил странный вывод (см. изображение):

enter image description here

As Вы можете видеть, что сообщение разрезается на 2 части каждый раз. Кто-нибудь знает, почему и как это решить?

Я изменил порядок массива с помощью:

Array.Reverse(buffer, 0, buffer.Length);

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

Небольшое обновление:

Я изменил некоторую строку кода, и она работает более "безупречно"

while ((count = inStream.Read(buffer, 0, buffer.Length)) > 0)

Но что Странно, что первый бит отделяется от остальной части получаемой строки. Я не уверен, что вызывает эту проблему, если у кого-то есть идея?

Заранее спасибо.

1 Ответ

0 голосов
/ 12 февраля 2020

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

Итак, я подумал, что существует буфер приема, который сохраняет входящие символы. Если буфер читается с помощью streamReader.Read, он возвращает целое число прочитанного символа. Поэтому я сделал второй буфер строки типа данных [].

Если строка [0] пуста, я бы поместил в мой первый Char, который был прочитан streamReader.Read. Если строка [0] НЕ пуста, это означает, что первый символ уже прочитан, поэтому я помещаю входящий символ в строку [1]. Это означает, что сообщение, которое было разделено, теперь на строку [0] и строку [1]. Так что, если бы я мог объединить это и сохранить в строковую переменную. Это было сделано: string eindtekst = string.Join("", buf);, и это дает мне строку в одном куске, чтобы я мог сравнить ее. Важно очистить оба массива, так как вы закончите сравнение, иначе будут добавлены новые данные. И, как вы, возможно, можете сказать, string [0] == null никогда не будет истинным. Так что только строка [1] get переопределяет время, а это значит, что вы теряете данные.

public void beginListenForData()
    {
        try
        {
            inStream = btSocket.InputStream;
            streamReader = new StreamReader(inStream);
        }
        catch (IOException ex)
        {
            Console.WriteLine(ex.Message);
        }
        char[] buffer = new char[256];
        string[] buf = new string[2];
        int bytes;
        while (1)
        {
            try
            {
                if ((bytes = streamReader.Read(buffer, 0, buffer.Length)) > 0)
                {
                    string tekst = new string(buffer, 0, bytes);
                    if(buf[0] == null)
                    {
                        buf[0] = tekst;
                    }
                    else
                    {
                        buf[1] = tekst; 
                    }
                    string eindtekst = string.Join("", buf);

                    if (eindtekst == "D0O")
                    {
                        System.Diagnostics.Debug.WriteLine("Vergelijking gelukt!");
                        System.Diagnostics.Debug.WriteLine(eindtekst);
                        Array.Clear(buffer, 0, buffer.Length);
                        Array.Clear(buf, 0, buf.Length);
                        writeData("D2O");
                    }

                    streamReader.DiscardBufferedData();

                }
            }
            catch (Java.IO.IOException)
            {
                break;
            }
        }
    }

Спасибо за помощь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...