2017-10-05 133 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; 
    } 

我希望这会帮助别人!谢谢!!!