当前位置: 首页 > 知识库问答 >
问题:

digitalRead在arduino上读取字符串

闻人昊昊
2023-03-14

我正在和两个阿杜伊诺斯·莱昂纳多做一个通讯系统。为了传输,我必须将字符串转换成比特,并通过PWM引脚发送。问题是,我该怎么做接收器?

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

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

编辑:

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

共有3个答案

阎璞瑜
2023-03-14

嗯,这是我写的代码:

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。建议?

高茂
2023-03-14

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

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

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

韩晋
2023-03-14

你没有说你的物理交流渠道是什么。这很重要。在Arduino您的主要选择是:

  • 串行(通过真正的串行引脚或软件串行库)
  • SPI
  • I2C
  • 单线

您还可以通过向数字管脚写入数据或从数字管脚读取数据来实现自己的协议,尽管这很可能看起来像SPI。这些方法都不需要将任何内容转换为字符串,除非您想发送字符串。我有点不知所措,你到底是如何通过PWM发送数据的:这似乎是一个毫无根据的黑客行为。

 类似资料:
  • 字符串用于存储文本。 它们可用于在LCD或Arduino IDE串行监视器窗口中显示文本。 字符串对于存储用户输入也很有用。 例如,用户在连接到Arduino的键盘上键入的字符。 Arduino编程中有两种类型的字符串 - 字符数组,与C编程中使用的字符串相同。 Arduino String,它允许我们在草图中使用字符串对象。 在本章中,我们将学习字符串,对象以及Arduino草图中字符串的使用。

  • 我试图在一些python代码和arduino代码之间来回“乒乓”信息。我想定期向arduino代码发送两个设定点(例如,在分钟内),在arduino上读取它们 现在,我无法获得可靠的信息来来回跳转。我在搜索中没有找到任何与此类似的内容,我试图修改的所有内容都不起作用。最接近我的是这个(实际上它并没有在发送和接收之间来回切换): python 阿杜伊诺: 我最终得到的只是重复的相同值(不是实际发送的

  • 问题内容: 我对Java有点陌生,当我将unicode字符串分配给 为什么在两种情况下结果都不同,文件a.txt也包含相同的字符串。但是当我打印文件的输出时,它会打印而不是实际的unicode字符。任何想法,如果我要归档也要作为字符串打印的内容,我该怎么做。 问题答案: 您的代码应该是正确的,但是我想文件“ a.txt”不包含用UTF-8编码的Unicode字符,而是转义的字符串“ \ u0142

  • 我刚来Java,如果这是个明显的问题,我很抱歉。 我正在尝试逐个字符读取字符串以创建树节点。例如,输入,节点为 我注意到了 我可以用一个循环来获得所有的角色吗?就像 我试过了,但不管用。 我该怎么做? 非常感谢你的帮助。 扫描器读取器=新扫描器(System.in);System.out.println(“将节点输入为大写字母,不带空格,结尾为'/'”);int i=0;char node=rea

  • 我用的是阿尔杜伊诺式的。我遇到了的奇怪行为。Arduino通过COM4上的USB供电和通信。我正在64位Windows ;7上运行Eclipse。 我当前的Arduino代码看起来如下所示;延迟是为了让我可以启动和停止Java服务并查看Arduino IDE中的串行窗口,inputBuffer是一个字符数组。 下面是Java端的代码。我修改了它的双向通信与串行端口。这只在启动时发送一个字节数组。

  • 我正在开发一个用于从MIFARE标签读取和写入数据的应用程序。我买了一个可以使用NFC技术读取和写入MIFARE标签操作的设备。 NFC屏蔽 我一直在使用MIFARE ultralight标签,但在尝试验证特定内存地址时遇到了问题。由于这个原因,我不能开始阅读。这是我的Arduino代码: 此读取代码是为Arduino Mega 2560和Seeedstudio NFC Shield v1.0和M