C - 8051 数组输出

标签 c arrays function loops 8051

我的代码中有一个非常微不足道但看似很难修复的错误。长话短说,我有一个数组,当我从芯片读取数据值时,它会充满信息。这个名为 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 循环 中的缩进,我深表歉意,但那是由于格式化造成的。它应该与上面的 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++;

第三个字节的空间?这很有趣 - 猜测这是您获得 NUL 值的部分。也许仔细检查您的转换器,看看它是否通过将空格转换为 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 检查似乎是最麻烦的部分。同样,我不知道我所掌握的内容是否能解决您的问题,但值得更深入地研究它们以确保确定。

关于C - 8051 数组输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43641294/

相关文章:

C程序反向链表

c - Linux 上精确的进程间计时器

c - 在 C 中使用 libopus 编码 pcm 并解码 opus 数据

arrays - 在 MATLAB 中将数组转换为字符串?

c++ - 程序在 cout 上崩溃并出现新行 "\n"

javascript - "(function ( ) { } ) ( )"和 "(function ( ) { } ( ) )"在 JavaScript 中功能相同吗?

c++ - 为什么有两种通过指针调用函数的方式?

python - Ctypes 找不到我加载的 dll 的 dll 依赖项

c++ - 发送一个字符串变量作为参数来打开一个文件

ruby - 就地修改数组 - Ruby