6018|12

80

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

485通信 430可以给PC发数,但PC给430发总调不通,帮忙看看 [复制链接]

这是1611 485 发送的程序,但是下边的接收程序在接受缓冲器总读不到数呢?


#include <msp430x16x.h>
void Set_UART0(void);

void Set_UART0(void)
{
P3SEL |= 0x30; // P3.4,5选择为UART收发端口
ME1 |= UTXE0 + URXE0; // 模块允许寄存器设置,使能USART0 TXD/RXD
UCTL0 |= CHAR; // 串口控制寄存器,设为8位字符格式
UTCTL0 |= SSEL0; // 串口控制寄存器所使用的时钟,选择UCLK = ACLK
UBR00 = 0x0D;
UBR10 = 0x00; //波特率设置为ACLK的频率/波特率换算为十六进制即可
UMCTL0 = 0x6B; // 波特率调整器设置
UCTL0 &= ~SWRST; // 初始化UART0状态机
}

void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
Set_UART0(); //异步通信 采用串口0设置
P4DIR |= BIT2 ; //方向寄存器为输出状态
P4OUT |= BIT2 ; //p4.2 发送
P5DIR |=BIT4; //LED指示

for (;;)
{

TXBUF0 = 0x33; //不断发送数据0x33
while(!(IFG1 & UTXIFG0)); //等待发送结束 USART0发送UTXIFG0=1,表示 UTXBUF准备好发送一个字符
IFG1 &= ~UTXIFG0;
P5OUT ^=BIT4; //取反,led灯闪烁
volatile unsigned int i; //延时
i =10000;
do i--;
while (i != 0);

}
}





接收程序


#include <msp430x16x.h>
char data;
void Set_UART0(void);

void Set_UART0(void)
{

P3SEL |= 0x30; // P3.4,5选择为UART收发端口
ME1 |= UTXE0 + URXE0; // 模块允许寄存器设置,使能USART0 TXD/RXD
UCTL0 |= CHAR; // 串口控制寄存器,设为8位字符格式
UTCTL0 |= SSEL0; // 串口控制寄存器所使用的时钟,选择UCLK = ACLK
UBR00 = 0x0D;
UBR10 = 0x00; //波特率设置为ACLK的频率/波特率换算为十六进制即
UMCTL0 = 0x6B; // 波特率调整器设置
UCTL0 &= ~SWRST; // 初始化UART0状态机
}

void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
Set_UART0(); //异步通信 采用串口0设置
P4OUT &= ~ BIT2 ; //控制接收端
P5DIR |=BIT6; //LED指示
for (;;)
{

while(!(IFG1 & URXIFG0)); //等待接收结束
IFG1|= URXIFG0; //清除中断标志
P5OUT ^=BIT6; //取反,led灯闪烁
data = RXBUF0;

}
}
大侠帮忙看看吧

最新回复

错误之处:要使用while(!(IFG1 & URXIFG0)); //等待接收结束,必须禁止接收中断才行,此句应该不在中断模块中执行!  详情 回复 发表于 2009-3-11 02:45
 
点赞 关注

回复
举报

64

帖子

0

TA的资源

一粒金砂(初级)

推荐
 
如果你想只把数据发出,最简单的办法就

TXBUF0 = 0x33; //不断发送数据0x33
_BIS_SR(LPM3_bits + GIE);

P5OUT ^=BIT4; //取反,led灯闪烁
volatile unsigned int i; //延时
i =10000;
do i--;
while (i != 0);
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
中断都没有开,URXIFG0应该不会置位
 
 
 

回复

91

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
你的程序执行能跳过while(!(IFG1 & URXIFG0)); //等待接收结束
这句么?
请给出具体的信息 不然不好判断

ps:1楼所说的中断使能其实无所谓,楼主程序中是使用直接查询标志位的,这样速度会快一些但是大量占用cpu资源
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

4
 

你的程序执行能跳过while(!(IFG1 & URXIFG0)); //等待接收结束

就是 跳不过去while(!(IFG1 & URXIFG0)); //等待接收结束
这句,版主帮我看看,还有我发送的这个无法进入中断
#include <msp430x16x.h>
void Set_UART0(void);

void Set_UART0(void)
{
P3SEL |= 0x30; // P3.4,5选择为UART收发端口
ME1 |= UTXE0 + URXE0; // 模块允许寄存器设置,使能USART0 TXD/RXD
UCTL0 |= CHAR; // 串口控制寄存器,设为8位字符格式
UTCTL0 |= SSEL0; // 串口控制寄存器所使用的时钟,选择UCLK = ACLK
UBR00 = 0x0D;
UBR10 = 0x00; //波特率设置为ACLK的频率/波特率换算为十六进制即
UMCTL0 = 0x6B; // 波特率调整器设置
UCTL0 &= ~SWRST; // 初始化UART0状态机
IE1|=UTXIE0;
_EINT();
}

