【问题标题】:digitalRead to String on arduino在arduino上数字读取到字符串
【发布时间】:2013-03-25 19:28:10
【问题描述】:

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

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

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

编辑:

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

【问题讨论】:

  • 无论您做什么,确保接地!如果您不这样做,它们对 5V 的定义将不同,从而导致意外行为。 (简而言之)。另外,您为什么使用 PMW 引脚?您可以通过非 PMW 引脚发送数据。 PMW 只是非常快地打开-关闭(我什至不知道 Arduino 是否能读懂:有人请支持这个或争论这个 - 我不知道。)这可以模拟较低的电压来“调暗”一个 LED不会浪费一个模拟引脚。
  • @AnnonomusPerson 检查我的编辑信息。 “连接地面”是什么意思? PWM 工作正常,至少我在串行监视器中得到数据没有错误。
  • 我的意思是从一个 Arduino 的地面到另一个。如果它是无线的,则无需执行此操作。电压只是与地的比较;如果有不同的接地但相同的能量,它们将是不同的电压。很难解释,我自己也不是很理解,但是有人在 SO 上将电路板连接在一起时遇到了问题,连接地面是解决方案。只是一般的经验法则,如果不同的电气组件通过电线连接,则连接接地。空间和时间用完了,稍后会解释。
  • 为什么要让两个 Arduino 通过 FSK 进行通信?
  • 其实我想要两个以上的 Arduino 进行交流。它将类似于无线中的环形链接,这意味着每个 Arduino 都将成为接收器/发射器。

标签: string serial-port arduino


【解决方案1】:

你没有说你的物理沟通渠道是什么。这个很重要。在 Arduino 上,您的主要选择是:

您还可以通过向数字引脚写入数据和从数字引脚读取数据来实现自己的协议,尽管这很可能看起来像 SPI。这些方法都不需要将任何内容转换为字符串,除非您想要发送字符串。我有点不知所措你是如何通过 PWM 发送数据的:这似乎是一个毫无根据的黑客攻击。

【讨论】:

  • 他确实声明他的物理接口是 PWM。请参阅下面的解决方案。
  • @angelatlarge 检查我的编辑信息。由于浪费内存,我更喜欢不使用库,我不确定我是否正确。我将重新检查 SPI 的工作原理,但我认为这不是我想要的。
【解决方案2】:

使用 PWM 是在设备之间传递二进制数据的困难方式,它可以代替其他更容易获得的外设,但也是可行的。基本上是 PCM 或脉冲编码调制。最简单的方法是引脚被断言的时间长度,代表数据。例如,伺服系统会发生什么。其中 PWM 重复表示已知位置的相同时间长度,并且伺服器的接收器将脉冲长度转换回位置或数据。

对于 Arduino 用户来说,PWM 的接收并不典型,但 AVR micro 的能力远不止于此。有两种可能的方法来捕捉这种脉冲持续时间。 Arduion 的第一个和共同点是 PulseIn() 函数。此功能不是实时的。它只是对脉冲之间的周期进行时间戳记,并且仅限于几微秒的持续时间。我相信还有其他变化可能会更长。这可以很好地工作。但可能与串行函数和定时器等其他中断有关。

另一种方法称为输入捕捉中断。以下 GISTHUB INputCapture.ino 是我从另一个来源抢救的此类代码的示例。不是典型的,代码不是作为 Arduino 库编写的。但确实非常准确地捕获了脉冲的长度。简而言之,输入捕获引脚硬件在触发时锁定系统时钟,然后在某个潜在时间可以读取它。

【讨论】:

  • 检查我的编辑信息。接收不是 PWM,所以 PulseIn() 在我的情况下是没有必要的。
【解决方案3】:

嗯,这是我写的代码:

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

这不是我所期望的。第一个 digValue 始终为 0。建议?

【讨论】:

  • 从技术上讲,您应该已经编辑了您的问题并发布了代码......但没有造成任何伤害。这些是答案,如果您自己找到它,您可以发布......然后您可以接受您最喜欢的答案。如果你想改变它,下面应该有一个删除按钮,你可以编辑。没有造成任何伤害,但我一开始看到这里的代码很困惑。
  • 对不起,当时不知道..现在太晚了
猜你喜欢
  • 1970-01-01
  • 2012-06-27
  • 2023-02-10
  • 1970-01-01
  • 2018-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多