关于双串口通讯的问题?

2019-07-15 16:49发布

使用以下代码,结果串口调试
  1. /******************************************************
  2. 程序功能:使用2串口进行串口通讯,串口1接受到01后回发给上位机01 ,否则不回。
  3.                                  串口2接收到02后回发给上位机02, 否则不回。
  4. 为保证数据不同时占用232.在进入任何一个串口中断时,将中断使能关闭,退出中断时重新开启中断使能
  5. -------------------------------------------------------
  6. 通信格式:N.8.1,  9600
  7.          无校验,8个数据位,1个停止位,波特率9600
  8. ------------------------------------------------------

  9. *******************************************************/
  10. #include  <msp430x14x.h>
  11. /*************串口初始化函数*************************/
  12. void uart_init(void)
  13. {
  14.     P3SEL |= 0x30;                            // 选择P3.4和P3.5做UART0,P3.6.P3.7做UART1
  15.     P3SEL |= 0xC0;                            //将P3.6,P3.7选做UART1的通信端口
  16.    
  17.     ME1 |= UTXE0 + URXE0;                     // 使能USART0的发送和接受
  18.     ME2 |= UTXE1 + URXE1;                     //使能USART1的TXD和RXD
  19.    
  20.     UCTL0 |= CHAR;                            // 选择8位字符
  21.     UCTL1 |= CHAR;                            //选择8-bit字符
  22.    
  23.     UTCTL0 |= SSEL0;                          // 都使用UCLK = ACLK
  24.     UTCTL1 |= SSEL0;                          //驱动时钟选择ACLK
  25.    
  26.     UBR00 = 0x03;                             // 波特率9600
  27.     UBR10 = 0x00;                              
  28.     UMCTL0 = 0x4A;                            // 波特率校验,具体见430用户手册
  29.    
  30.     UBR01 = 0x03;                             //波特率2400
  31.     UBR11 = 0x00;
  32.     UMCTL1 = 0x4A;                            //调整
  33.    
  34.     UCTL0 &= ~SWRST;                          // 初始化UART0状态机
  35.     UCTL1 &= ~SWRST;                          //初始化UART状态机
  36.    
  37.     IE1 |= URXIE0;                            // 使能USART0的接收中断
  38.     IE2 |= URXIE1;
  39.       
  40. }//时钟出使化函数
  41. void int_clk()
  42. {
  43.   unsigned char  i;
  44.   BCSCTL1&=~XT2OFF;
  45.   BCSCTL2|=SELM1+SELS;
  46.   do
  47.   {
  48.     IFG1&=~OFIFG;
  49.     for(i=0;i<100;i++)
  50.       _NOP();
  51.   }while((IFG1&OFIFG));
  52.   IFG1&=~OFIFG;
  53. }
  54. /********************主函数********************/
  55. void main(void)
  56. {   
  57.   
  58.   
  59.   
  60.     P2DIR=BIT0;    // P2.0 管脚配置为输出
  61.     P2OUT&=~BIT0;  // P2.0置0
  62.     //P2OUT|=BIT0; //P2.0置1
  63.     //P2OUT|=BIT0; //P2.0置1 ^=取反
  64.   
  65.   
  66.       
  67.     WDTCTL = WDTPW + WDTHOLD;                 // 关闭看门狗
  68.     int_clk();
  69.     uart_init();                              //串口初始化
  70.     while(1)
  71.     {
  72.    

  73.     }
  74.       _EINT();                               //打开全局中断
  75.       LPM1;
  76. }
  77. /*******************************************
  78. 函数名称:UART0_RXISR
  79. 功    能:UART0的接收中断服务函数,在这里唤醒
  80.           CPU,使它退出低功耗模式
  81. 参    数:无
  82. 返回值  :无
  83. ********************************************/
  84. #pragma vector = UART0RX_VECTOR
  85. __interrupt void UART0_RXISR(void)
  86. {P2OUT^=BIT0; //P2.0 ^=取反
  87.   if(RXBUF0=='a')                             //确定数据位01
  88.       {
  89.         _DINT();                                //关闭全局中断
  90.         while (!(IFG1 & UTXIFG0));             //等待以前的字符发送完毕
  91.         TXBUF0 = RXBUF0;                       //将收到的字符发送出去
  92.         IFG1 &= ~UTXIFG0;
  93.       }
  94.   else
  95.   {
  96.     _DINT();  
  97.       while (!(IFG1 & UTXIFG0));             //等待以前的字符发送完毕
  98.         TXBUF0 = 'o';                       //将收到的字符发送出去
  99.         IFG1 &= ~UTXIFG0;

  100.   }
  101. }
  102. /*******************************************
  103. 函数名称:UART1_RXISR
  104. 功    能:UART1的接收中断服务函数,在这里唤醒
  105.           CPU,使它退出低功耗模式
  106. 参    数:无
  107. 返回值  :无

  108. ********************************************/
  109. #pragma vector = UART1RX_VECTOR           //中断入口
  110. __interrupt void UART1_RXISR(void)
  111. { P2OUT^=BIT0; //P2.0^=取反
  112.   if(RXBUF1=='b')                            //确定数据位02
  113.   {
  114.       _DINT();                                //关闭全局中断
  115.       while(!(IFG2 & UTXIFG1));               //等待发送结束
  116.       TXBUF1 = RXBUF1;                        //将接收到的数据发送出去
  117.       IFG2 &= ~UTXIFG1;
  118.    
  119.   }
  120.   else
  121.   {
  122.       _DINT();
  123.       while(!(IFG2 & UTXIFG1));               //等待发送结束
  124.       TXBUF1 = 'j';                        //将接收到的数据发送出去
  125.       IFG2 &= ~UTXIFG1;
  126.   }
  127. }
复制代码


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。