最近在学习使用串口屏,串口接收没有问题,但是在发送时只发送一次,麻烦各位看一下
本帖最后由 传说中的垚鸟 于 2016-7-21 10:30 编辑
#include
void UART_init(void);
void Rexv_Data_Analysis(void);
void send_addr_data(unsigned char addr,unsigned int Data);
unsigned char rexv_data[10]; //接收缓冲
unsigned char rexv_data_first[10]; //接收缓冲1
unsigned char rexv_count; //接收缓冲计数
unsigned char rexv_analyze=0; //接受数据分析位
unsigned char send_data[10]; //发送缓存
unsigned char send_count=0; //发送缓存计数
unsigned char PWM=100; //调试使用变量
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
UART_init();
_EINT();
while(1)
{
if(rexv_analyze==1){Rexv_Data_Analysis();}
}
}
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{
unsigned char i=0;
switch(__even_in_range(UCA0IV,4))
{
case 2: // Vector 2 - RXIFG
{
if(UCTXIFG) //判断UCTXIFG是否为1
{
rexv_data[rexv_count]=UCA0RXBUF; // TX -> RXed character
rexv_count++;
if(rexv_count<3) //对帧头进行判断,如错误
{
if(rexv_data[0] != 0x5a) rexv_count=0;
else
if(rexv_count==2)
if(rexv_data[1] != 0xa5) rexv_count=0;
}
else if(rexv_count>=3) //帧头正确进去此函数
{
if(rexv_count>(rexv_data[2]+2)) //判断接受数据长度
{
for(i=0;i=rexv_data; //转存数据
rexv_count=0; //接收数据计数清零
rexv_analyze=1; //接受数据执行标志位置1
}
}
}
}
break;
case 4: break;
default: break;
}
}
void UART_init(void)
{
P3SEL |= BIT3+BIT4; // P4.4,5 使用外设功能 = UCA1 TXD/RXD
UCA0CTL1 |= UCSWRST; // 复位 USCI
UCA0CTL1 |= UCSSEL_2; // 设置 SMCLK 时钟,用于发生特定波特率
UCA0BR0 = 9; // 设置波特率, 1MHz 波特率= 115200
UCA0BR1 = 0;
UCA0MCTL |= UCBRS_1 + UCBRF_0;
UCA0CTL1 &= ~UCSWRST; // 结束复位
UCA0IE |= UCRXIE; // 使能 UCA0接受中断
//UCA0IE |= UCTXIE;
}
void Rexv_Data_Analysis(void)
{
unsigned int DGUS_addr;
rexv_analyze=0; //数据分析标志位清除
DGUS_addr=rexv_data_first[4]*256+rexv_data_first[5]; //计算地址
switch(DGUS_addr)
{
case 0x0000: //在地址一的情况下
if(rexv_data_first[8]==0x11) //接收数据的最后一位
{
P1DIR |= BIT0;
P1OUT ^=BIT0;
}
else if(rexv_data_first[8]==0x12)
{
P4DIR |= BIT7;
P4OUT ^=BIT7;
}
else if(rexv_data_first[8]==0x52)
{
P4DIR |= BIT7;
P4OUT ^=BIT7;
PWM++;
}
else if(rexv_data_first[8]==0x53)
{
P1DIR |= BIT0;
P1OUT ^=BIT0;
PWM--;
send_addr_data(0x0052,PWM);
}
}
}
void send_addr_data(unsigned char addr,unsigned int Data)
{
send_data[0] = 0x5A;
send_data[1] = 0xA5;
send_data[2] = 0x05;
send_data[3] = 0x82;
send_data[4] = addr/256;
send_data[5] = addr%256;
send_data[6] = Data/256;
send_data[7] = Data%256;
for(;send_count<8;send_count++)
{
while (!(UCA0IFG&UCTXIFG));
UCA0TXBUF = send_data[send_count];
}/////////////////////////!!!!!!!!!!!!!就这未清零
}
本帖最后由 传说中的垚鸟 于 2016-7-21 10:33 编辑
send_count在发送后未清零,写程序时还是不够细心,楼下贴正确的,本程序可以留给初学串口的小伙伴使用。
#include
void UART_init(void);
void Rexv_Data_Analysis(void);
void send_addr_data(unsigned char addr,unsigned int Data);
unsigned char rexv_data[10]; //接收缓冲
unsigned char rexv_data_first[10]; //接收缓冲1
unsigned char rexv_count; //接收缓冲计数
unsigned char rexv_analyze=0; //接受数据分析位
unsigned char send_data[10]; //发送缓存
unsigned char send_count=0; //发送缓存计数
unsigned char PWM=100; //调试使用变量
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
UART_init();
_EINT();
while(1)
{
if(rexv_analyze==1){Rexv_Data_Analysis();}
}
}
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{
unsigned char i=0;
switch(__even_in_range(UCA0IV,4))
{
case 2: // Vector 2 - RXIFG
{
if(UCTXIFG) //判断UCTXIFG是否为1
{
rexv_data[rexv_count]=UCA0RXBUF; // TX -> RXed character
rexv_count++;
if(rexv_count<3) //对帧头进行判断,如错误
{
if(rexv_data[0] != 0x5a) rexv_count=0;
else
if(rexv_count==2)
if(rexv_data[1] != 0xa5) rexv_count=0;
}
else if(rexv_count>=3) //帧头正确进去此函数
{
if(rexv_count>(rexv_data[2]+2)) //判断接受数据长度
{
for(i=0;i
rexv_count=0; //接收数据计数清零
rexv_analyze=1; //接受数据执行标志位置1
}
}
}
}
break;
case 4: break;
default: break;
}
}
void UART_init(void)
{
P3SEL |= BIT3+BIT4; // P4.4,5 使用外设功能 = UCA1 TXD/RXD
UCA0CTL1 |= UCSWRST; // 复位 USCI
UCA0CTL1 |= UCSSEL_2; // 设置 SMCLK 时钟,用于发生特定波特率
UCA0BR0 = 9; // 设置波特率, 1MHz 波特率= 115200
UCA0BR1 = 0;
UCA0MCTL |= UCBRS_1 + UCBRF_0;
UCA0CTL1 &= ~UCSWRST; // 结束复位
UCA0IE |= UCRXIE; // 使能 UCA0接受中断
//UCA0IE |= UCTXIE;
}
void Rexv_Data_Analysis(void)
{
unsigned int DGUS_addr;
rexv_analyze=0; //数据分析标志位清除
DGUS_addr=rexv_data_first[4]*256+rexv_data_first[5]; //计算地址
switch(DGUS_addr)
{
case 0x0000: //在地址一的情况下
if(rexv_data_first[8]==0x11) //接收数据的最后一位
{
P1DIR |= BIT0;
P1OUT ^=BIT0;
}
else if(rexv_data_first[8]==0x12)
{
P4DIR |= BIT7;
P4OUT ^=BIT7;
}
else if(rexv_data_first[8]==0x52)
{
P4DIR |= BIT7;
P4OUT ^=BIT7;
PWM++;
}
else if(rexv_data_first[8]==0x53)
{
P1DIR |= BIT0;
P1OUT ^=BIT0;
PWM--;
send_addr_data(0x0052,PWM);
}
}
}
void send_addr_data(unsigned char addr,unsigned int Data)
{
send_data[0] = 0x5A;
send_data[1] = 0xA5;
send_data[2] = 0x05;
send_data[3] = 0x82;
send_data[4] = addr/256;
send_data[5] = addr%256;
send_data[6] = Data/256;
send_data[7] = Data%256;
for(;send_count<8;send_count++)
{
while (!(UCA0IFG&UCTXIFG));
UCA0TXBUF = send_data[send_count];
}
send_count=0;
}