Serial port Arduino在长时间后停止向串行端口发送数据
我使用的设备是永久连接的设备,有时会向PC(Windows 7 x64)发送信号。使用Arduino.cc中的Arduino 1.0软件编译的代码 关于arduino.cc的主题 它工作得很好,但有时,经过很长一段时间后,PC停止接收来自Arduino设备的数据。这不是PC软件问题,因为所有软件(putty、telnet等)的作用都是相同的-我可以向Arduino发送数据(设备响应命令);我就是收不回来 中描述了类似的问题,但未提出解决方案 断开/连接设备暂时解决了问题,但这不是一个解决方案,因为该设备应该永久和完全自动使用 使用线路板重置按钮将程序和所有值重置为其开始将没有帮助。PC未开始接收数据 注: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发送数据(设备响应命令);我就是收不回来 中描述了类似的问题,但未提出解决方案 断开/连接设备暂时解决了问题,但这不是一个解决方案,
如果您认为问题在于arduino程序错误,请考虑如何解释TX闪烁和重置没有帮助。如果您不断轮询arduino,那么作为一种解决方法,您可以在arduino中实现一个看门狗,如果长时间没有向PC输出数据,它将重置arduino。您可以监视Arduino TX引脚,将其带到另一个输入引脚,使用中断。。。关键是在每次发送活动后重置看门狗。时钟可能会来回折叠 previousclock=millis()在折叠之前可能会卡在较高的值上。您可以扩展测试以包括(currentmilis
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
. . .