【问题标题】:How can I send a string instead of a character through Serial with the MSP430? ( Code Composer Studio(C Language))如何使用 MSP430 通过串行发送字符串而不是字符? ( Code Composer Studio(C 语言))
【发布时间】:2021-04-28 09:34:47
【问题描述】:

我有以下代码可以正常运行且没有错误: 现在我的主要目标是,我想向终端发送一个字符串而不是一个字符(在线:if (rcv == 'a')),我将 rcv 变量的类型从 unsigned char 更改为 char rcv [] 但无济于事。

而且我也不知道如何正确地将字符串重置为 0(在 rcv = 0x00 行)。 发送字符串以取回字符串的最佳或最简单的解决方案是什么? 我会非常感谢大家的每一个帮助! 提前致谢

// ----------------- Gl. Variablen --------------------------------------------- 

unsigned char rcv;                                                              // Global variable für empfangene Daten per IR aus UART UCA0

// ------------------ PROTOTYPEN -----------------------------------------------

void UART_init(void);                                                          
void UART_send_string(char* str);                                               
__interrupt void UART_receive_ISR(void);                                       

// -------------------- MAIN ---------------------------------------------------

void main( void )
{
   WDTCTL = WDTPW + WDTHOLD;                                                    
   
   DCOCTL = 0;                                                                
   BCSCTL1 = CALBC1_1MHZ;                                                       
   DCOCTL = CALDCO_1MHZ;                                                        // .-
   
   UART_init();                                                                
   _EINT();                                                                     
   
   while (1)                                                                   
   { 
     if (rcv == 'a')                                                                 
{
       rcv = 0x00;                                                        
       UART_send_string("Hello world");                                         
     } // if
   } // while
}

// ------------------ FUNKTIONEN -----------------------------------------------

//
// Initialisiert das UART-Modul UCA0 des MSP430G2553. Dazu werden Pins 1.1 und 
// 1.2 für TX und RX eingestellt. Baudrate 9600 bei einer Frequenz von 1MHz.
//
void UART_init(void)
{
  P1SEL = BIT1 + BIT2 ;                                                       
  P1SEL2 = BIT1 + BIT2 ;                                                        // .-

  UCA0CTL1 |= UCSSEL_2;                                                         // SMCLK
  UCA0BR0 = 104;                                                                // 1MHz 9600
  UCA0BR1 = 0;                                                                  // 1MHz 9600
  UCA0MCTL = UCBRS0;                                                            // Modulation UCBRSx = 1
  UCA0CTL1 &= ~UCSWRST;                                                      
  
  UC0IE |= UCA0RXIE;                                                           
}

//
// Sende einen String über UART-Modul UCA0 des MSP430G2553. 
//
void UART_send_string(char* str)
{
  while (*str != 0)                          
  {
    while (!(IFG2 & UCA0TXIFG));                         
    UCA0TXBUF = *str++;                                                       
  } // while
}

//
// 
// MSP430G2553.
//
#pragma vector=USCIAB0RX_VECTOR
__interrupt void UART_receive_ISR(void)
{
  while (!(IFG2&UCA0RXIFG));                                                  
  rcv = UCA0RXBUF;                                                              
}

【问题讨论】:

    标签: c uart msp430


    【解决方案1】:

    此代码存在一些基本错误,您需要先解决这些错误,然后才能了解实际功能。您有一个经典且非常常见的错误,其中与 ISR 共享的变量不受保护,也没有 volatile 限定。不保证编译器生成原子访问,也不保证生成访问rcv 变量的正确代码。此答案中的更多信息:Using volatile in embedded C development

    一旦您了解如何做到这一点,您就可以将单个字符换成环形缓冲区。要么作为一个简单的数组实现,要么作为一个独立的“ADT”实现。然后,您可以使用每个字节一个中断来填充它,或者通过为第一个字节触发一个中断,然后轮询 UART rx 寄存器以查找所有未决的寄存器,前提是您需要特定的 UART 协议。

    现代 MCU 使用 DMA 而不是手动中断,但我不确定这是否是一个选项。它从 CPU 中卸载了大量密集的中断工作,因此它通常是首选,即使它可能带有自己的各种怪癖。

    对于一个除了 UART 通信之外不做太多其他事情的简单程序,您实际上并不需要中断,但可能会使用 main() 中的循环轮询。这是迄今为止最简单的,但也不允许您的程序做很多其他事情,因为它必须足够快才能在 10 位 UART 帧周期内完成所有工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-30
      • 1970-01-01
      • 2020-08-16
      • 2010-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多