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
Serial port Arduino在长时间后停止向串行端口发送数据_Serial Port_Arduino_Communication - Fatal编程技术网

Serial port Arduino在长时间后停止向串行端口发送数据

Serial port Arduino在长时间后停止向串行端口发送数据,serial-port,arduino,communication,Serial Port,Arduino,Communication,我使用的设备是永久连接的设备,有时会向PC(Windows 7 x64)发送信号。使用Arduino.cc中的Arduino 1.0软件编译的代码 关于arduino.cc的主题 它工作得很好,但有时,经过很长一段时间后,PC停止接收来自Arduino设备的数据。这不是PC软件问题,因为所有软件(putty、telnet等)的作用都是相同的-我可以向Arduino发送数据(设备响应命令);我就是收不回来 中描述了类似的问题,但未提出解决方案 断开/连接设备暂时解决了问题,但这不是一个解决方案,

我使用的设备是永久连接的设备,有时会向PC(Windows 7 x64)发送信号。使用Arduino.cc中的Arduino 1.0软件编译的代码

关于arduino.cc的主题

它工作得很好,但有时,经过很长一段时间后,PC停止接收来自Arduino设备的数据。这不是PC软件问题,因为所有软件(putty、telnet等)的作用都是相同的-我可以向Arduino发送数据(设备响应命令);我就是收不回来

中描述了类似的问题,但未提出解决方案

断开/连接设备暂时解决了问题,但这不是一个解决方案,因为该设备应该永久和完全自动使用

使用线路板重置按钮将程序和所有值重置为其开始将没有帮助。PC未开始接收数据

