Получение непрерывных данных с использованием 32 футов в .Net (BLUETOOTH)

Я создаю приложение Windows Form, где оно подключается к устройству через Bluetooth. Я могу отправлять команды на устройство, и я постоянно получаю данные. Проблема, с которой я столкнулся, заключается в том, что я не могу отображать непрерывные данные в текстовом поле. В текстовом поле отображается только первая строка символов, которую получает приложение. Вот мой код:

ДЕЙСТВИЕ КНОПКИ ПОДКЛЮЧЕНИЯ:

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

ПОТОК ДЕЙСТВИЕ

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

ОБРАТНЫЙ ДЕЙСТВИЕ:

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

ДЕЙСТВИЕ КНОПКИ СТАРТ: Здесь я посылаю команду "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 Exception. Я также пытался получить данные из последовательного порта и на всякий случай использовал событие DataReceived, но все равно это не помогло. Любая помощь будет оценена по достоинству. Благодарю вас!


person Akhil Nair    schedule 05.10.2017    source источник


Ответы (1)


ХОРОШО! Я решил проблему. Не заморачиваясь с библиотекой 32feet (хотя программировать с 32feet весело), ​​я решил установить связь через последовательный порт. Я подключил устройство к своему ноутбуку и узнал исходящий COMPORT в настройках Bluetooth моего ноутбука. Двусторонняя связь может осуществляться только через исходящий 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;
}

НАЧАТЬ ДЕЙСТВИЕ КНОПКИ

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

// ОТПРАВИТЬ КОМАНДУ

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

Я надеюсь, что это поможет кому-то! Спасибо!!!

person Akhil Nair    schedule 06.10.2017