This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/MSP430G2553:如何通过RX UART发送字符串? 我可以发送字符,但不能发送完整字符串。

Guru**** 2396425 points
Other Parts Discussed in Thread: LM35

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/641968/ccs-msp430g2553-how-to-send-a-string-over-rx-uart-i-can-send-a-character-but-not-a-full-string

部件号:MSP430G2553
在“线程:LM35”中讨论的其他部件

工具/软件:Code Composer Studio

您好,TI论坛。 我一直在从事一个使用LM35热传感器的项目,并根据当前的ADC10值更改风扇(PWM)的速度。 此外,预设温度值和当前读取的温度值之间的误差值使用名为CoolTerm的程序通过TX UART成功打印到我的PC。 但是,我也想通过RX UART设置预设温度值,我唯一能做到这一点的方法是发送长度超过一个字符的命令。 在下面的代码中,我省略了大约100行代码,以显示控制通过RX UART发送数据的部分。 在运行我的完整代码时,输入r,R,g,G,1等内容, 2,3等都能完美工作。 是否有人可以查看我的代码并告诉我需要更改哪些内容才能在UART代码作出反应之前发送完整的字符串? 我非常确定,这些行:5,26-34,57,83,是需要审核的行。

同样如您所料,我如何将温度镜值设置为我从RX UART输入的数字? 例如,如果输入SET Temp =500,如何将500字符串转换为SEutemror =(RX UART编号字符串)行的整数值? 这将使我的代码更简单,而不是为每个可能的数字输入都提供case语句。

#include <msp430g2553.h>
#include <stdio.h>/***

UART相关代码***/
静态char数据;
void UARTSendArray (unsigned char *TxArray,unsigned char ArrayLength);
//省略了许多函数原型和全局初始化变量。

/***初始化温度变量***/
室内温度镜=450;
//省略了许多函数原型和全局变量。

void init_UART()
{
	P1SEL = BIT1 + BIT2;//	WFP 1.1 = RXD, WFP 1.2 = TXD
	P1SEL2 = BIT1 + BIT2;//	WFP 1.1 = RXD,1.2 = TSUCA0EL_|2=
		// SMCLK
	UCA0BR0 = 104;			//参见UCA0BR1
	= 0以上的波特率分配器;
	UCA0MCTL = UCBRS0;		//调制UCBRSx = 1
	UCA0CTL1 &=~UCSWRST;	//**初始化USCI状态机**
	IE2 |= UCA0TXIE; 		//启用USI_A0 TX中断
}//
省略了许多函数。

void UARTSendArray (unsigned char *TxArray,unsigned char ArrayLength)
{
while (ArrayLength--){//循环到StringLength ==0,然后发布递减
while (!(IFG2 & UCA0TXIFG));//等待TX缓冲区为新数据做好准备

UCA0TXBUF =*TxArray;//在指定的位置写入字符py指针
TxArray++;//递增TxString指针以指向下一个字符
}
}

int main(void){

WDTCTL = WDTPW + WDTHOLD; //停止WDT
//省略了许多外围设备。
	
(;;)
{
ADC10CTL0 |= ENC + ADC10SC; //开始采样和转换
__bis_sr_register (CPUOFF + GIE); // LPM0,ADC10_ISR将强制退出
电流= ADC10MEM;
错误=上一页-设置温度镜;//计算与预设温度的误差。已删除abs()。
IE2 |= UCA0RXIE;//启用USI_A0 RX中断
		
		//省略了多个代码
}

#pragma vector=USCIAB0RX_vector
__interrupt void USCI0RX_ISR(void)
{
数据= UCA0RXBUF;
UARTSendArray ("接收到的命令:",18);
UARTSendArray (&data,1);//长度应为14个字符
UARTSendArray ("\n\n",2);

交换机(数据){
案例'设定温度= 450':{
温度镜=450;
}
中断;
案例'设定温度= 475':{
设置错误=475;
}
中断;
案例'设定温度= 490':{
温度镜=490;
}
中断;
案例'设定温度= 500':{
温度镜=500;
}
断裂;
		大小写'G':{//正常工作
温度镜=500;
}
中断;
默认值:{
UARTSendArray ("未知命令:",17);
UARTSendArray (&DATA,1);
UARTSendArray("\n\n",2);}

中断;
}
} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    由于ISR中每次只能获得一个Rx字符,因此需要将其保存在ISR (全局)之外的某个位置。 使用索引声明一个“命令缓冲区”,每次字符进入存储区时,都使用类似“cmdbuf[CMDi++]= UCA0RXBUF;”的内容(不要忘记检查缓冲区边界)。 当您得到回车符('\r'),信号和唤醒main()并让它处理命令时。

    要将字符串解释为整数,请使用strtoul()。 如果(出于本实验的目的)您不关心错误检查,则可以使用类似“value=strtoul(str,0,0);"的内容。