【发布时间】:2016-04-13 10:06:23
【问题描述】:
我正在做一个非常重要的学校项目,它是一个带有网络界面的 MP3 播放器和一个使用 arduino mega 的网络服务器。 当我想使用以太网库的任何功能时,我必须暂停音乐,因为以太网屏蔽和 mp3 播放器屏蔽使用相同的 spi 总线。但是当我改变音量时,这会导致音乐冻结 1 秒。为了避免我创建了暂停音乐的新函数,请调用以太网库和恢复的函数。
bool clientAvailable(EthernetClient &client){
MP3player.pauseDataStream ();
bool a = client.connected();
MP3player.resumeDataStream ();
return a;
}
int clientConnected(EthernetClient &client){
MP3player.pauseDataStream ();
int a = client.available();
MP3player.resumeDataStream ();
return a;
}
void stopClient(EthernetClient &client){
MP3player.pauseDataStream ();
client.stop();
MP3player.resumeDataStream ();
}
void checkForClient(int loading){
String firstLine;
MP3player.pauseDataStream ();
EthernetClient client = server.available();
MP3player.resumeDataStream();
if (client) {
if(!loading){
Serial.println(F("new client")); // CRASH HERE
bool endLn(false);
char chr;
int i(0);
while (clientConnected(client)) {
char received[clientAvailable(client)+2];
while (clientAvailable(client)) {
MP3player.pauseDataStream ();
char c = client.read();
MP3player.resumeDataStream ();
received[i] = c;
Serial.print(c); // OR HERE
if(!endLn){
firstLine += c;
if (c == '\n'){
endLn = true;
}
}
++i;
}
received[i+1] = '\0';
i = 0;
if(endLn){
Serial.println();
endLn = false;
Serial.print(F("first line : "));
Serial.println(firstLine);
}
我在输出中得到什么:
new û192.168.0.123
最后有一个 IP,因为这是 arduino 重新启动的地方,这是我显示的第一件事。 如果我删除 "client.println(F("new client")) 行,client.print(c) 行会出现错误(显示 3 或 4 个字符后)。如果我也删除这个,它会在某处坠毁,但我不知道在哪里。
我检查了内存,程序此时还剩下大约 600 个字节。
有什么想法吗?
谢谢。
【问题讨论】:
-
您的看门狗是如何配置的?它被禁用了吗?如果没有,服务看门狗的代码在哪里?
-
我不知道代码,但是仅仅阅读问题文本就让我感到深深的不安和不祥之感......问如何使用创可贴:(我希望我错了,但我认为你的设计正在流血。
-
@Lundin 不是,所以我尝试禁用它,但如果我启用它并配置它,没有任何改变?
-
@MartinJames 那只是因为我试图用 6 来解释大约 430 行的代码,而且我的英语不是很熟练......如果你想要更多细节,有这个 1s延迟,因为我必须从客户端获取数据并从中提取信息。之前,我有类似的东西:暂停 - 以太网功能 - 导致 1 秒延迟的东西 - 以太网功能 - 恢复。现在我想要暂停 - 以太网功能 - 恢复 - 导致 1 秒延迟的东西 - 暂停 - 以太网功能 - 恢复 - 所以我每次更改音量时都不会冻结。
-
运行经过充分测试的库函数时代码崩溃,这反过来又表现为缓慢的数据传输,听起来很像看门狗。
标签: c++ c crash arduino reboot