如何修复从c#通过蓝牙串口向Arduino发送文本的问题

本文关键字:Arduino 文本 问题 串口 何修复 | 更新日期: 2023-09-27 18:18:06

我有一个Arduino Uno与Bluesmirf Silver模块连接。我的Arduino有一个温度传感器,它会定期记录温度。Arduino监听任何通过蓝牙发送给它的字符串,并响应最新的数据。

我已经写了一个c#应用程序来获取这些数据,但我看到一些奇怪的行为。我使用下面的代码来连接,发送一个字符串并获得返回的数据。
mPort = new SerialPort(mPortName, 115200, Parity.None, 8, StopBits.One);
mPort.Open();
mPort.Write("download");
Thread.Sleep(1000);
while (mPort.BytesToRead > 0)
{
  String data = mPort.ReadExisting();
  this.BeginInvoke(new Action<String>(AddMessage), data);
}

我得到的数据看起来像这样:

在c#应用程序中本地添加的行:

Send: download

根据Arduino接收到的数据添加的行:

Read: d???+?
GotData
------
Total Readings, 1069
Num Readings, 360
Lost Readings, 709
Reading Interval, 240000
------
350,19.34
351,19.34
352,19.34
353,20.31
....

所有的文本看起来都很好,除了我发送给Arduino的字符串被回显。我发送数据的方式有问题吗?

仅供参考-蓝牙模块的数据表在这里:http://www.sparkfun.com/datasheets/Wireless/Bluetooth/rn-bluetooth-um.pdf

@Jeff -这是我在Arduino上使用的代码来接收数据:https://github.com/mchr3k/arduino/blob/master/tempsensor/StringReader.cpp

@Jeff - stringDataLen定义长度,我从这个文件调用整个函数:https://github.com/mchr3k/arduino/blob/master/tempsensor/tempsensor.ino

编辑:这里是完整的源代码

  • Arduino - https://github.com/mchr3k/arduino/tree/master/tempsensor
  • c# application - https://github.com/mchr3k/arduino/tree/master/serialdownload

c#代码肯定是由于某种原因导致流控制错误。我已经在c#中切换到使用以下代码,这将获得一个字符串,而不会损坏。

private void write(SerialPort mPort, string str)
{
    foreach (char c in str)
    {
        mPort.Write(new char[] {c}, 0, 1);
        Thread.Sleep(10);
    }
}

如何修复从c#通过蓝牙串口向Arduino发送文本的问题

可能是不正确的编码?

mPort = new SerialPort(mPortName, 115200, Parity.None, 8, StopBits.One);
mPort.Encoding = System.Text.Encoding.ASCII;   // Or System.Text.Encoding.UTF8
mPort.Open();
mPort.Write("download");

逐字节读取并逐一检查每个字节以调试较低级别的问题。ReadExisting()根据Encoding属性将字节转换为String

我的问题是由于我使用SoftwareSerial类与我的蓝牙模块在引脚2 &3.我使用的波特率是115200,据说这个页面支持:http://arduino.cc/en/Reference/SoftwareSerial

然而,这个页面(http://arduino.cc/en/Reference/SoftwareSerialBegin)声明支持的最大波特率实际上是9600。我不确定这是否准确,但将我的波特率降低到9600已经解决了我的问题。

我建议您降低通信速度,因为没有理由使用115200bps(只有当您的模块需要此速度时,才可以)。此外,你正在发送字符串"下载",这是不好的,而使用标记,如"#D",内部为你的Arduino设备的意思,发送数据到计算机。通过这种方式,您只需发送两个字节而不是八个字节,并且您将减少错误概率,并且Arduino代码将更好。

现在,让我们试着解决这个问题。首先尝试使用这样的东西,当你从Arduino设备读取数据:

ArayList dataReceaved=new ArrayList():
while(serialPort.BytesToRead>0 && serialPort.IsOpen){
                dataReceaved.Add(serialPort.ReadByte());
            }

所以我建议你一个字节一个字节地读,用这种或类似的方式。此外,如果你从Arduino设备发送数字,你应该小心。如果你是,那么使用像这样的内容:

Serial.print(temperatureValue,BYTE);

用这段代码,你明确地说你要发送的数据是字节长。如果没有帮助,请告诉我,这样我们可以尝试其他方法。