Arduino 串行打印意外地改变了程序的行为

电器工程 Arduino 微控制器 C
2022-01-22 05:30:00

我正在使用一个循环计数器,在标题中声明:

int loop_counter = 0;

我经常使用这个计数器触发一个事件。我曾经对这种相同类型的行为使用模数,但我对其进行了简化,因此更容易使用(它仍然会导致相同的行为)

void loop() {
    if(loop_counter > 100) loop_counter = 0;
    else loop_counter++;

    //Serial.println("hey");

    if(loop_counter == 0) {
         //do_something_important();
    }      
}

一切都很好,直到我尝试Serial通过取消注释来与//Serial.println("hey");"hey"在这个例子中,因为对我来说,这种行为是荒谬的)。

这导致loop_counter永远不会触发do_something_important();代码部分。我尝试声明loop_countervolatile,这并没有改变任何东西。我尝试了Serial.printing loop_counter,但我的行为也很奇怪(它会冻结循环)。 Serial.println("hey");从某种意义上说,在串行监视器中我得到了很多“嘿”,(即很快超过 100 个“嘿”,其他代码部分应该触发的迭代次数)

什么可能导致使用Serial, 数据没有(据我所知)绑定以loop_counter完全阻止它正常工作?

编辑:这是最终导致问题的主文件部分(嗯,对它的贡献最大(使用太多内存)):



void display_state() {
  int i,j,index=0;
  short alive[256][2];

 for(i=0;i<num_rows;i++) { 
   for(j=0;j<num_cols;j++) {
     if(led_matrix[i][j]==1) { 
       alive[index][0]=i;
       alive[index][1]=j;
       index++;
     }
   }
 }
 alive[index][0]=NULL; //Null-terminate.
 alive[index][1]=NULL;

 //383 is a great number
 for(int idx=0;idx < index; idx++) {
   display(alive[idx][0],alive[idx][1]);
   delayMicroseconds(283);
 }
}

这是“letters.h”:


    #ifndef _MY_LETTERS_H
    #define _MY_LETTERS_H

#define nrows 4
#define ncols 4

#define num_rows 16
#define num_cols 16

#define MAX_WORD_LENGTH 16
#define NUMBER_OF_CHARACTERS 26

#include <stdlib.h>

int loop_counter = 0; 短 led_matrix[num_rows][num_cols];

const short letter_a[nrows][ncols] = {{0,1,1,0}, {1,0,0,1}, {1,1,1,1}, {1,0,0,1}}; const short letter_b[nrows][ncols] = {{1,0,0,0},{1,1,1,0},{1,0,1,0},{1,1,1,0} }; const short letter_c[nrows][ncols] = {{0,1,1,1},{1,0,0,0},{1,0,0,0},{0,1,1,1} }; const short letter_t[nrows][ncols] = {{1,1,1,1},{0,1,0,0},{0,1,0,0},{0,1,0,0} };

typedef struct letter_node{ 常量短*数据; 字母节点*下一个; 诠释 x; 整数y; } 字母节点;

letter_node aa = {&letter_a[0][0],NULL,1,1}; letter_node bb = {&letter_b[0][0],NULL,1,1}; letter_node cc = {&letter_c[0][0],NULL,1,1}; letter_node tt = {&letter_t[0][0],NULL,1,1};

letter_node letter_map[NUMBER_OF_CHARACTERS]; #万一

更多信息:-我正在使用 Uno (ATMega328)

4个回答

您的代码是否初始化了串口?例如。

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

不这样做可能会导致第一次使用该系列时崩溃。

也许你的内存不足?您使用 Serial.print("something") 打印的所有字符串都发生在 SRAM 中,等于该字符串的字符数 + 1 用于 \0 终止符。即使您的草图的编译大小比 Arduino 闪存小得多,也有可能内存不足,因为 Atmega328 的 SRAM 只有 2048 字节,Atmega 168 的 SRAM 只有 1024 字节。我遇到了类似的问题,我通过缩短所有文本并删除不必要的调试消息。

我也遇到了类似的问题,并且非常确定您的问题也与堆栈空间不足有关。尽量缩小代码。

在我的情况下,代码有时会在我有串行消息时运行,但是当我没有时它似乎不会运行。我还有一个案例,发送串行消息会导致 arduino 无休止地重置。

我也在使用arduino328。如果您有任何可以接受的最小大小,您可能应该减小数组的大小。

您还没有显示初始化变量“loop_counter”的代码。那是在循环()例程之外吗?

您是否可能以一种与另一个内存存储区域相邻的方式声明它,该内存存储区域在其声明的大小之外运行并且这对 loop_counter 变量的影响?