首页 > 解决方案 > Arduino memcpy 扭曲串行输出

问题描述

我正在为涉及复制部分数组的 Arduino Uno 编写一些代码。的使用memcpy会导致一个完全不相关的变量偶尔在串行输出中出现损坏。这是显示问题所需的代码。

byte cchar[8][8];
byte fbold[16][16];
void setup() {
  Serial.begin(9600);
}

void loop() {
  for (byte i = 0; i < 8; i++) {
    memcpy(cchar + i*8, fbold + 16 * i , 8);
    Serial.println(i);
    Serial.println(i);
  }
  delay(500);
}

我相信这应该重复输出以下内容:

1
1
2
2
3
3
4
4
5
5
6
6
7
7

但奇怪的是,它更像这样:(直接取自串行监视器)

0
0
1
1
2
2ff
4
5
4
4
5
5
6
6
7
7
0
0
1
1
2
2
3
3
4
4
5
5ff
7
07
7

删除命令后,它会按我的memcpy预期输出。合乎逻辑的结论是 mymemcpy正在破坏i。但为什么呢?i据说永远不会超过 7 个,cchar长度为 64 个字节,而我只复制 8 个字节,对吧?那么我将如何在外部复制cchar

标签: arduinomemcpy

解决方案


the problems is pointer arithmetic. sizeof(*cchar) is 8 so address of cchar + 1 is 8 bytes after address of cchar

this works

byte cchar[8][8];
byte fbold[16][16];

void setup() {
  Serial.begin(115200);
  for (int i = 0; i < 16; i++) {
    for (int j = 0; j < 16; j++) {
      fbold[i][j] = j;
    }
  }
  for (int i = 0; i < 8; i++) {
    memcpy(cchar + i, fbold + i, 8);
    for (int j = 0; j < 8; j++) {
      Serial.print(cchar[i][j]);
      Serial.print(',');
    }
    Serial.println();
  }
}

void loop() {
}

推荐阅读