注:

  • millis()翻滚错误无法在Arduino Uno板上使用Arduino 1.0软件复制-我想这已经修复,millis()现在只需50天就可以翻滚,就像文档中所说的那样。除此之外,代码还有一些不响应的地方

  • 向PC发送数据时闪烁的LED仍会闪烁

  • 字符串的使用可能会增加内存的使用,但是这个程序太小了,所以不会有问题。程序运行10个多小时后没有使用额外的内存,所以我不打算用其他东西替换字符串,因为串行端口问题要严重得多


  • 如果您认为问题在于arduino程序错误,请考虑如何解释TX闪烁和重置没有帮助。

    如果您不断轮询arduino,那么作为一种解决方法,您可以在arduino中实现一个看门狗,如果长时间没有向PC输出数据,它将重置arduino。您可以监视Arduino TX引脚,将其带到另一个输入引脚,使用中断。。。关键是在每次发送活动后重置看门狗。

    时钟可能会来回折叠

    previousclock=millis()在折叠之前可能会卡在较高的值上。您可以扩展测试以包括(currentmilis 顺便说一句,它使用了ignas的源代码(没有注册,OP源代码是不可读的,我不想注册)

    编辑:我从wakkerbot复制了下面的片段,并对其进行了一些编辑。只是为了 演示wrapparound如何将最后一个动作时间戳固定在int间隔的顶部(如果bump值不是int_max的除数) 您可能会稍微简化上面/下面的逻辑,因为您只对内部/外部间隔测试感兴趣。当然,Stamp的typedef应该适应millis()的类型(unsigned long?)和fakemillis(),并将其引用替换为millis()

    这里比较的是两个字符串。(这可能是由C++来处理的,但是在C中它是完全错误的。我也建议用一个巨大的开关语句替换重复的IF(…){…},至少避免重复调用SUBLE()函数。(或者它是内联的)? 更新20111211:这是一个不经意的换行比较和设置函数,它需要一个指向要比较和设置的值的指针,以及预期间隔的宽度:

    int test_and_set_if_beyond( unsigned long *pprev, unsigned long width )
    {
    unsigned long tick, low,high;
    low = *pprev;
    high = low+width;
    tick = millis();
    
    if (low < high) {
        if (tick >= low && tick < high ) return 0; /* normal case */
        }
    else { /* interval is wrapped , clock could have wrapped */
        if (tick >= low || tick < high) return 0;
        }
    *pprev = tick;
    return 1;
    }
    

    最后:重置不起作用的原因是,并不是所有的全局变量都在setup()函数中初始化。另外:我认为你应该去掉字符串(运行时是否有GC?),而是使用普通的字符缓冲区。

    也许让软件重置你的问题会得到解决。 我运行了以下代码,以确定软件重置是否会重置时钟,从而重置
    millis()
    功能:

    void setup()
    {
      Serial.begin(9600);
      Serial.println("Will start sending millis values in 5 seconds...");
      delay(5000);
    }
    
    void loop()
    {
      Serial.println(String(millis()));
    
      if (Serial.available() > 0)
      {
        if (Serial.read() == '@')
        {
          Serial.println("Rebooting. . .");
          delay(100); // Give the computer time to receive the "Rebooting. . ." message, or it won't show up
          void (*reboot)(void) = 0; // Creating a function pointer to address 0 then calling it reboots the board.
          reboot();
        }
      }
    }
    
    正如代码中所解释的,要重新启动软件,只需创建一个指向地址0的函数指针并调用它。 一、 事实上,他们取得了令人满意的结果:

    Will start sending clock values in 5 seconds...
    5000
    5000
    5000
    5001
    5001
    5001
    5002
    5002
    5002
    . . .
    6804
    Rebooting...
    Will start sending millis value in 5 seconds...
    5000
    5000
    5000
    5001
    5001
    5001
    5002
    5002
    5002
    5003
    5003
    . . .
    

    我希望这能解决您的问题:)

    几个小时后,Arduino无法执行Arayks和TX 900的有线命令,但重新启动后,Arduino已启用。

    如果使用终端程序(TeraTerm、putty),PC是否继续接收数据?当电脑停止接收时,您能看到Arduino仍在使用示波器进行传输吗?您仍然忘记了setup()函数中的一些变量,例如lightTimer。重置后,它仍将位于无法触及的位置。再次强调:这不是关于millis()的包装,而是关于变量的包装。试着想象一下如果lightTimer为0xffffffff会发生什么:它永远不能设置为新值,因为您只检查millis()>lightTimer。fixedMillis()函数无法解决此问题,因为它仍然被限制在无符号int可以表示的值的范围内。仍然无法解决,并且似乎无法解决。现在正在开发一个允许硬件自行重置Arduino USB的组件。你有什么发现吗?我也遇到了同样的问题。你在换负载吗?我曾经遇到过这样的情况,切换感应负载(如泵)会导致Arduino失去立足点,需要重新加载驱动器或连接电缆,即使Arduino代码会继续运行。重置电路板无法解决问题。只有重新连接USB的硬件才能恢复数据接收。1。根据文件记载,米利斯()将在50天内流出。我在代码2中使用了(unsignedlong)。板复位后无法恢复发送数据3。boards闪烁TX led=>这不是论坛链接的问题(回复2):“计数器是一个无符号的长计数器。在16Mhz下,这是550秒,大约9小时。”是的,我知道有错误代码:)我将尝试实现滚动检测和一个根本不使用计时器的输出函数。虽然它不能解释重置程序W
    if (test_and_set_if_beyond ( &lightTimer, lightnessCheckPeriod)) {
        int newLightness = analogRead(brightnessPin);
        if(newLightness-lightness > LIGHT_TRESHOLD) {
          say(RESPONSE_FLASH);
        }
        lightness = newLightness;
      }
      if (test_and_set_if_beyond ( &pingTimer, pingTimerPeriod)) {
        say(RESPONSE_PING);
      }
      if (test_and_set_if_beyond ( &pingLEDTimer, pingTimerPeriod*2)) {
        digitalWrite(failPin, HIGH);
      }
      feed();
    
    void setup()
    {
      Serial.begin(9600);
      Serial.println("Will start sending millis values in 5 seconds...");
      delay(5000);
    }
    
    void loop()
    {
      Serial.println(String(millis()));
    
      if (Serial.available() > 0)
      {
        if (Serial.read() == '@')
        {
          Serial.println("Rebooting. . .");
          delay(100); // Give the computer time to receive the "Rebooting. . ." message, or it won't show up
          void (*reboot)(void) = 0; // Creating a function pointer to address 0 then calling it reboots the board.
          reboot();
        }
      }
    }
    
    Will start sending clock values in 5 seconds...
    5000
    5000
    5000
    5001
    5001
    5001
    5002
    5002
    5002
    . . .
    6804
    Rebooting...
    Will start sending millis value in 5 seconds...
    5000
    5000
    5000
    5001
    5001
    5001
    5002
    5002
    5002
    5003
    5003
    . . .