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

2019-03-24 09:08发布

本帖最后由 传说中的垚鸟 于 2016-7-21 10:30 编辑

最近在学习使用串口屏,串口接收没有问题,但是在发送时只发送一次,麻烦各位看一下
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
传说中的垚鸟
1楼-- · 2019-03-24 15:50
本帖最后由 传说中的垚鸟 于 2016-7-21 10:33 编辑

#include <msp430.h>

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;i++) rexv_data_first=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];
        }
/////////////////////////!!!!!!!!!!!!!就这未清零
}



传说中的垚鸟
2楼-- · 2019-03-24 21:38
 精彩回答 2  元偷偷看……
传说中的垚鸟
3楼-- · 2019-03-25 03:19
#include <msp430.h>

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;i++) rexv_data_first[i]=rexv_data[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;
}

一周热门 更多>

相关问题

    相关文章