Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Arduino上的串行软件进行双端口接收_Arduino - Fatal编程技术网

使用Arduino上的串行软件进行双端口接收

使用Arduino上的串行软件进行双端口接收,arduino,Arduino,我使用arduino板上的两个软件串行端口从两个传感器获取数据时遇到问题。我注意到以前可能有人问过一个类似的问题,但答案表明这是不可能的,我完全知道,根据这里的例子,这是可以做到的(http://arduino.cc/en/Tutorial/TwoPortReceive)! 我使用的是arduino以太网。我试图从中获取数据的设备包括来自sparkfun的GPS和IMU 我可以只使用软件串行端口从任一设备获取数据,但只要添加第二个软件串行端口,两个端口都不会工作。我无法使用硬件串行端口,因为其他

我使用arduino板上的两个软件串行端口从两个传感器获取数据时遇到问题。我注意到以前可能有人问过一个类似的问题,但答案表明这是不可能的,我完全知道,根据这里的例子,这是可以做到的(http://arduino.cc/en/Tutorial/TwoPortReceive)!

我使用的是arduino以太网。我试图从中获取数据的设备包括来自sparkfun的GPS和IMU

我可以只使用软件串行端口从任一设备获取数据,但只要添加第二个软件串行端口,两个端口都不会工作。我无法使用硬件串行端口,因为其他设备正在使用该端口

我的代码与示例完全相似:

#include <SoftwareSerial.h>

SoftwareSerial portOne(7,8);
SoftwareSerial portTwo(5,6);

void setup()
{
  Serial.begin(9600);


  portOne.begin(9600);
  portTwo.begin(9600);
}

void loop()
{

  portOne.listen();
  while (portOne.available() > 0) {
    char inByte = portOne.read();
    Serial.write(inByte);
  }

  delay(500);

  portTwo.listen();
  while (portTwo.available() > 0) {
    char inByte = portTwo.read();
    Serial.write(inByte);
  }

  Serial.println();
}
#包括
软件串行端口(7,8);
软件串行端口2(5,6);
无效设置()
{
Serial.begin(9600);
波尔通.贝京(9600);
波尔图二。贝京(9600);
}
void循环()
{
听一听;
while(portOne.available()>0){
char inByte=portOne.read();
串行写入(字节内);
}
延迟(500);
第二,听一听;
while(portTwo.available()>0){
char inByte=portTwo.read();
串行写入(字节内);
}
Serial.println();
}

有什么想法吗?

引用的示例一次只监听一个端口。建议的解决方案是升级到Arduino Mega(https://www.sparkfun.com/products/11061)它有4个硬件串行端口

为了同时支持两个软件串口,需要大量的CPU资源。这也是一个困难的设计和过多的编程时间远远超过了58美元以上的运费

再次查看您的代码时,我突然意识到您正在立即检查portOne.listen命令后面的字符。在9600波特时,第一个字符到达大约需要1毫秒,您的while测试将在第一个字符到达之前完成,并且执行portTwo.listen命令

出于测试目的,请尝试在portOne.listen命令之后添加1-2毫秒的延迟,并查看是否获得字符

例如(未测试,请注意,如果端口1发送的字符没有字符间隙,则第一个while将永远不会失败,从而阻止读取端口2字符):


引用的示例一次只主动侦听一个端口。建议的解决方案是升级到Arduino Mega(https://www.sparkfun.com/products/11061)它有4个硬件串行端口

为了同时支持两个软件串口,需要大量的CPU资源。这也是一个困难的设计和过多的编程时间远远超过了58美元以上的运费

再次查看您的代码时,我突然意识到您正在立即检查portOne.listen命令后面的字符。在9600波特时,第一个字符到达大约需要1毫秒,您的while测试将在第一个字符到达之前完成,并且执行portTwo.listen命令

出于测试目的,请尝试在portOne.listen命令之后添加1-2毫秒的延迟,并查看是否获得字符

例如(未测试,请注意,如果端口1发送的字符没有字符间隙,则第一个while将永远不会失败,从而阻止读取端口2字符):


这段代码将不起作用,或者如果它真的起作用的话,它的效果会很差。SoftwareSerial只有一个内部缓冲区。是的,可以存在多个SoftwareSerial对象,但其中只有一个控制内部缓冲区。当任何RX引脚被断言时,将生成一个中断,但只有正在侦听的RX引脚会检查开始位

真正需要的是当中断从起始位出现时,能够检查多个管脚。然后必须设置指向适当数据结构的指针。这会很复杂,但也有可能

或者干脆放弃中断驱动接收,旋转检查两个/所有RX引脚,并根据您看到的引脚启动接收。请注意,此代码有很多漏洞,您需要一个示波器才能使其正常工作


我有一个类似的问题,这就是为什么我找到了你的传感器。在和我的同事讨论过之后,我们决定按旋转顺序读取传感器。我们的传感器报告传感器的当前状态,而不是特定的事件,因此如果我们丢失一些报告也没关系。因此,我们将从端口1读取数据,然后从端口2读取数据,然后从端口1读取数据,等等。我们的传感器会吐出一行行文本,这样我们就知道何时切换到下一个传感器。

此代码将不起作用,或者如果完全起作用,它将无法正常工作。SoftwareSerial只有一个内部缓冲区。是的,可以存在多个SoftwareSerial对象,但其中只有一个控制内部缓冲区。当任何RX引脚被断言时,将生成一个中断,但只有正在侦听的RX引脚会检查开始位

真正需要的是当中断从起始位出现时,能够检查多个管脚。然后必须设置指向适当数据结构的指针。这会很复杂,但也有可能

或者干脆放弃中断驱动接收,旋转检查两个/所有RX引脚,并根据您看到的引脚启动接收。请注意,此代码有很多漏洞,您需要一个示波器才能使其正常工作

我有一个类似的问题,这就是为什么我找到了你的传感器。在和我的同事讨论过之后,我们决定按旋转顺序读取传感器。我们的传感器报告传感器的当前状态,而不是特定的事件,因此如果我们丢失一些报告也没关系。因此,我们将从端口1读取数据,然后从端口2读取数据,然后从端口1读取数据,等等。我们的传感器会输出一行行文本,这样我们就知道何时切换到下一个传感器。

使用:

超过500毫秒对我来说太长了
void loop()
{

    portOne.listen();
    delay(2);
    while (portOne.available() > 0) {
        char inByte = portOne.read();
        Serial.write(inByte);
        delay(1);
    }

    portTwo.listen();
    delay(2);
    while (portTwo.available() > 0) {
        char inByte = portTwo.read();
        Serial.write(inByte);
        delay(1);
    }
    Serial.println();
}
  {     portOne.listen();

   if (PortOne.available() ) {
       ricevo = myPort1.read(); }

   // delay(2);   // ridiculos waiting time
   // delay(1);   // extra ridiculos waiting time