一、UART0串口发送接收数据
MSP430的通用串行结构USCI支持多种串行通信模式。在MSP430F249这个型号含有4个USCI模块,下表是支持UART模式的USCI_Ax的相应寄存器:
1、串口0初始化例程
模式为UART、配置p3.4和p3.5为通信接口、偶校验、波特率:2400
void InitUART0(void)
{
P3OUT |= BIT4+BIT5;
P3SEL |= BIT4+BIT5; //设置p3.4与p3.5为串口通信
UCA0CTL1 |= UCSSEL0 + UCSWRST;//设置串口0时钟为ACLK,置位UCSWRST,初始化所有的USCI寄存器
UCA0CTL0 |= UCPEN + UCPAR; // UCPE偶校验使能,设置偶校验 0:LSB / 1:MSB */
UCA0BR0 = 0x0D; // 32kHz/2400= 13.65
UCA0BR1 = 0x00; //
UCA0MCTL = 0X0A;
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt
}
2、串口0发送数据
//串口0发送数据
void Uart0_Send_Byte(unsigned char data)
{
while(!(IFG2&UCA0TXIFG));//发送寄存器空的时候发送数据
UCA0TXBUF = data;
}
3、串口0接收数据中断(将收到的数据原样发送出去)
//串口0接收中断
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
unsigned char data=0;
data = UCA0RXBUF;//接收到的数据存起来
Uart0_Send_Byte(data);//将接收到的数据再发送出去
}
4、将收到的数据保存到数组中
unsigned char UART0RXBuf[68];
unsigned int UART0RXPos = 0;
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
if (!UART0RXLen)
{
// Buffer中数据尚未处理完毕,暂时不能接收数据
UART0RXDly = 1;
UART0RXBuf[UART0RXPos] = UCA0RXBUF;
UART0RXPos ++;
_delay(1,10);
if (UART0RXPos >= (sizeof(UART0RXBuf)-1))
UART0RXPos = 0;
}
else UART0Temp = UCA0RXBUF;
}
关于MSP430串口波特率,可参考一下博文链接
MSP430设置串口波特率的方法
二、添加标准的printf函数
前提条件:
串口初始化(在以上有源代码)注意波特率和校验位等的配置根据自己需要配置,单片机与PC机已经通过串口线连接
代码如下:
// ********************************************************************
// * 函数名 : UartPutchar
// * 函数功能 : 向串口终端发送一个字符
// * 形参 : Txdata为待发送的字符
// * 返回值 : 无
//*******************************************************************
void UartPutchar(char Txdata)
{
if(Txdata=='\n'){
while(!(IFG2&UCA0TXIFG));
UCA0TXBUF='\r';
}
while(!(IFG2&UCA0TXIFG));
UCA0TXBUF=Txdata;
}
// ********************************************************************
// * 函数名 : UartSendString
// * 函数功能 : 向串口终端发送一个字符串
// * 形参 : pt为字符串指针。
// * 返回值 : 无
// *******************************************************************/
void UartSendString(char *pt)
{
while(*pt)
UartPutchar(*pt++);
}
/********************************************************************
* 函数名 : IntToString
* 函数功能 : 将一个整形的书转化成为一个表现形式一样的字符串
* 说明 : 举例说明功能,若有一个整数为65535,该函数作用就是将 *
“65535”其转化为字符串
* 形参 : temp为待装换的整数,pchar为转化成的字符串所存储的地址
* 返回值 : 无
********************************************************************/
void IntToString(int t,char *pchar)
{
char ch,*p=pchar;
while(t!=0){
*pchar++=(char)(t+0x30);
t/=10;
}
*pchar--='\0';
while(pchar>p){
ch=*p;
*p++=*pchar;
*pchar--=ch;
}
}
/* ********************************************************************
* 函数名 : Vs_Printf
* 函数功能 : 将参数指针arg所指的不定参数按照格式字符串format中的一一对应的格
* 式转化后生成一个新的字符串存于地址s中。
* 形参 : s为最终形成的字符串存储地址,format为格式字符串,arg为不定参数指
* 针。
* 返回值 : 无
********************************************************************/
void Vs_Printf(char *s,char *format,va_list arg)
{
char *pchar;
char *temp;
for(pchar=format;*pchar;pchar++){
if(*pchar !='%'){
*s++=*pchar;
continue;
}
switch(*++pchar){
case 'd' :
{
IntToString(va_arg(arg,int),s);
while(*s++);
*--s='0';
break;
}
case 's' :
{
temp=va_arg(arg,char *);
while(*s++=*temp++);
*--s='0';
break;
}
case 'c' :{
*s++=va_arg(arg,char);
break;
}
default:
break;
}
}
*s='\0';
}
/********************************************************************
* 函数名 : Printf
* 函数功能 : 格式化输出
* 形参 : fmt为格式字符串,…为不定(类型不定、个数不定)形参
* 返回值 : 无
*******************************************************************/
void Printf(char *fmt,...)
{
va_list ap;
char string[256];
va_start(ap,fmt);
Vs_Printf(string,fmt,ap);
UartSendString(string);
va_end(ap);
}
/********************************************************************
* 函数名 : 主函数
* 函数功能 : 测试打印输出
*******************************************************************/
#include "include.h"
#include "stdarg.h"
#include "string.h"
void main()
{
int year=2012;
WDTCTL = WDTPW + WDTHOLD;
Init_Clk();
UartInit();
char *str="Hello World!";
Printf("year=%d\n str=%s\n",year,str);
}
实现效果:
参考博文