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