【问题标题】:Arduino memcpy distorts serial outputArduino memcpy 扭曲串行输出
【发布时间】:2019-07-07 23:55:16
【问题描述】:

我正在为 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 命令后,它会按我的预期输出。 合乎逻辑的结论是我的memcpy 正在破坏i。 但为什么呢? i 应该永远不会超过 7,cchar 是 64 字节长,我只复制 8 字节,对吧?那么我将如何在cchar 之外进行复制?

【问题讨论】:

  • 如果没有Serial,你会迷路ff吗?
  • @Buddy 我不明白。没有Serial 我怎么有任何输出?此外,有时输出不正确,而不是 ff,有时是 w,有时只是显示为正方形的奇怪字符。另请注意println 在出现问题时无法添加换行符。很奇怪,对吧?
  • @Buddy 现在再看一遍,好像那些特殊字符在粘贴到这里的时候都没有出现,至少在chrome中...
  • 要详细了解问题,如果根本没有输出,那么可能是Serialmemcpy 一起出现的问题。如果有流浪的ff,那么它可能只有memcpy
  • 你在串行监视器中设置了 9600 波特

标签: arduino memcpy


【解决方案1】:

问题是指针运算。 sizeof(*cchar) 是 8 所以cchar + 1 的地址在 cchar 地址之后 8 个字节

这行得通

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() {
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多