在MSP430上面实现printf串口打印

背景:学习中科浩电的无人机,芯片上MSP430,想要实现printf函数,但对MSP430不是很熟悉。

一、使用sprintf函数

sprintf

中科浩电无人机的代码

/******************************************************************************
  * 函数名称:U2_UCA1_Send
  * 函数描述:以中断的方式发送数据
  * 输    入:
  * uint8_t *ptx:要发送的数据地址
  * uint8_t len:要发送的数据长度
  * 输    出:void
  * 返    回:void
  * 备    注:null
  *
  *
******************************************************************************/
void U2_UCA1_Send(uint8_t* pTx, uint8_t len)
{
    uint8_t i;
    
    // 等待串口空闲
    while(!Usart2.tx_idle)
        ;
    
    // 占用串口
    Usart2.tx_idle = 0;
    
    // 缓存要发送的数据
    for(i=0; i<len; i++)
    {
        Usart2.tx_buf[i] = pTx[i];
    }
    
    // 启动发送
    Usart2.tx_totle = len;
    Usart2.tx_cnt = 0;
    
    if(Usart2.tx_cnt < Usart2.tx_totle)
    {
        UCA1TXBUF = Usart2.tx_buf[Usart2.tx_cnt++];
    }
}

 sprintf配合该传送函数实现串口打印

应用时会出现bug

 sprintf(Buff, "yaw:%d\r\npitch:%d\r\nroll:%d\r\n",g_Attitude.yaw,g_Attitude.pitch,g_Attitude.roll);

U2_UCA1_Send(Buff,sizeof(Buff));

BUG:打印float型时,会出现问题——格式化类型的变量均与第一个变量的数值相同,不清楚是什么原因。

 

二、利用stdarg.h下的va_start 函数和vsprintf 函数再配合串口(的DMA )发送功能来实现C 语言中的printf

 

 

 

 


#include <stdio.h>
#include <stdarg.h>
#include "string.h"


void usart_printf(const char *fmt,...);


//
串口打印函数 void usart_printf(const char *fmt,...) { static uint8_t tx_buf[256] = {0}; static va_list ap; static uint16_t len; va_start(ap, fmt); //return length of string //返回字符串长度 len = vsprintf((char *)tx_buf, fmt, ap); va_end(ap); U2_UCA1_Send(tx_buf, len); }
//应用

  float buff[3];
  buff[0] = g_Attitude.yaw;
  buff[1] = g_Attitude.pitch;
  buff[2] = g_Attitude.roll;

  usart_printf("yaw:%f\r\n",buff[0]);
  usart_printf("pitch:%f\r\n",buff[1]);
  usart_printf("roll:%f\r\n\r\n",buff[2]);

效果很好!没有乱码的情况,且不需要其他操作。

 

posted @ 2021-02-28 21:42  Ted_Zhao  阅读(1448)  评论(0)    收藏  举报