【问题标题】:Comunication between C# and Arduino via bluetooth, receiving strange dataC#和Arduino之间通过蓝牙通信,接收到奇怪的数据
【发布时间】:2021-10-15 07:39:18
【问题描述】:

我正在尝试通过蓝牙在 Arduino Mega 和 C# windows 窗体应用程序之间发送数据。

从 Arduino 到 C# 一切顺利,但是,当从 C# 发送到 Arduino 时,我得到一些奇怪的值: 发送“abcde”输出 79 167 186 170 2。我假设每个值都代表一个字母,因为仅发送“a”输出 79。

但是,例如,我不明白为什么我得到这个值而不是 ascii 值。

以下是相关的 C# 代码:

if (serialPort1.IsOpen) serialPort1.Close();
serialPort1.PortName = "COM" + x.ToString();
serialPort1.BaudRate = 9600;
try
{
    if (!serialPort1.IsOpen) serialPort1.Open();
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}
serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(DataReceived);
 

每秒调用一个函数,为dataToSend "abcde",例如:

private void DataSender(string dataToSend)
{
    serialPort1.Write(dataToSend);
    //MessageBox.Show(dataToSend);
}

以及所有 Arduino 代码(我使用的是具有 4 个串行端口的 Arduino Mega):

void setup() {
  Serial.begin(9600);
  Serial3.begin(9600);
}

void loop() {
  if (Serial3.available() > 0) {
    delay(10);
    int x = Serial3.read();
    delay(10);
    Serial.println(x);
  }
}

我尝试添加延迟以查看是否可以更好地获取数据,但没有奏效。有什么想法我在这里想念的吗?我认为这与加密发送数据的方式有关,但我不知道。

【问题讨论】:

  • 'a' 的代码点是 97,而不是 79。
  • 我知道,我以为可能是颠倒了,但其他字母也没有检查出来。
  • 假设您可以从字节数组写入串行端口,请尝试发送 new byte[] {97, 98, 99, 100, 101} 而不是字符串,看看会发生什么。
  • 忘记我之前说的吧,我刚试过这个,然后......它显示相同的数字,79 167 186 170 2。所以我猜是 Arduino 翻译错误了?
  • 改用Serial.write(x);。此外,延迟没有帮助,您可以删除它们。

标签: c# winforms arduino serial-port communication


【解决方案1】:

如果有人发现自己遇到了和我一样的问题,我的问题是电路板超载了。我连接了 6 个超声波传感器以及其他一些东西。当我更换他们的电源时,它开始按预期工作。

【讨论】:

    【解决方案2】:

    您的 Serial.println(x); 似乎打印为 ASCII 编码的十进制,我相信这是该方法的标准行为。

    很遗憾,我目前无法复制此问题,但我相信使用 Serial.readString(x) 而不是 Serial.read() 可能会解决此问题。

    数据在串行发送时没有加密,它只是作为明文字节发送,接收方知道如何对其进行编码。

    见:https://www.arduino.cc/reference/en/language/functions/communication/serial/readstring/

    来自我下面的评论。 此外,可能值得将字符串作为字节数组byte[] bytes = Encoding.ASCII.GetBytes(dataToSend); 发送并通过网络发送字节数组。这样,您使用的编码就毫无疑问了

    【讨论】:

    • 我试过这个,输出是“O⸮⸮⸮”。我的意思是按字节而不是文本加密,对不起。不过,我会查一下,看看是否有更多方法可以读取信息,谢谢。
    • 这是有道理的,因为十进制编码的 ascii 中的值 79 167 186 170 2 在 ascii 文本中是 O§ºª。与“abcde”相对应的十进制编码 ascii 是 97 98 99 100 101 你试过在 arduino 上投射 println 吗?
    • 我还建议使用 comport 嗅探器来查看通过线路发送的数据是否错误,或者 arduino 是否编码错误。此外,可能值得将字符串作为字节数组byte[] bytes = Encoding.ASCII.GetBytes(dataToSend); 发送并通过线路发送字节数组。这样就毫无疑问您使用的是什么编码,
    • 你是指像wireshark这样的东西吗?我过去曾尝试使用它,但没有成功。我试试看。
    • 你的wireshark不适用于comports(据我所知)你需要一个特定的应用程序,你可以很容易地在谷歌上找到它们。我还编辑了上面的评论,提供了更多信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 2018-06-15
    • 2016-07-29
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多