专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
5529串口中断发送程序(问题已自行解决)
2019-03-24 09:08
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
TI MCU
11578
3
1621
本帖最后由 传说中的垚鸟 于 2016-7-21 10:30 编辑
最近在学习使用串口屏,串口接收没有问题,但是在发送时只发送一次,麻烦各位看一下
此帖出自
小平头技术问答
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
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;
}
加载中...
查看其它3个回答
一周热门
更多
>
相关问题
相关文章
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
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;
}
一周热门 更多>