C - 8051 数组输出

C - 8051 Array output

我的代码中有一个非常微不足道但看似很难修复的错误。长话短说,我有一个数组,当我从芯片读取数据值时,它会充满信息。这个名为 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

有人可以告诉我为什么会发生这种情况吗?似乎每次迭代整个缓冲区后缓冲区的长度都在增加,每次的长度都不一样。

我可能找不到你的问题,但让我对我在你的代码中看到的内容发表一些评论,供你思考。评论将出现在有问题的代码上方:

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

祈祷这里RFLAGvolatile 否则会乱。在线程系统上,yield 或类似的东西在这里而不是自旋会很好。

    while(RFLAG==0){if(RFLAG==1){break;}}

    SFRPAGE=SFRPAGE_SAVE;
}

void read_address_loop(void)
{

非常神奇 14 和 i 作为非索引也不是一个好主意(哦,我明白了 - 稍后用于索引。)

    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++;

A space 表示第 3 个字节?这很有趣 - 猜测这是您获得 NUL 值的部分。也许仔细检查你的转换器,看看它是否通过将 spaces 转换为 0.

来帮助你
            data_buffer[i]=' ';i++;

如果要检查低半字节中的 0,请考虑使用 next_address & 0x0f,加 15 非常奇怪。你是说加 16 吗?

            if(next_address+=15){format_data_dump();}
        }
   }

void output_data(void)
{
    unsigned char i;

再次神奇的 65 大小 - 考虑 sizeof() 数组或通过其他方法检查结束。

    for(i=0;i<65;i++)
    {
        send_byte(data_buffer[i]);
    }
}

在我上面提到的所有内容中,+=15 的 if 检查似乎是最麻烦的部分。同样,我不知道我所掌握的内容是否能解决您的问题,但值得更深入地研究它们以确保确定。