最近小弟在用msp430F4152单片机与PC进行调试,在调试过程中遇到一些问题,向大家请教一下:
在初始化完单片机后(波特率9600,数据位8位停止位1位),让单片机向PC机发送一串数据,在上位机用串口调试工具可以清楚看到发送过来的数据,并且都是正确的,但是当我用串口工具向单片机发送一串数据时(比如:14 36 69 57 32 01 55),十六进制发送,十六进制显示,单片机中断接收,但只能接收到第一个跟最后一个字节,即14 55,中间诸多字节全都接收不到,使用单片机自发自收也只是能第一个跟最后一个字节,不知道问题在哪?有时在想是不是波特率的问题,但是如果真是波特率的问题,那PC机接收单片机发送过来的数据为什么都是对的呢?纳闷中,希望大虾们能指点迷津,多谢!!!
下面是代码:
void init_mcu()
{
volatile unsigned int i;
WDTCTL = WDTPW+WDTHOLD; // Stop WDT
FLL_CTL0 |= XCAP14PF; // Configure load caps
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0x47FF; i > 0; i--); // Time for flag to set
}
while ((IFG1 & OFIFG)); // OSCFault flag still set?
P6SEL |= BIT5+BIT6; // P6.5,6 = USCI_A0 RXD/TXD
UCA0CTL1 |= UCSSEL_1; // CLK = ACLK
UCA0BR0 = 0x03; // 32k/9600 - 3.41
UCA0BR1 = 0x00; //
UCA0MCTL = 0x06; // Modulation
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt
//_BIS_SR(LPM3_bits + GIE); // Enter LPM0, interrupts enabled 把此句去掉,可以进定时器中断灯闪,可以发送主函数里串口数据,可以进接收中断
TA0CCR0 = 16384;
TACCTL0 = CCIE; //CCIE=0x0010,定时器TA0中断使能
TACTL = TASSEL0 + TACLR; //设置定时器A控制寄存器,TASSEL0=0x0100选择辅助时钟,清除计数器A
TACTL |= MC0;
P4DIR = 0x03; //P4.0 P4.1输出 P4.6 P4.7输入
P4OUT = 0x03; //P4.0 P4.1输出1 开机不点亮两绿LED灯
}
中断接收函数:
#pragma vector = USCIAB0RX_VECTOR
__interrupt void msp430_receive (void)
{
uchar i;
uchar flag;
//static uint data_num;
//IE2 &= ~UCA0RXIE;
//IFG2 &= ~UCA0RXIFG; //接收中断标志清零
Msp430_RX_PC[data_num++] = UCA0RXBUF;
//IFG2 &= ~UCA0RXIFG;
if(data_num == 7)
{
data_num-1=0;
}
}
------解决方案--------------------
貌似你的中断处理是有问题的
------解决方案--------------------
LZ问题在你的接收中断逻辑里面
呵呵
你再想想怎么可以不丢数据
下标的处理和数据有效性的处理
------解决方案--------------------
if(data_num == 7)
{
data_num-1=0; ????
}
------解决方案--------------------
学了430,但是没学串口,杯具