String 数字读取到arduino上的字符串

String 数字读取到arduino上的字符串,string,serial-port,arduino,String,Serial Port,Arduino,我正在和2个Arduinos Leonardo做一个通讯系统。 为了传输,我必须将字符串转换成位,然后通过PWM引脚发送。 问题是,我怎样做接收器 我的想法是接收数字管脚中的数据,这样我可以将低/高转换为“0”和“1”,将8位放入一个字符串中,转换为字符,然后得到最后一个字符串 如有任何帮助/建议,将不胜感激 编辑: 我使用PWM是因为我想实现FSK调制,一点一点地发送 我有一些硬件使通讯系统工作 我的通信物理通道是串行的(通过Arduino引脚) 在接收器硬件将提供我的TTL信号,所以我将有

我正在和2个Arduinos Leonardo做一个通讯系统。 为了传输,我必须将字符串转换成位,然后通过PWM引脚发送。 问题是,我怎样做接收器

我的想法是接收数字管脚中的数据,这样我可以将低/高转换为“0”和“1”,将8位放入一个字符串中,转换为字符,然后得到最后一个字符串

如有任何帮助/建议,将不胜感激

编辑:

  • 我使用PWM是因为我想实现FSK调制,一点一点地发送
  • 我有一些硬件使通讯系统工作
  • 我的通信物理通道是串行的(通过Arduino引脚)
  • 在接收器硬件将提供我的TTL信号,所以我将有0V/5V。这就是为什么我认为digitalRead()应该起作用
  • 数据通过PWM发送,通过两级信号接收
  • 我将不得不做一些协议来发送/接收数据,仍然不知道如何
      你不能说你的物理沟通渠道是什么。这很重要。在Arduino上,您的主要选择是:

      • 串行(通过实际串行引脚或)

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

      使用PWM在设备之间传输二进制数据是一种困难的方式,而不是其他更容易使用的外围设备,但这是可行的。基本上是PCM或脉冲编码调制。最简单的方法是断言pin的时间长度,表示数据。例如,这就是伺服的情况。其中,PWM重复表示已知位置的相同时间长度,且伺服接收器将脉冲长度转换回位置或数据

      PWM的接收对于Arduino用户来说不是典型的,但AVR micro完全能够做到这一点。有两种可能的方法来捕获这样的脉冲持续时间。首先,艰苦的共同点是功能。此函数不是实时的。它只是给脉冲之间的周期加上时间戳,并将持续时间限制为几微秒。我相信还有其他变化可能会持续更长时间。这可以很好地工作。但可能与其他中断(如串行功能和计时器)有关


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

      这是我写的代码:

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

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

      无论你做什么,都要确保接地!如果您不这样做,他们对5V的定义将不同,从而导致意外行为。(简单地说)。另外,为什么要使用PMW引脚?您可以通过非PMW引脚发送数据。PMW的开关速度非常快(我甚至不知道Arduino是否能读懂:有人请支持这一点或对此进行辩论——我不知道)。这可以模拟较低的电压来“调暗”LED,而不会浪费模拟管脚。@AnnonomusPerson检查我的编辑信息。“接地”是什么意思?PWM工作正常,至少我在串行监视器中获得的数据没有错误。我的意思是从一个Arduino接地到另一个Arduino接地。如果是无线的,你不需要这样做。电压只是对地的比较;如果有不同的接地,但能量相同,那么它们将具有不同的电压。这很难解释,我自己也不太明白,但有人在把电路板连接在一起时遇到了问题,所以连接地面就是解决办法。根据一般经验,如果不同的电气部件通过电线连接,请接地。没有空间和时间了,稍后会解释更多。为什么你想让两个Arduinos通过FSK进行通信?实际上我想要两个以上的Arduinos进行通信。这将类似于无线中的环形链路,这意味着每个Arduino都将是一个接收器/发射器。他确实声明他的物理接口是PWM。请参阅下面的解决方案。@angelatlarge检查我的编辑信息。我宁愿不使用库,因为这会浪费内存,我不确定我是否正确。我会重新检查SPI的工作原理,但我认为这不是我想要的。检查我的编辑信息。接收信号不是PWM,所以脉冲信号()在我的情况下是不必要的。从技术上讲,你应该编辑你的问题并发布代码。。。。但没有造成伤害。这些都是答案,如果你自己发现的话,你可以发布。。。然后你可以接受你最喜欢的答案。如果你想改变它,应该有一个删除按钮下面,你可以编辑。没有造成任何伤害,但一开始看到下面的代码时我很困惑。对不起,当时我不知道。。现在太迟了