void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗

P4DIR |= BIT2 ; //方向寄存器为输出状态
P4OUT |= BIT2 ; //p4.2 发送
P5DIR |=BIT4; //LED指示
Set_UART0();
for (;;)
{
_BIS_SR(LPM3_bits + GIE);
TXBUF0 = 0x33; //不断发送数据0x33
while(!(IFG1 & UTXIFG0)); //等待发送结束 USART0发送UTXIFG0=1,
IFG1 &= ~UTXIFG0;
P5OUT ^=BIT4; //取反,led灯闪烁
volatile unsigned int i; //延时
i =10000;
do i--;
while (i != 0);

}
}

#pragma vector=USART1TX_VECTOR
__interrupt void usart1_tx (void)
{
_BIC_SR_IRQ(LPM3_bits );
}
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

5
 
for里面有问题,执行串口中断服务后是自动清UTXIFG0,
for (;;)
{
_BIS_SR(LPM3_bits + GIE); //进到LP3,程序就停在这了
TXBUF0 = 0x33; //不断发送数据0x33
while(!(IFG1 & UTXIFG0)); //等待发送结束 USART0发送UTXIFG0=1,
IFG1 &= ~UTXIFG0; //发送
P5OUT ^=BIT4; //取反,led灯闪烁
volatile unsigned int i; //延时
i =10000;
do i--;
while (i != 0);

}
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

6
 

for里面有问题,执行串口中断服务后是自动清UTXIFG0

程序就是停在那了,有什么办法呢?再帮我看看以上那个接收的程序,谢谢了。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

7
 
我看了一下你的注示,你的波特率是多少?如果设成9600应该是
UBR00 = 0x03; // 波特率设置32k/9600 - 3.41
UBR10 = 0x00; //波特率设置为ACLK的频率/波特率换算为十六进制即
UMCTL0 = 0x4A; // 波特率调整器设置
是不是波特率不对应?
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

8
 

我看了一下你的注示,你的波特率是多少?如果设成9600应该是

我波特率改为2400了,原来是9600,注释没改动,不好意思
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

10
 
其中你的接收程序里有一处错误,清接收中断标志(IFG1|= URXIFG0; //清除中断标志),此句有误,你改一下,试试行了吧? IFG1 &= ~URXIFG0 ;
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

11
 

还是不行啊

我通过串口调试器要发的是0x11,但是在watch窗口里RXBUF0总是随机的数,0xDE,0XCA等等。
#include <msp430x16x.h>
char data;
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
P3SEL |= 0x30; // P3.4,5选择为UART收发端口
ME1 |= UTXE0 + URXE0; // 模块允许寄存器设置,使能USART0 TXD/RXD
UCTL0 |= CHAR; // 串口控制寄存器,设为8位字符格式
UTCTL0 |= SSEL0; // 串口控制寄存器所使用的时钟,选择UCLK = ACLK
UBR00 = 0x0D; // 波特率设置2400
UBR10 = 0x00; //波特率设置为ACLK的频率/波特率换算为十六进制即可
UMCTL0 = 0x6B; // 波特率调整器设置
UCTL0 &= ~SWRST; // 初始化UART0状态机
IE1|=URXIE0;

P4OUT &= ~ BIT2 ; //控制接收开始
P5DIR |=BIT6; //LED指示
for (;;)
{
data = RXBUF0;
_BIS_SR(LPM3_bits + GIE);
P5OUT ^=BIT6; //取反,led灯闪烁
volatile unsigned int i; //延时
i =10000;
do i--;
while (i != 0);
}
}
#pragma vector=USART0RX_VECTOR
__interrupt void usart0_rx (void)
{
while(!(IFG1 & URXIFG0)); //等待接收结束
IFG1 &= ~URXIFG0;
_BIC_SR_IRQ(LPM3_bits );

}
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

12
 
#pragma vector=USART0RX_VECTOR
__interrupt void usart0_rx (void)
{
while(!(IFG1 & URXIFG0)); //等待接收结束 [COLOR="××ack"]如果程序能进到中断,已经接收到数据,如果还在这等,数据肯定就不对了,还有串号中断自动会清标致位的,不用下面这行没有关系。[/color]
IFG1 &= ~URXIFG0;
_BIC_SR_IRQ(LPM3_bits );

}[/quote]

for循环data=RXBUF0;删除
中断程序里只要二名就行的
#pragma vector=USART0RX_VECTOR
__interrupt void usart0_rx (void)
{
data=RXBUF0;
LPM3_EXIT;

}
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

13
 
错误之处:要使用while(!(IFG1 & URXIFG0)); //等待接收结束,必须禁止接收中断才行,此句应该不在中断模块中执行!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表