[技术问答]

关于keil4中const char*指向的最大字符串长度问题

[复制链接]
1769|4
手机看帖
扫描二维码
随时随地手机跟帖
danyuyongren|  楼主 | 2017-6-28 12:02 | 显示全部楼层 |阅读模式
我用的是KEIL4,使用的芯片是新唐的M0内核,准备将一个字符串通过串口发出去,但是发现发出去的最大长度为17个字节,不知道为什么,代码如下:

const char* test="01234567890123456789";

void Uart1SendCommand(const char *Comprt)
{
    do{
            UART_WRITE(UART1,*Comprt);
            Comprt=Comprt+1;
    }
    while(*Comprt!='\0');
}
int main()
{
      Uart1SendCommand(test);
      while(1);
      return 0;
}

结果串口输出为01234567890123456,也就是说只有17个字符,为什么不是012345678901234567890这20个字符呢,于是我试着在devcpp环境下试着运行,发现可以正常打印那20个字符,devcpp的代码如下:

const char* li="012345678901234567890123456789";
void Pri(const char* ptr)
{
        do{
                printf("%c",*ptr);
                ptr=ptr+1;
        }
        while(*ptr!='\0');               
}

int main()
{
        Pri(li);
        return 0;       
}

麻烦知道的指点一下,谢谢!
john_lee| | 2017-6-28 13:03 | 显示全部楼层
UART有个发送FIFO,长度16字节,UART_WRITE向这个FIFO里填充数据,但并不检测FIFO是否“满”。
很显然,你的字符串的最后3个字节因为FIFO已满而被丢弃了。

使用特权

评论回复
danyuyongren|  楼主 | 2017-6-28 13:12 | 显示全部楼层
john_lee 发表于 2017-6-28 13:03
UART有个发送FIFO,长度16字节,UART_WRITE向这个FIFO里填充数据,但并不检测FIFO是否“满”。
很显然,你 ...

想问一下这个FIFO可以改吗?

使用特权

评论回复
john_lee| | 2017-6-28 16:28 | 显示全部楼层
你想改什么?改FIFO的长度吗?告诉你,不行。
要改的,是你的程序逻辑,而不是FIFO,你的程序必须在写FIFO之前,测试FIFO是否“满”,如果“满”,就原地等待并再次测试,或者用FIFO相关中断来写FIFO。

使用特权

评论回复
yiyigirl2014| | 2017-6-28 20:54 | 显示全部楼层
楼上说的很对啊,FIFO的空间是16,你试试用系统自带的printf试试。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

8

帖子

1

粉丝