[英]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.