【问题标题】:How to trigger Serial port data recieved event with bluetooth c#如何用蓝牙c#触发串口数据接收事件
【发布时间】:2013-09-02 19:37:18
【问题描述】:

我的设备可以通过蓝牙作为 COM5 连接到我的笔记本电脑。该设备有一个脉冲传感器。我想将来自传感器的数据绘制到图形上。但是,当我连接到 COM5 时,未触发 serialport_Datarecieved 事件。我尝试了使用 matlab 的设备。它需要并绘制数据,但我无法在 c# 中获取数据。我检查了设备的连接状态,没问题。我尝试更改 DtrEnabled 和 RtsEnapled 属性,但没有成功。

    private void Form1_Load(object sender, EventArgs e)
    {

        cmbPortList.Items.AddRange(SerialPort.GetPortNames());
        cmbPortList.Sorted = true;
        cmbPortList.SelectedIndex = 0;


        this.serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(serialPort1_DataReceived);

    }

    private void btnOpenPort_Click(object sender, EventArgs e)
    {
        try
        {
            serialPort1.PortName = cmbPortList.Text;
            serialPort1.BaudRate = 9600;
            serialPort1.DataBits = 8;
            serialPort1.ReadTimeout = 500;
            serialPort1.WriteTimeout = 500;
            serialPort1.Handshake = Handshake.None;

            if (!serialPort1.IsOpen)
            {
                btnRun.Enabled = true;
                serialPort1.Open();
            }

        }
        catch (Exception ex)
        {
            serialPort1.Close();
        }
    }
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        while (serialPort1.BytesToRead > 0)
        {
            Thread.Sleep(50);
            byte[] buffer = new byte[serialPort1.BytesToRead];
            serialPort1.Read(buffer, 0, buffer.Length);
        } 

    }

我无法读取缓冲区中的任何数据。设备未通过蓝牙连接时,LED 闪烁。所以我绝对确定我连接到设备。 是蓝牙问题还是代码问题?我应该使用另一个库来通信蓝牙设备吗? 我已阅读下面的链接。 SerialPort fires DataReceived event after close SerialPort not receiving any data

【问题讨论】:

    标签: c# visual-studio-2012 bluetooth serial-port


    【解决方案1】:

    这可能与 SerialPort 的关系不大,而与 Winforms 线程与串行端口的后台工作线程交互的方式有关。有关详细信息,请参阅this 的解决方案。

    【讨论】:

    • 在计时器(100 毫秒)中,我使用了 serialport.Write("Blast");这会在每个滴答声中触发 serialport_DataRecieved 事件,我可以读取来自 Pulse 传感器的数据。但是,当我使用 serialport.Write("AbcDeFGGHzxY");那不是触发事件。我真的无法理解其中的逻辑。我们是否必须每次都将初始数据写入端口?如果是,那不好,因为我需要绝对正确的数据。也许我应该使用 RecievedBytesTreshold。我真的很困惑..
    • 奇怪,绝对是我没见过的东西,但话说回来,我没有用我的串口做蓝牙。您可以试试这个.NET serial port host library(来自 Package Manger 控制台:Install-Package AgingMonarch),看看它是否会给您带来不同的行为。这是usage
    • 我认为电路的设计者用“s”请求数据。它必须与它的协议或十六进制代码有关。我在电路%请求数据fprintf(s,'s')的matlab示例中找到了该代码;这就是为什么我在使用 serialport.Write("Blast"); 时可以读取数据的原因。我也试过所有的字母。只有 's' 触发事件。
    【解决方案2】:

    我认为电路的设计者从带有“s”的设备请求数据。它必须与它的协议或十六进制代码有关。我在电路%请求数据fprintf(s,'s')的matlab示例中找到了该代码;这就是为什么我在使用 serialport.Write("Blast"); 时可以读取数据的原因。我也试过所有的字母。只有 's' 字符会触发事件。

    【讨论】:

      猜你喜欢
      • 2012-11-07
      • 2018-04-17
      • 2023-02-23
      • 2020-03-19
      • 1970-01-01
      • 2011-09-09
      • 2015-04-21
      • 2018-03-14
      • 1970-01-01
      相关资源
      最近更新 更多