在arduino上使用digitalRead to String

时间:2013-03-25 19:28:10

标签: string serial-port arduino

我正在与2个Arduinos Leonardo建立通信系统。 为了传输,我必须将字符串转换成比特并通过PWM引脚发送它们。 问题是,我该如何做接收器?

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

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

编辑:

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

3 个答案:

答案 0 :(得分:1)

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

您也可以通过向/从数字引脚写入和读取数据来实现自己的协议,但更可能的情况是这看起来像SPI。除非想要发送字符串,否则这些方法都不需要将任何内容转换为字符串。我有点不知道你是如何准确地通过PWM发送数据的:看起来它似乎是一个没有经验的黑客。

答案 1 :(得分:1)

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

对于Arduino用户来说,接收PWM并不常见,但AVR micro不仅仅是能够做到这一点。捕获这种脉冲持续时间有两种可能的方法。 Arduion的第一个和共同点是PulseIn()函数。这个功能不是实时的。它只是在脉冲之间对周期进行时间标记,并且仅限于几微秒的持续时间。我相信还有其他变化可能会更长。这可以很好地工作。但可能会出现其他中断问题,例如串行功能和定时器。

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

答案 2 :(得分:0)

嗯,这是我写的代码:

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. Sugestions?