在我的代码中,我得到了一个非常琐碎但似乎很难修复的bug。长话短说,我有一个数组,当我从芯片中读取数据值时,数组中会充满信息。然后,这个名为data_buffer的数组以一种十六进制文件格式将每个字符发送到UART中,以便进行调试。
当我键入命令并将字符输出到终端时,数组将对我指定有数据的空格释放空字符。
代码如下所示,我将尽力按顺序排列它:
void read_256_address(void)
{
char SFRPAGE_SAVE=SFRPAGE;
SFRPAGE=CONFIG_PAGE;
RFLAG=0;
address_sum=((unsigned long)address_byte3<<16)
+((unsigned long)address_byte2<<8)
+((unsigned long)address_byte1);
if(chip_byte>=0 && chip_byte<=76)
{
Port4=chip_byte;
read_address_loop();
}
while(RFLAG==0){if(RFLAG==1){break;}}
SFRPAGE=SFRPAGE_SAVE;
}
void read_address_loop(void)
{
unsigned long int i=14;
char SFRPAGE_SAVE=SFRPAGE;
SFRPAGE=CONFIG_PAGE;
RFLAG=0;
if(command_byte==0x82)
{
write_P4();
for(next_address=address_sum;next_address<(address_sum+256);next_address++)
{
output_address();
read_op();
hex_data=data_read;
HEXtoASC();
data_buffer[i]=msb;i++;
data_buffer[i]=lsb;i++;
data_buffer[i]=' ';i++;
if(next_address+=15){format_data_dump();}
}
}
void output_data(void)
{
unsigned char i;
for(i=0;i<65;i++)
{
send_byte(data_buffer[i]);
}
}我对for loop上的缩进表示歉意,但这是由于格式化。它应该与上面的write_P4();代码对齐。当上面的代码运行时,它输出所需的格式,但不输出值,例如:
M82 1B 104560 FF ****null char for remaining indices**** 0x0D 0x0A
M82 1B 104560 FF FF ****null char for remaining indices**** 0x0D 0x0A
M82 1B 104560 FF FF FF ****null char for remaining indices**** 0x0D 0x0A我希望看到的是:
M82 1B 1040560 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0x0D 0x0A
M82 1B 1040570 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0x0D 0x0A
.
.
.
M82 1B 1040650 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0x0D 0x0A有人能给我一些关于为什么会发生这种事的见解吗?在整个缓冲区的每一次迭代之后,缓冲区的长度似乎都在增加,而不是每次相同的长度。
发布于 2017-04-26 19:03:35
我可能找不到你的问题,但让我就我在你的代码中看到的东西发表一些评论,供你思考。注释将出现在上述代码中:
void read_256_address(void)
{
char SFRPAGE_SAVE=SFRPAGE;
SFRPAGE=CONFIG_PAGE;
RFLAG=0;假设地址和至少有32位大小?
address_sum=((unsigned long)address_byte3<<16)
+((unsigned long)address_byte2<<8)
+((unsigned long)address_byte1);如果chip_bytes未签名,则不需要0检查。
if(chip_byte>=0 && chip_byte<=76)
{
Port4=chip_byte;
read_address_loop();
}我祈祷RFLAG在这里是volatile,否则就会混乱。在螺纹系统上,屈服或类似的东西在这里是好的,而不是旋转。
while(RFLAG==0){if(RFLAG==1){break;}}
SFRPAGE=SFRPAGE_SAVE;
}
void read_address_loop(void)
{非常神奇的14和我作为一个非索引也不是一个好主意(哦,我看到了-后来用于索引。)
unsigned long int i=14;
char SFRPAGE_SAVE=SFRPAGE;
SFRPAGE=CONFIG_PAGE;
RFLAG=0;
if(command_byte==0x82)
{
write_P4();如果address_sum接近其类型的大小,这可能会永远循环。
for(next_address=address_sum;
next_address<(address_sum+256);
next_address++)
{
output_address();
read_op();
hex_data=data_read;
HEXtoASC();考虑将++放在索引中的i上
data_buffer[i]=msb;i++;
data_buffer[i]=lsb;i++;第三个字节的空格?这是很有趣的--猜测这是您要获取NUL值的部分。可能会再次检查转换器,看看它是否通过将空格转换为0来帮助您。
data_buffer[i]=' ';i++;考虑使用next_address & 0x0f,如果您正在检查0在低咬口,加上15是非常奇怪的。你的意思也许是加16?
if(next_address+=15){format_data_dump();}
}
}
void output_data(void)
{
unsigned char i;神奇的65大小--考虑size or ()数组或通过另一种方法检查结束。
for(i=0;i<65;i++)
{
send_byte(data_buffer[i]);
}
}在我上面提到的所有内容中,如果与+=15检查,似乎是最麻烦的领域。再说一遍,我不知道我有什么发现你的问题,但值得更深入地研究,以确定。
https://stackoverflow.com/questions/43641294
复制相似问题