[求助] 5529串口中断发送程序(问题已自行解决)

传说中的垚鸟   2016-7-20 19:56 楼主
最近在学习使用串口屏,串口接收没有问题,但是在发送时只发送一次,麻烦各位看一下 本帖最后由 传说中的垚鸟 于 2016-7-21 10:30 编辑

回复评论 (3)

#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 编辑
点赞  2016-7-20 19:57
send_count在发送后未清零,写程序时还是不够细心,楼下贴正确的,本程序可以留给初学串口的小伙伴使用。
点赞  2016-7-21 10:32
#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;
}

点赞  2016-7-21 10:33
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复