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:M430G2553从 UART 应用中的 Rx 缓冲器接收字符串

Guru**** 2546020 points
Other Parts Discussed in Thread: MSP430G2553

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/590698/ccs-m430g2553-receiving-string-from-rx-buffer-in-uart-application

主题中讨论的其他器件:MSP430G2553

工具/软件:Code Composer Studio

您好!

我已成功地将 sim900与 msp430g2553连接。 现在、我的挑战是接收 sim900在我发送 at 命令后发回的字符串

"AT+CNMI"

我应该会收到号码、日期、时间和消息、并且我正在收到该消息。 但我无法存储和使用该字符串。

我想从该字符串中提取数字。 我可以在 rxbuffer 中接收字符,但我希望接收完整字符串。

我的代码如下:

//

#include

///----------------------------------
//与硬件相关的定义
///----------------------------------
#define UART_TXD 0x02 // P1.1上的 TXD (Timer0_A.OUT0)
#define UART_RXD 0x04 // P1.2上的 RXD (Timer0_A.CCI1A)

///----------------------------------
// 9600波特率 SW UART 的条件、SMCLK = 1MHz
///----------------------------------
#define UART_TBIT_DIV_2 (1000000 /(9600 * 2))
#define UART_TBIT (1000000/9600)

///----------------------------------
//用于全双工 UART 通信的全局变量
///----------------------------------
unsigned int txData;//用于 TX 的 UART 内部变量
unsigned char rxBuffer=0;//接收到 UART 字符
unsigned char number[50];
unsigned int i=0;
///----------------------------------
//函数原型
///----------------------------------
void TimerA_UART_init (void);
void TimerA_UART_TX (无符号字符字节);
void TimerA_uart_print (char *字符串);

///----------------------------------
// main()
///----------------------------------
int main (空)

WDTCTL = WDTPW + WDTHOLD;//停止看门狗计时器
IF (CALBC1_1MHz=0xFF)//如果校准常数被擦除

while (1);//请勿加载,陷阱 CPU!!


DCOCTL = 0;//选择最低 DCOx 和 MODx 设置
BCSCTL1 = CALBC1_1MHz;//将 DCOCLK 设置为1MHz
DCOCTL = CALDCO_1MHz;

P1OUT = 0x00;//初始化所有 GPIO
P1SEL = UART_TXD + UART_RXD;// TXD/RXD 引脚的计时器功能
P1DIR = 0xFF &~UART_RXD;//将除 RXD 外的所有引脚设置为输出
P2OUT = 0x00;
P2SEL = 0x00;
P2DIR = 0xFF;

_enable_interrupt ();

TimerA_UART_init ();//启动 Timer_A UART
TimerA_UART_PRINT ("at\r\n");
_DELAY_CYCLES (50);
TimerA_uart_print ("AT+CMGf=1\r\n");
_DELAY_CYCLES (50);
TimerA_UART_PRINT ("AT+CNMI=2、2、0、0、0\r\n");
_DELAY_CYCLES (50);

//__delay_cycles (5000000);
// TimerA_uart_print ("ready.\r\n");

对于(;)

//等待传入字符
_bis_SR_register (LPM0_bits);

// if (rxBuffer & 0x10) P1OUT |= 0x40;否则 P1OUT &=~0x40;// P1.6

if (rxBuffer=''')

for (i=0;i<25;i++)


TimerA_UART_TX (编号[i]);





///----------------------------------
//函数将 Timer_A 配置为全双工 UART 操作
///----------------------------------
空 TimerA_UART_init (空)

TACCTL0 = OUT;//将 TXD 空闲设置为 Mark ='1'
TACCTL1 = SCS + CM1 + CAP + CCIE;//同步、负边沿、捕捉、内部
TACTL = tassel_2 + MC_2;// SMCLK、以连续模式启动

///----------------------------------
//使用 Timer_A UART 输出一个字节
///----------------------------------
空 TimerA_UART_TX (无符号字符字节)

while (TACCTL0和 CCIE);//确保最后一个字符得到 TXd
TACCR0 = TAR;// TA 计数器的当前状态
TACCR0 += UART_TBIT;//直到第一位为止的一个位时间
TACCTL0 = OUTMOD0 + CCIE;//在 EQU0上设置 TXD、内部
txData =字节;//加载全局变量
txData |= 0x100;//向 TXData 添加标记停止位
txData <= 1;//添加空格起始位

///----------------------------------
//使用 Timer_A UART 打印一个字符串
///----------------------------------
空 TimerA_UART_PRINT (字符*字符串)

while (* string){
TimerA_UART_TX (*字符串++);


///----------------------------------
// Timer_A UART -发送中断处理程序
///----------------------------------
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector = TIMER0_A0_vector
_interrupt void Timer_A0_ISR (void)
#Elif defined (_GNU_)
void __attribute__((中断(TIMER0_A0_Vector)) Timer_A0_ISR (void)
其他
错误编译器不受支持!
#endif

静态无符号字符 txBitCnt = 10;

TACCR0 += UART_TBIT;//将偏移添加到 CCRx
if (txBitCnt = 0){//所有位 TXed?
TACCTL0 &=~CCIE;//所有位 TXed、禁用中断
txBitCnt = 10;//重新载入位计数器

否则{
if (txData & 0x01){
TACCTL0 &=~OUTMOD2;// TX 标记"1"

否则{
TACCTL0 |= OUTMOD2;// TX 空间'0'

txData >>= 1;
txBitCnt--;


///----------------------------------
// Timer_A UART -接收中断处理程序
///----------------------------------
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector = TIMER0_A1_vector
_interrupt void Timer_A1_ISR (void)
#Elif defined (_GNU_)
void __attribute__((中断(TIMER0_A1_vector)) Timer_A1_ISR (void)
其他
错误编译器不受支持!
#endif

静态无符号字符 rxBitCnt = 28;
静态无符号字符 rxData = 0;

switch (__evo_in_range (TA0IV、TA0IV_TAIFG){//使用计算出的分支
案例 TA0IV_TACCR1:// TACCR1 CCIFG - UART RX
TACCR1 += UART_TBIT;//将偏移添加到 CCRx
IF (TACCTL1和 CAP){//捕捉模式=起始位边沿
TACCTL1 &=~μ F 电容器;//将捕捉切换到比较模式
TACCR1 += UART_TBIT_DIV_2;//将 CCRx 指向 D0的中间

否则{
rxData >=1;
if (TACCTL1和 SCCI){//获取接收锁存中的等待位
rxData |= 0x80;

rxBitCnt--;
if (rxBitCnt = 0){//所有位 RXed?
rxBuffer = rxData;//存储在全局变量中
Number[i]= rxBuffer;
i++;
// rxData=0;
rxBitCnt = 8;//重新加载位计数器
TACCTL1 |= CAP;//切换比较至捕捉模式
_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//从0 (SR)中清除 LPM0位


中断;


///---------------------------------------------------------

请帮助我编辑此内容、以便我可以接收字符串流并从该字符串中提取数据。

谢谢、

Shailav

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

    RX 缓冲解决方案预计每次存储一个字符、 因此、您的代码应该被初始化以接收多个字节、并且您必须将每个字符存储在一个数组中、然后转换为所需的格式、并在接收到整个字符串后提取信息。 如果您可以使用 USCI 外设而不是计时器解决方案、则会更容易、但您目前不这样做的原因很可能是有原因的。

    此致、
    Ryan