/***********************************************************************************************
通信协议: 第1字节,MSB为1,为第1字节标志,第2字节,MSB为0,为非第一字节标志,其余类推……
最后一个字节为前几个字节后7位的异或校验和.测试方法:可以将串口调试助手的发送框写上 95 10 20 25,
并选上16进制发送,接收框选上16进制显示,如果每发送一次就接收到95 10 20 25,说明测试成功。
这是一个430串口接收(中断)和发送例程,可以用来测试430单片机的中断接收
***********************************************************************************************/
#include <MSP430x14x.h>
void Init_UART1(void); //声明UART初始化函数
void Init_Timer_A(void); //初始化定时器模块
#define INBUF_LEN 4 //数据长度
unsigned char UART1_RXBUF1[INBUF_LEN];
char checksum,count3;
char TX_Flag;
void send_string_com( unsigned char *str, unsigned int strlen);
void main(void)
{
WDTCTL = WDTPW + WDTHOLD ; //关闭看门狗
Init_UART1(); //UART初始化函数
_EINT(); //通用中断允许
while(1) //主循环
{
if( TX_Flag ==1) //如果取数标志已置位,就将读到的数从串口发出
{
TX_Flag = 0 ; //取数标志清0
send_string_com(UART1_RXBUF1,INBUF_LEN);
}
}
}
void Init_UART1(void)
{
UCTL1 &=~ SWRST; // SWRST复位,USART允许
UCTL1 = 0x10; // 8位数据位,1位停止位,无校验
UBR01 = 0x0D;
UBR11 = 0x00; // 使用32KHz晶振时波特率为2400bps
UMCTL1 = 0x6B; // 位调整
UTCTL1 = 0x10; // 选定ACLK(32KHz晶振)为时钟源
ME2 |= 0x30; //UART发送及接收模块允许
P3SEL = 0xC0; // P3.6 P3.7被USART1发送模块占用
P3DIR = 0X40; // P3.6 输出,P3.7 输入
IE2 |= URXIE1; //接收中断允许
}
//向串口发送一个字符
void send_char_com( unsigned char ch)
{
TXBUF1=ch;
while ((UTCTL1&0x01)==0 );
}
//向串口发送一个字符串,strlen为该字符串长度
void send_string_com( unsigned char *str, unsigned int strlen)
{
unsigned int k= 0 ;
do
{
send_char_com(*(str + k));
k++;
} while (k < strlen);
}
/*****************************************************************************
USART1接收中断函数
******************************************************************************/
#pragma vector=UART1RX_VECTOR
__interrupt void UART1(void)
{
if (URXIFG1)
{
unsigned char ch;
IFG2 &=~ URXIFG1 ;
ch=RXBUF1;
if (ch> 127 )
{
count3= 0 ;
UART1_RXBUF1[count3]=ch;
checksum= ch- 128 ;
}
else
{
count3++;
UART1_RXBUF1[count3]=ch;
checksum ^= ch;
if ( (count3==(INBUF_LEN- 1 )) && (!checksum) )
{
TX_Flag = 1 ;
//如果串口接收的数据达到INBUF_LEN个,且校验没错,
//就置位取数标志
}
}
}
}