簡體   English   中英

Xamarin與Arduino的藍牙聊天-給出奇怪的兩行結果

[英]Xamarin Bluetooth Chat with Arduino - Giving strange two line results

我正在Visual Studio上使用Xamarin,並且可以在網上找到最新的C#藍牙聊天。 我在獲取正確的輸出時遇到了一些麻煩。 我讓Arduino將數據每2秒發送一次到藍牙,如下所示

Serial.Println("In Standby Mode");

藍牙聊天應用程序使用與UI分開的線程接收此消息

public override void Run ()
{
    Log.Info (TAG, "BEGIN mConnectedThread");
     //data from socket
     byte[] buffer = new byte[1024];
     //number of bytes read
      int bytes;
      string bufferString;

      // Keep listening to the InputStream while connected
       while (true) {
        try {

                 lock(buffer)
                    { 
                        bytes = mmInStream.Read (buffer, 0, buffer.Length);
                        bufferString = System.Text.Encoding.ASCII.GetString(buffer);
                        var bufferStringJava = new Java.Lang.String(buffer, 0, buffer.Length);


                           System.Console.WriteLine("Incoming Data from Bluetooth Is:" + bufferStringJava);

                        _service._handler.ObtainMessage (BluetoothChat.MESSAGE_READ, bytes, -1, bufferString) //Edited to send a string instead of an array
                        .SendToTarget ();

                    }

                } catch (Java.IO.IOException e) {
                    Log.Error (TAG, "disconnected", e);
                    _service.ConnectionLost ();
                    break;
                }
            }

您可以看到我在這里打印輸出。 另外,我將輸出打印在Android Activity上

readString2 = String.Copy((string)msg.Obj);
var readMessage = new Java.Lang.String(Encoding.ASCII.GetBytes(readString2), 0, msg.Arg1);                         
bluetoothChat.conversationArrayAdapter.Add(bluetoothChat.connectedDeviceName + ":  " + readMessage);

控制台輸出非常奇怪,給出以下內容。 通常,輸出中缺少各種字母。

05-24 22:25:29.286 I / mono-stdout(4690):來自藍牙的傳入數據是:I待機模式來自藍牙的傳入數據是:I待機模式

05-24 22:25:29.306 I / mono-stdout(4690):來自藍牙的傳入數據為:n待機模式來自藍牙的傳入數據為:n待機模式

05-24 22:25:30.316 I / mono-stdout(4690):來自藍牙的傳入數據是:I待機模式來自藍牙的傳入數據是:I待機模式

在所附圖片中可以看到“活動”顯示。 本質上,它可以正確顯示所有內容,但通常會將“處於待機模式”文本分成兩半。

藍牙聊天輸出

我很困惑,為什么控制台輸出中缺少字母,而應用程序顯示中卻沒有。 另外,為什么應用程序顯示為兩行。 另外,我不確定為什么控制台似乎兩次輸出相同的內容。

謝謝您的幫助!

我知道發生了什么事。 本質上,讀取藍牙套接字數據的線程不斷重復執行,沒有任何延遲。 該外觀將從流(mmInStream.Read())中讀取數據,然后使用處理程序發送該數據。 但是它只是讀取當時可用的任何內容。 因此,如果僅發送了字母“ I”,則直到下次圍繞外觀時,它才會拾取其他字母。 這解釋了為什么拆分郵件。 我使用以下代碼修復了此問題。

  if (mmInStream.IsDataAvailable())
    {
     await System.Threading.Tasks.Task.Delay(20);
     bytes = mmInStream.Read(buffer, 0, buffer.Length);

接下來,每次瀏覽時,不重置byte []緩沖區數據。 由於我每次都占用所有緩沖區,因此保留了先前讀取的一些字符,給了我奇怪的輸出。

為了解決這個問題,我將緩沖區復制到每個讀取字節的長度字符串中,該整數由名為bytes的整數變量提供。

for (int i = 0; i < bytes; i++)
{
    temp[i] = buffer[i];
}

bufferString = System.Text.Encoding.ASCII.GetString(temp);

我仍然沒有弄清楚如何擺脫單聲道的雙重輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM