4697|5

68

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

【求助】请帮忙看一段串口通讯的程序 [复制链接]

请帮忙看一段串口通讯的程序,我使用MSP430F149的单片机的UART0与上位机通讯,可是串口调试助手发送的数据,单片机老接收不到,连UART0中断都进不了,实在是找不出错,请各位大侠帮忙了!
下面是所有的串口设置,我是不是还漏掉了什么呢?
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer;
BCSCTL1 &=~ XT2OFF; // XT2振荡器开启:8M
BCSCTL1 &=~ XTS; // LFTX1工作在低频模式:32K ACLK
BCSCTL2 |= SELM_2; // MCLK的时钟源为TX2CLK

P3SEL = BIT4+BIT5; // Select UTXD0与URXD0
P3DIR = 0X10; // P3.4(TXD) outputs,P3.5(RXD) inputs
U0CTL &=~ SWRST; // SWRST复位,USART允许
U0CTL = CHAR; // 字符长度为8位
U0TCTL = SSEL0; // 选择时钟UCLK=ACLK=32768
U0BR0 = 0x03; // 选择波特率9600
U0BR1 = 0x00;
U0MCTL = 0x4A; // 调整寄存器

ME1 |= UTXE0+URXE0; // 使能 USART0 TXD/RXD
IE1 |= URXIE0; // 使能 U0SART RX中断

_EINT(); // ena××e the general interrupt

最新回复

我也遇到了相同的问题!不过我就是先定义的P3口  详情 回复 发表于 2006-7-16 11:54
 
点赞 关注

回复
举报

75

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

【原创】可能的一个问题

先试一下你的上位机。确定pc机的串口是好的。
常有一些pc机的串口本身就不好。平时不用,不知道它不好。我遇到过几次。用串口调试软件调pc机与单片机的通讯,pc机收不到或收到不对。反之,单片机也收不到或收到不对。
解决方法:
1。找一个串口鼠标,接在pc机的串口上。移动鼠标,pc屏上光标动,说明串口好。
2。用好的电缆连接二台pc机串口。在二台pc机上用串口调试软件向对方发字符串。若收到正确,说明二台pc机的串口是好的。而且可达960kbps!!若收到不对,至少有一台pc机的串口是坏的。
用好串口的pc与连单片机通讯,若pc 收不到,是单片机硬件或电缆有问题。
若收到乱码,可能软件不对,波特率不对。
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
有while(1); 吗
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用:

请帮忙看一段串口通讯的程序,我使用MSP430F149的单片机的与上位机通讯,可是串口调试助手发送的数据,单片机老接收不到,连UART0中断都进不了,实在是找不出错,请各位大侠帮忙了!
下面是所有的串口设置,我是不是还漏掉了什么呢?
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer;
BCSCTL1 &=~ XT2OFF; // XT2振荡器开启:8M
BCSCTL1 &=~ XTS; // LFTX1工作在低频模式:32K ACLK
BCSCTL2 |= SELM_2; // MCLK的时钟源为TX2CLK

P3SEL = BIT4+BIT5; // Select UTXD0与URXD0
P3DIR = 0X10; // P3.4(TXD) outputs,P3.5(RXD) inputs
U0CTL &=~ SWRST; // SWRST复位,USART允许
U0CTL = CHAR; // 字符长度为8位
U0TCTL = SSEL0; // 选择时钟UCLK=ACLK=32768
U0BR0 = 0x03; // 选择波特率9600
U0BR1 = 0x00;
U0MCTL = 0x4A; // 调整寄存器

ME1 |= UTXE0+URXE0; // 使能 USART0 TXD/RXD
IE1 |= URXIE0; // 使能 U0SART RX中断

_EINT(); // ena××e the general interrupt
UART0初始化有问题:执行“U0CTL &=~ SWRST”后U0CTL就再也写不进其它数据了。调整一下试试:
......
U0TCTL = SSEL0;   // 选择时钟UCLK=ACLK=32768
U0BR0 = 0x03;    // 选择波特率9600
U0BR1 = 0x00;
U0MCTL = 0x4A;    // 调整寄存器
ME1 |= UTXE0+URXE0; // 使能 USART0 TXD/RXD
IE1 |= URXIE0; // 使能 U0SART RX中断

P3SEL = BIT4+BIT5;  // Select UTXD0与URXD0
P3DIR = 0X10;    // P3.4(TXD) outputs,P3.5(RXD) inputs
U0CTL = CHAR;    // 字符长度为8位
U0CTL &=~ SWRST;  // SWRST复位,USART允许(有前一条“U0CTL = CHAR”语句,本句可以不要)

_EINT(); // ena××e the general interrupt

另外,使用32768KHz做9600波特率有±(13%~14%)的误差,可能也影响通讯。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

5
 
可能的问题:设置串口之前要先将swrst置位 ,然后设置串口,设置完毕后再将swrst复位,最后再开中断
你可以试一试
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer;
BCSCTL1 &=~ XT2OFF; // XT2振荡器开启:8M
BCSCTL1 &=~ XTS; // LFTX1工作在低频模式:32K ACLK
BCSCTL2 |= SELM_2; // MCLK的时钟源为TX2CLK

P3SEL = BIT4+BIT5; // Select UTXD0与URXD0
P3DIR = 0X10; // P3.4(TXD) outputs,P3.5(RXD) inputs
U0CTL ||= SWRST; // SWRST置位 开始设置串口
U0CTL = CHAR; // 字符长度为8位
U0TCTL = SSEL0; // 选择时钟UCLK=ACLK=32768
U0BR0 = 0x03; // 选择波特率9600
U0BR1 = 0x00;
U0MCTL = 0x4A; // 调整寄存器
U0CTL &=~ SWRST; // SWRST复位,USART允许

ME1 |= UTXE0+URXE0; // 使能 USART0 TXD/RXD
IE1 |= URXIE0; // 使能 U0SART RX中断

_EINT(); // ena××e the general interrupt
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

6
 
我也遇到了相同的问题!不过我就是先定义的P3口
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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