This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430G2553: 在CCS上重定义printf函数,串口端显示有误

Part Number: MSP430G2553
Other Parts Discussed in Thread: MSP-EXP430G2ET

各位好,

我首先在包含了stdio.h和string.h头文件的main函数中对fputc和fputs进行重定义,代码如下:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int fputc(int ch,FILE *f)
{
while(UCA0STAT & UCBUSY);
// UCA0TXBUF = ch;
UCA0TXBUF = ch&0xff;
while(!(IFG2 & UCA0TXIFG));//
return ch;
}
int fputs(const char *_ptr, register FILE *_fp)
{
unsigned int i, len;
len = strlen(_ptr);
for(i=0 ; i<len ; i++){
while(UCA0STAT & UCBUSY);
// UCA0TXBUF = _ptr[i];
UCA0TXBUF = _ptr[i]&0xff;
while(!(IFG2 & UCA0TXIFG));//
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

printf能够输出hello world这样的字符串,但是用到如"%d"等格式符号时就出现了问题。

具体代码如下:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main(void)
{
int i=0;
uint8_t buff1[4] = {0x00,0x01,0x02,0x03};
uint32_t buff2;
float buff3;
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
InitSystemClock();
InitUART();
buff2 = (((uint32_t)buff1[0])<<24)|
(((uint32_t)buff1[1])<<16)|
(((uint32_t)buff1[2])<<8)|
buff1[3]; //48uint32_t
buff3 = (float)buff2;
// UARTSendString(buff1,4);
// for(i=0;i<4;i++)
// {
// UARTSendString(buff1[i],)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

一开始我对现project的properties中的“level of printf support required”中的设置为'minimal',这个时候通过串口只能够打印出int格式的数,也只会打印一次;

当我把设置改为'full'来满足我需要打印16进制数的要求时,串口不仅一直在打印%前的语句,而且需要打印的16进制数也打印不出来;对于在‘minimal’时能够按要求打印的int格式的数也是一直打印,串口助手打印出来的是这样的:

它好像一直卡在buff1[1]的printf中没有跳到下一步。但如果设置是‘minimal’的时候,串口助手显示的是:

请帮我看看应该怎么修改我的代码或者配置,谢谢各位!

  • 你好,我查看下代码,稍后回复您。

  • 可以分别单独打印buff1,buff2,buff3看看吗?

  • 你好,代码和串口助手输出结果如下:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    int main(void)
    {
    int i=0;
    uint8_t buff1[4] = {0x00,0x01,0x02,0x03};
    uint32_t buff2;
    float buff3;
    WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
    InitSystemClock();
    InitUART();
    buff2 = (((uint32_t)buff1[0])<<24)|
    (((uint32_t)buff1[1])<<16)|
    (((uint32_t)buff1[2])<<8)|
    buff1[3]; //48uint32_t
    UARTSend4B(buff2);
    buff3 = (float)buff2;
    for(i=0;i<4;i++)
    {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    在properties里面设置printf是'minimal',因为设置成full的时候会一直不断输出‘buff[1]=0‘。’

  • 我首先在包含了stdio.h和string.h头文件的main函数中对fputc和fputs进行重定义,

    这个跟你的代码有什么关系?

    对于在‘minimal’时能够按要求打印的int格式的数也是一直打印,串口助手打印出来的是这样的:

    这也太奇怪了。不用for循环可以正常打印吗?

  • 1.我看网上别的帖子说需要在include了<stdio.h>和<string.h>头文件的函数中对fpuc和fputs进行重定义才能在串口使用printf函数;

    2.设置是'full'的情况下,我刚刚试了不用for循环,只打印buff1[1],也是一直打印。

  • Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include <msp430.h>
    #include "stdint.h"
    #include <stdio.h>
    #include <string.h>
    #define BufferSize 3
    uint8_t tx_buffer[BufferSize] = {0,1,2};
    /*
    * @fn: void InitSystemClock(void)
    * @brief:
    * @para: none
    * @return: none
    * @comment:
    */
    void InitSystemClock(void)
    {
    /*DCO1MHz*/
    DCOCTL = CALDCO_1MHZ;
    BCSCTL1 = CALBC1_1MHZ;
    /*SMCLKDCO*/
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    这是我整个工程的代码,我用的开发板是msp-exp430g2et。

    您给的第一个链接参考的是一个百度文档,它针对的是液晶屏的printf和scanf的使用;

    第二个链接参考的github网站代码我好像也参考过,但是编译无法通过;另一个html显示好像不太全,没有看到贴上来的代码。

  • 好的,我在我的板子上跑下看看。

  • 你好,在下面这个函数中:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    void UARTSend4B(uint32_t buff)
    {
    uint8_t SendBuffer[4];
    int i;
    SendBuffer[0] = (buff>>24)&0xff;
    SendBuffer[1] = (buff>>16)&0xff;
    SendBuffer[2] = (buff>> 8)&0xff;
    SendBuffer[3] = (buff )&0xff;
    /*3248*/
    for(i=0;i<4;i++)
    {
    UARTSendByte(SendBuffer[i]);
    }
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    buff 的类型还是32位并没有改变,而SendBuffer是8位。这是一个问题。

    将buff2的这段代码中buff1[3]也加上强制转换:

    buff2 = (((uint32_t)buff1[0])<<24)|
    (((uint32_t)buff1[1])<<16)|
    (((uint32_t)buff1[2])<<8)|
    ((uint32_t)buff1[3]);

    以及buff1是8位,所以应该用%o.

      printf("buff1[1] = %o\n", buff1[1]);

  • 您好,非常谢谢您的答复!

    1. UARTSend4B这个函数不经过更改是可以正常直接向pc端发送32位数据的,将串口助手的接收设置改成“HEX”即可;

    2. 您提到buff1是8位数据,但是“%o”这个输出格式指的是八进制,虽然对于buff1中的0,1,2,3输出没有影响,但是八进制输出并不是我想要的输出格式;

    3. 在buff2这段代码加上了您的提议后,在“%x”的输出格式下仍是buff2=203,而理论上应该是buff2=10203。

  • 在buff2这段代码加上了您的提议后,在“%x”的输出格式下仍是buff2=203,而理论上应该是buff2=10203

    这是由于%x对于数据位数有限制,从结果来看,其最高位数应该是16位,但buff2有32位。所以应该用%lx。