0

我正在用 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);
  }
 }
}

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

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

4

2 回答 2

0

好吧,如果您认为问题要复杂得多,那么您的问题。我已经阅读了您在 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 上对问题和评论的回答,您正在尝试解决可能无法正常工作的算法的实现问题。您应该首先尝试找到可以使用 MATLAB(或免费的 OCTAVE)模拟的合适算法,确保它正常工作,然后尝试在嵌入式硬件上实现它。

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

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

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

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

于 2013-03-28T13:21:02.617 回答
0

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

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

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

于 2013-03-27T21:12:29.183 回答