2017-10-05 136 views
0

我正在創建一個Windows窗體應用程序,它通過藍牙連接到設備。我能夠向設備發送命令,並且我正在不斷收到數據。我面臨的問題是我無法在文本框中顯示連續的數據。該文本框僅顯示應用程序正在接收的第一行字符。這裏是我的代碼:在.Net(藍牙)中使用32feet接收連續數據

CONNECT按鈕動作:

private void btnConnect_Click(object sender, EventArgs e) 
    { 
     if (listBox.SelectedItem != null) 
     { 
      lblProgress.Text = ""; 

      btnStart.Enabled = true; 

      cBoxAvailablePorts.Enabled = cBoxAvailableBaudRates.Enabled = true; 

      try 
      { 
       int pos = listBox.SelectedIndex; 

       deviceInfo = array.ElementAt(pos); 

       if (pairDevice()) 
       { 
        Thread thread = new Thread(() => connectThread()); 
        thread.Start(); 
       } 
       else 
       { 
        MessageBox.Show("Pair failed!"); 
       } 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.ToString()); 
      } 
     } 
     else 
     { 
      MessageBox.Show("Please connect to a device!"); 
     } 
    } 

螺紋ACTION

private void connectThread() 
    { 
     //BluetoothClient client = new BluetoothClient(); 
     bc.BeginConnect(deviceInfo.DeviceAddress, serviceClass, this.connectCallBack, bc); 
    } 

回調ACTION:

private void connectCallBack(IAsyncResult result) 
    { 
     //BluetoothClient client = (BluetoothClient)result.AsyncState; 

     try 
     { 
      if (bc.Connected) 
      { 
       MessageBox.Show("Connected!"); 
      } 
      else 
      { 
       MessageBox.Show("Connection Failed!"); 
      } 
     } 
     catch (Exception) 
     { 
      MessageBox.Show("Not able to identify Bluetooth devices! Please try again.!"); 
     } 
    } 

START按鈕動作: 在這裏,我將命令發送「 S」。 在按鈕操作中,我調用sendMessage(「S」)。 被稱爲如下所示的功能:

public void sendMessage(string msg) 
    { 
     try 
     { 
      if (bc.Connected) 
      { 
       Stream stream = bc.GetStream(); 

       stream.ReadTimeout = 1000; 

       StreamWriter streamWriter = new StreamWriter(stream); 

       streamWriter.WriteLine(msg); 

       streamWriter.Flush(); 

       // Read operation 

       StreamReader streamReader = new StreamReader(stream); 

       string result = streamReader.ReadLine(); 

       txtResult.Text = result; 
      } 
      else 
      { 
       MessageBox.Show("Sending failed!"); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 
    } 

我在一個循環中寫的StreamReader的一部分,它給了我的Socket例外。 我也嘗試從串行端口獲取數據並使用DataReceived事件以防萬一,但仍然沒有幫助。 任何幫助,將不勝感激。 謝謝!

回答

0

OKAY!我解決了這個問題。不用惹惱32feet庫(儘管用32feet編寫代碼很有趣),我想通過串口進行通信。我將設備連接到筆記本電腦,並瞭解筆記本電腦藍牙設置中的傳出COMPORT。雙向通信只能通過傳出COMPORT完成,而不能通過傳入COMPORT完成。

假設傳出COMPORT是COM12和我已經設置波特率爲9600 因此,這裏是我的代碼:

public delegate void updateDelegate(string text); 

private updateDelegate objDelegate; 

private SerialPort serialPort; 

public View() // constructor 
{ 
     InitializeComponent(); 
     this.WindowState = FormWindowState.Normal; 
     this.StartPosition = FormStartPosition.CenterScreen; 
     this.objDelegate = new updateDelegate(getText); 

     serialPort = new SerialPort("COM12", 9600); 
     serialPort.Handshake = Handshake.None; 
     serialPort.Parity = Parity.None; 
     serialPort.StopBits = StopBits.One; 
     serialPort.DtrEnable = true; 
     serialPort.RtsEnable = true; 
} 

START按鈕動作

private void btnStart_Click(object sender, EventArgs e) 
    { 
     sendData("S"); 
    } 

// send命令

public void sendData(string msg) 
    { 
     try 
     { 
      if (!serialPort.IsOpen) 
      { 
       serialPort.Open(); 

       //serialPort.Close(); 
      } 

      if (serialPort.IsOpen) 
      { 
       serialPort.Write(msg); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 
    } 

//讀取數據

public void readData() 
    { 
     try 
     { 
      serialPort.DataReceived += SerialPort_DataReceived; 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 
    } 

    private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 
     string res = serialPort.ReadExisting(); 

     Thread.Sleep(500); 

     txtResult.Invoke(this.objDelegate, new object[] {res}); 
    } 

    public void getText(string text) 
    { 
     txtResult.Text = text; 
    } 

我希望這會幫助別人!謝謝!!!