背景:学习中科浩电的无人机,芯片上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 pitch:%d roll:%d ",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
",buff[0]);
usart_printf("pitch:%f
",buff[1]);
usart_printf("roll:%f
",buff[2]);
效果很好!没有乱码的情况,且不需要其他操作。