当前位置: 代码迷 >> 单片机 >> msp430单片机通讯有关问题
  详细解决方案

msp430单片机通讯有关问题

热度:99   发布时间:2016-04-28 16:02:29.0
msp430单片机通讯问题
最近小弟在用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,但是没学串口,杯具