我正在与2个Arduinos Leonardo建立通信系统。 为了传输,我必须将字符串转换成比特并通过PWM引脚发送它们。 问题是,我该如何做接收器?
我的想法是在数字引脚中接收数据,因此我可以将LOW / HIGH转换为'0'和'1',将8位转换为字符串,转换为char然后我有我的最终字符串。
任何帮助/建议都将不胜感激。
编辑:
答案 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?