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