我在和两个阿多尼奥诺·莱昂纳多做一个通讯系统。为了传输,我必须转换一个字串,并通过一个PWM引脚发送给他们。问题是,我该怎么做接受者?
我的想法是在一个数字引脚中接收数据,这样我就可以将低/高转换为'0‘和'1',把8位放在一个字符串中,转换成字符,然后我得到最后的字符串。
如有任何帮助/建议,将不胜感激。
编辑:
发布于 2013-03-25 20:48:33
发布于 2013-03-25 21:45:03
使用PWM是在设备之间进行二进制数据通信的困难方式,而不是其他更容易获得的外围设备,而是可行的。基本上是PCM或脉冲编码调制。最简单的方法是断言引脚的时间长度,表示数据。例如,在伺服系统中,PWM重复表示已知位置的时间长度,而伺服接收器将脉冲长度转换为位置或数据。
对于Arduino用户来说,PWM的接收并不是典型的,但是AVR微系统却能做到这一点。有两种可能的方法来捕捉这种脉冲持续时间。PulseIn()函数是Arduion的第一个通用函数。其中这个函数不是实时的。它只是时间标记之间的脉冲之间的周期,并限制为只有几微秒。我相信还有其他的变化可能会持续更长时间。这个可以工作得很好。但其他中断(如串行函数和定时器)可能会出现问题。
另一种方法称为输入捕获中断。下面的GISTHUB INputCapture.ino是这样的代码示例,我从另一个来源获得了这些代码。由于不是典型的,所以代码不是作为Arduino库编写的。但能非常准确地捕捉到脉搏的长度。总之,输入捕获引脚硬件锁在系统时钟上,触发,然后在某个潜伏时间可以读取。
发布于 2013-03-26 12:02:25
嗯,这就是我写的代码:
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。糖?
https://stackoverflow.com/questions/15623095
复制相似问题