Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过MSP430串行发送字符串而不是字符?(代码生成器工作室(C语言))_C_Uart_Msp430 - Fatal编程技术网

如何通过MSP430串行发送字符串而不是字符?(代码生成器工作室(C语言))

如何通过MSP430串行发送字符串而不是字符?(代码生成器工作室(C语言)),c,uart,msp430,C,Uart,Msp430,我有以下代码,功能正常,没有错误: 现在我的主要目标是,我想向终端发送一个字符串,而不是一个字符(在第行:if(rcv=='a')),我将rcv变量的类型从unsigned char更改为char rcv[],但没有效果 我也不知道如何正确地将字符串重置为0(在rcv=0x00行上)。 为了取回字符串,发送字符串的最佳或最简单的解决方案是什么? 我真的很感激每个人的帮助! 提前谢谢 // ----------------- Gl. Variablen ----------------------

我有以下代码,功能正常,没有错误: 现在我的主要目标是,我想向终端发送一个字符串,而不是一个字符(在第行: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;                                                              
}

这段代码中有一些基本错误,您需要先解决这些错误,然后才能开始实际的功能。您有一个典型且非常常见的错误,与ISR共享的变量既不受保护,也不符合
volatile
的条件。不能保证编译器生成原子访问,也不能保证它生成正确的代码来访问
rcv
变量。此答案中的详细信息如下:

一旦您了解了如何做,就可以将单个字符交换为环形缓冲区。可以实现为简单数组,也可以实现为独立的“ADT”。然后,您可以使用每个字节一个中断来填充该数据,或者通过触发第一个字节的一个中断,然后轮询UART rx寄存器中所有挂起的数据,前提是您需要某个UART协议

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

对于一个只做UART通信的简单程序,您首先不需要中断,但可以使用main()中循环的轮询。这是目前为止最简单的,但也不允许您的程序做很多其他事情,因为它必须足够快,以在10位UART帧周期内完成所有工作