MSP430串口发送丢失字节

2019-07-25 13:44发布

本帖最后由 kafeng 于 2015-10-24 11:19 编辑

用以下配置和程序发送字符串总会有随机丢失字节的情况,求大神指教。

void Init_usart0(void)
{
    P3SEL |= BIT4 + BIT5;  //选择P3^4和P3^5引脚为外围模块功能

    U0CTL=(PENA&0x00) | (PEV&0x00) | (SPB&0x00) | (CHAR&0xff) | (SYNC&0x00)| (MM&0x00);
    //效验禁止,1位停止位,字符长度,8位,USART模块的模式选择,选择UART模式(异步)   

    U0TCTL=(CKPL&0x00) | (SSEL1&0xff) | (URXSE&0x00) | (TXWAKE&0x00) | (TXEPT&0x00);
    //时钟极性控制位,UCLKI信号与UCLK信号极性相同,确定波特率发生器的时钟源为SMCLK(即为1MHz)

    U0BR0=0x68;
    U0BR1=0x00;
    U0MCTL=0x88;   
   
    U0CTL&=~SWRST;

    ME1|=(UTXE0&0xff) | (URXE0&0xff);   //USART0发送允许,USART0接收允许
    IE1|=(UTXIE0&0xff) | (URXIE0&0xff);  //USART0发送中断使能,USART0接收中断使能
    IFG1 &=0x7f;       //清0发送中断标志位
}


/*指针指向要发送的字符串,及要发送的数据长度*/
void Sent_Uart0(unsigned char *p,unsigned char length)        //USART0串口发送函数
{
        TX0_pointer = p;         //指针指向要发送的内容数组
        TX0_length = length;      //定义要发送的数据长度      

        IFG1|=UTXIFG0;   //发送中断置位
         
        while( TX0_complete_flag ==0);//等待所有发送完成

        while((U0TCTL&TXEPT)==0);  //判断当前数据是否发送完成
        IFG1&=~UTXIFG0;   //清除中断标志
        TX0_complete_flag =0;  //清除发送完成标志位        
}


#pragma vector=UART0TX_VECTOR          //USART0串口发送中断
__interrupt void usart0_tx(void)
{      
      if(TX0_length)
      {               
          U0TXBUF=*(TX0_pointer++);
          while (!(IFG1&UTXIFG0)); // 判断:发送是否完成
      }
       TX0_length --;                           
      if(TX0_length==0)
      {         
          TX0_complete_flag =1;  //所有字节发送完成
      }
                  
}





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
13条回答
kafeng
2019-07-25 21:27
本帖最后由 kafeng 于 2015-10-27 15:07 编辑
dirtwillfly 发表于 2015-10-24 17:51
void Sent_Uart0(unsigned char *p,unsigned char length)   
这个函数是在主程序里?
估计经常会被串口中 ...

好吧,交友不慎,用了一个稀烂的串口助手,换了这个就好了。测试了50k字节,再没出过稀奇古怪的问题。 捕获2.PNG

然后这两句也可以删除了。

多余的代码~

多余的代码~

感谢大家的关注,结贴给分啦~



一周热门 更多>