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/MSP430F5438A:在给定时间内发送多个字节

Guru**** 2540720 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/571390/ccs-msp430f5438a-send-multiple-bytes-in-a-given-time

部件号:MSP430F5438A

工具/软件:Code Composer Studio

您好,

我正在尝试创建一个简单的程序,它每秒发送3个字节('A','B'和'C')。 但问题是我只能得到第一个字节('A'),两者都没有出现。 如何解决此问题?  

这是我的代码:

#include <MSP40.0.h>

unsigned char data [3]={'A','B','C'};


void uartSend (unsigned char *pucData, unsigned char ucLength)
{
while (ucLength !=0)
{
//等待TX缓冲区为新数据做好准备
while (!(UCA1IFG和UCTXIFG));

//将数据推送到TX缓冲区
UCA0TXBUF =*pucData;

//更新变量
ucLength --;
PucData+;}//


等待直到最后一个字节完全发送
,同时(UCA0STAT & UCBUSY);

}


int main(void){

WDTCTL = WDTPW + WDTHOLD; //停止WDT
P1DIR |=0x01; // WFP 1.0 输出
TA1CCTL0 = CCIE; // CCR0中断启用
TA1CCR0 = 3.2768万-1;
TA1CTL = tassel_1 + MC_1 + TCLR; // ACLK,upmode,CLEAR TAR


// configuración UART
UCA0CTL1 |= UCSWRST; //**将状态机置于复位**
UCA0CTL1 || UCSSEL_2; // SMCLK
UCA0BR0 = 6; // 1MHz 9600 (请参阅用户指南)
UCA0BR1 = 0; // 1MHz 9600
UCA0MCTL = UCBRS_0 + UCBRF_13 + UCOS16;// Modln UCBRSx=0,UCBRFx=0,
//过度采样
	P3SEL = 0x30; // WFP 3.4 ,5 = USI_A0 TXD/RXD
UCA0CTL1 &=~UCSWRST; //**初始化USCI状态机**

__bis_sr_register (LPM3_bits + GIE); //输入LPM3,启用中断
__no_operation(); //用于调试器
}//

计时器A0中断服务例程
#if defined(__TI_Compiler_version__)|| defined(__IAR_systems_icc__)
#pragma vector=Timer1_A0_vector
__ISR void Timer1_A0_ISR_Isr void Timer1_A0_Compiler(void)#Elif
defined(__GA0__)
void_attribute___Timer__) Timer__Timer1


#endif
{
	while (!(UCA0IFG&UCTXIFG));// USI_A0 TX缓冲器就绪?
	uartSend(data,3);}



图中显示了通过UART接收的数据。

提前感谢!

此致

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

    首先将第11行中的UCA1IFG更改为UCA0IFG,然后查看是否可以解决问题。

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

    您好,Ryan:

    感谢您的快速回答。 问题在于解决您的解决方案。

    现在,我更改了UART发送功能,以便在字节之间发送分隔符,但这会产生以下警告:

    #515-D类型"char *"的值不能指派给类型为"unsigned char" abc.c /msp430x54xA_ta3_05.c行20 C/C++问题的实体

     

    如何解决? 我不理解此警告,因为我只发送一个带有分隔符“*”的新字节。

    下面的代码显示了这一点:

    unsigned int data1 [3]={10,20,30};
    unsigned int data2[3]={usid 1.002003亿
    
    uartSend( unsigned int *pucData, unsigned char ucLength)
    {while
    (ucLength !=0)
    {
    //等待TX缓冲区为新数据做好准备
    while (!(UCA0IFG和UCTXIFG));
    
    //将数据推送到TX缓冲区
    UCA0TXBUF =*pucData;
    UCA0TXBUF ="*";
    //更新变量
    ucLength --;
    PucData+;}//
    
    
    等待直到最后一个字节完全发送
    ,同时(UCA0STAT & UCBUSY);
    
    } 

    再次感谢

    此致

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

    Miguel,您好!

    请尝试单引号:'*'

    或ASCII表示:0x2A

    此致,
    Ryan

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

    您好Ryan:

    谢谢大家,我对这个愚蠢的问题感到非常抱歉。

    UART以ASCII格式发送数据是否正常? 例如,当我发送时:

    uca0txbuf=125;

    终端接收的是"{"而不是十进制数字。

    我希望收到相同的号码,这是不是可以接受的? 更改发送数据的方式?

    此致,

    米格尔

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

    您的PC终端将通过UART发送的字节解释为ASCII字符,请参阅ASCII表以更好地了解您发送或接收的内容: http://www.asciitable.com/

    如果要发送十进制数125,则必须将其拆分为3个单独的字节来发送:'1'(0x31),'2'(0x32)和'5'(0x35)。

    此致,
    Ryan