【问题标题】:How can I digitalRead a pin and convert data to String on Arduino?如何在 Arduino 上数字读取引脚并将数据转换为字符串?
【发布时间】:2013-03-27 21:06:23
【问题描述】:

我正在与 2 个 Arduinos Leonardo 一起做一个通信系统。要传输,我必须将字符串转换为位并通过 PWM 引脚发送它们。问题是,接收方怎么办?

我的想法是在数字引脚中接收数据,因此我可以将 LOW/HIGH 转换为“0”和“1”,将 8 位放入字符串中,转换为 char,然后我就有了最终的字符串。

一些信息: - 我使用 PWM 是因为我想实现 FSK 调制,逐位发送;- - 我有一些硬件可以让通信系统正常工作; - 我的物理通信渠道是串行(通过 Arduino 引脚); - 接收器硬件会为我提供 TTL 信号,所以我会有 0V/5V。这就是为什么我认为 digitalRead() 应该起作用的原因; - 数据通过 PWM 发送,并以两级信号接收; - 我必须做一些协议来发送/接收数据,但仍然不知道如何......

这是我写的代码:

void setup() {
  Serial.begin(9600);
  while (!Serial) {;}
}
void loop() {
  char bitPosition = 0;
  String inMessage = 0;
  while (Serial.available() > 0) {
    char outChar;
    boolean digValue = digitalRead(inPin);
    for(bitPosition = 7; bitPosition >= 0;  ){
      if(digValue == LOW){
        bitWrite(outChar, bitPosition, 0);
      }
      if(digValue == HIGH){
        bitWrite(outChar, bitPosition, 1);
      }
    bitPosition--;
    }
  inMessage.concat(outChar);
  if(inMessage != 0){
    Serial.println("Received:  " + inMessage);
  }
 }
}

我希望此代码将 digitalRead 的 HIGH/LOW 状态转换为字符串。 0/1 -> 字符 (outChar) -> 字符串 (inMessage)。我不知道我是不是想错了。建议? 我应该对波特率做些什么来接收/传输数据吗?怎么样?

任何帮助/建议将不胜感激。

【问题讨论】:

  • 所以您想将位按 8 分组并从中创建一个char
  • 是的,比如 8bits -> char -> String
  • 然后使用位移位和按位逻辑运算符。
  • 我试图理解这一点。你能解释一下它在我的情况下是如何工作的吗?
  • unsigned char c = 0; for (i = 0; i < 8; i++) { c <<= 1; c += bit; }

标签: string arduino serial-port


【解决方案1】:

查看 SoftwareSerial 在 Arduino 中是如何实现的,以了解如何完成这项工作。

http://arduino.cc/en/Reference/SoftwareSerial

“SoftwareSerial 库的开发允许在 Arduino 的其他数字引脚上进行串行通信,使用软件来复制功能(因此得名“SoftwareSerial”)。”

【讨论】:

  • 我以前读过这个,但我认为这只是两个必须在同一个 arduino 上工作的连续剧。我错了吗?我希望不同的 arduino 与每个串行通信。
【解决方案2】:

好吧,如果您认为问题要复杂得多的话。我已阅读您在 EE.SE 上发布的类似(相同?)问题。

您似乎还没有了解有关您的问题的基本信息。 这不是软件问题。如果我在全球范围内总结您的问题。

您想将数据从 arduino A 发送到 arduino B。

您计划使用 arduino A 的 PWM 引脚生成 FSK 信号。

第一条评论:如何?指针根据相位调制移动的正弦波查找表?这似乎很容易。所以让我们相信这是你选择的方式。 (这里说是逻辑信号,EE.SE上说是无线信号)

现在你有一个 XX kHz 的信号(我们不知道 XX 值。但根据你的 Arduino 的 Xtal 速度,我不能大于 ~500Khz)

在 arduino B 上,您必须解决时钟恢复问题,因为在 arduino B 上,您无法访问 arduino A 的时钟。这意味着您无法将获得的信号与参考时钟进行比较.当您分析接收到的信号时,您会得到相对于本地时钟的特定相位。但是因为你不知道ardunio A的参考相位,所以你不能说接收位是-90°还是+90°。因此,您不能为接收到的信号分配 0 或 1。

这不是一个小问题。根据您在此处或 EE.SE 上对问题和 cmets 的回答,您正在尝试解决可能无法正常工作的算法的实现问题。您应该首先尝试找到可以使用 MATLAB(或免费的 OCTAVE)模拟的合适算法,确保其正常工作,然后尝试在嵌入式硬件上实现它。

您在 EE.SE 上收到很多关于您想做什么的回答。这是因为解决一个在专家看来是错误的东西的问题是没有意义的。

因此,如果您想要有意义的答案。请花更多时间从概念上向我们解释您计划解决问题的内容和方式。

添加有关您认为 FSK 工作原理的信息。你打算如何使用 PWM 来做 FSK,这不是微不足道的。以及您如何计划,从概念上检测接收到的符号是 1 还是 0。

事实上,我的回答是:如果我们能解决你的拷贝位问题,它不会解决你的问题。

【讨论】:

  • 1) 我想用一些波特率发送 0 和 1(我需要知道怎么做),比如 LED 的闪烁 2) 我正在寻找专家的意见,如果我知道如何解决我的问题我肯定不在这里 3) 我发现了这个arduino.cc/en/Reference/Firmata 也许那里有一些有用的东西。谢谢
猜你喜欢
  • 2016-07-20
  • 1970-01-01
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
  • 2011-02-06
  • 2015-08-03
  • 1970-01-01
  • 2022-09-28
相关资源
最近更新 更多