2017-10-05 7 views
0

Ich erstelle eine Windows Form-Anwendung, wo es sich über Bluetooth mit einem Gerät verbindet. Ich kann Befehle an das Gerät senden und erhalte die Daten kontinuierlich. Das Problem, mit dem ich konfrontiert bin, ist, dass ich die fortlaufenden Daten nicht in der Textbox anzeigen kann. Das Textfeld zeigt nur die erste Zeile der Zeichen an, die die Anwendung empfängt. Hier ist mein Code:Empfangen von fortlaufenden Daten mit 32 Feet in .Net (BLUETOOTH)

CONNECT-Taste Aktion:

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!"); 
     } 
    } 

THREAD ACTION

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

RUECKRUF 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.!"); 
     } 
    } 

STARTKNOPF- ACTION: Hier schicke ich einen Befehl " S ". In Button Aktion rufe ich sendMessage ("S"). Die Funktion, die unten gezeigt aufgerufen:

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()); 
     } 
    } 

Ich schrieb den Stream Teil in einer Schleife, und es gab mir Sockel Ausnahme. Ich habe auch versucht, die Daten von Serial Port und DataReceived Ereignis für den Fall zu bekommen, aber immer noch nicht geholfen. Jede Hilfe wäre willkommen. Vielen Dank!

Antwort

0

OKAY! Ich habe das Problem gelöst. Ohne Probleme mit der 32-Fuß-Bibliothek zu bekommen (obwohl es Spaß macht, mit 32 Fuß zu programmieren), dachte ich, die Kommunikation über die serielle Schnittstelle zu machen. Ich habe das Gerät mit meinem Laptop verbunden und habe den ausgehenden COMPORT in Bluetooth-Einstellung meines Laptops kennengelernt. Die bidirektionale Kommunikation kann nur über den ausgehenden COMPORT erfolgen, nicht über den eingehenden COMPORT.

Angenommen, der scheidende COMPORT ist COM12 und die Baudrate, die ich gesetzt habe, ist 9600. meinen Code so hier:

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; 
} 

STARTKNOPF- ACTION

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

// Befehl Senden

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()); 
     } 
    } 

// Daten lesen

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; 
    } 

Ich hoffe, das wird jemandem helfen! Vielen Dank!!!

Verwandte Themen