Arduino memcpy使串行输出失真
我正在为Arduino Uno编写一些代码,其中涉及到复制数组的一部分。使用Arduino memcpy使串行输出失真,arduino,memcpy,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
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);
}
但奇怪的是,它更像这样:(直接取自串行监视器)
删除memcpy
命令后,它会像我预期的那样输出。
合乎逻辑的结论是我的memcpy
正在腐蚀i
。
但为什么呢
i
应该不会超过7,cchar
有64个字节长,我只复制了8个字节,对吗?那么,我将如何在cchar
之外进行复制呢?问题在于指针算法sizeof(*cchar)
是8,所以cchar+1的地址是cchar地址后的8个字节
这很有效
字节cchar[8][8];
字节fbold[16][16];
无效设置(){
序列号开始(115200);
对于(int i=0;i<16;i++){
对于(int j=0;j<16;j++){
fbold[i][j]=j;
}
}
对于(int i=0;i<8;i++){
memcpy(cchar+i,fbold+i,8);
对于(int j=0;j<8;j++){
连续打印(cchar[i][j]);
连续打印(',');
}
Serial.println();
}
}
void循环(){
}
问题在于指针算法sizeof(*cchar)
是8,所以cchar+1的地址是cchar地址后的8个字节
这很有效
字节cchar[8][8];
字节fbold[16][16];
无效设置(){
序列号开始(115200);
对于(int i=0;i<16;i++){
对于(int j=0;j<16;j++){
fbold[i][j]=j;
}
}
对于(int i=0;i<8;i++){
memcpy(cchar+i,fbold+i,8);
对于(int j=0;j<8;j++){
连续打印(cchar[i][j]);
连续打印(',');
}
Serial.println();
}
}
void循环(){
}
没有序列号
你是不是迷路了ff
?@伙计,我不明白。没有Serial
我怎么能有任何输出?此外,有时除了ff
之外,还有不正确的输出,有时是w
,有时是只显示为正方形的奇怪字符。还请注意,println
出错时无法添加换行符。奇怪,是吗?@Buddy现在我再看一遍,这些特殊字符似乎在粘贴到这里时都没有出现,至少在chrome中是这样……为了进一步了解这个问题,如果根本没有输出,那么可能是Serial
和memcpy
一起出现的问题。如果有杂散的ff
,那么它可能是memcpy
单独的。您是否在串行监视器中设置了9600波特而没有Serial
您是否有杂散的ff
?@伙计,我不明白。没有Serial
我怎么能有任何输出?此外,有时除了ff
之外,还有不正确的输出,有时是w
,有时是只显示为正方形的奇怪字符。还请注意,println
出错时无法添加换行符。奇怪,是吗?@Buddy现在我再看一遍,这些特殊字符似乎在粘贴到这里时都没有出现,至少在chrome中是这样……为了进一步了解这个问题,如果根本没有输出,那么可能是Serial
和memcpy
一起出现的问题。如果有杂散的ff
,则可能是memcpy
单独存在。串行监视器中是否设置了9600波特
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