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/MSP-EXP430F5529:MSP-EXP430F5529

Guru**** 2587365 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/824668/ccs-msp-exp430f5529-msp-exp430f5529

器件型号:MSP-EXP430F5529

工具/软件:Code Composer Studio

您好,

我有一个简短的问题。 是一种 在不知道通过 UART 接收多个字节的情况下接收多个字节并重新传输所有这些字节的方法

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

    我在 main 函数中编写了以下代码、但我没有收到整个字符

    我错过了什么?

    while (1){

    unsigned char x;
    char *接收;
    unsigned int i;
    while (!(UCA0IFG&UCRXIFG));// USCI_A0 RX 缓冲器准备就绪?

    接收=(char*) malloc (x* sizeof (char));//动态分配内存*/

    (i=0;<x;i++){
    接收[i]=UCA0RXBUF;
    //免费(接收);
    }}
    while (!(UCA0IFG&UCTXIFG));{
    (i=0;<x;i++){
    UCA0TXBUF=Receive[i];}


    免费(接收);

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

    你(们)好  

    此处有两项建议:

    1.制定协议并将接收到的数据长度放在内部。

    2.使用接收中断(有关更详细的操作,请参阅  )  

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

    您好、Ali、

    您可以接收每个字节并立即传输该字节。

    /*-版权所有-、BSD_EX
    *版权所有(c) 2012、德州仪器(TI)公司
    *保留所有权利。
    *
    *
    只要
    符合以下条件*、允许以源代码和二进制形式重新分发和使用:
    *
    *源代码的重新分发必须保留上述版权
    声明*、此条件列表和以下免责声明。
    *
    ***二进制形式的再发行必须在
    
    *随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
    *
    ***未经
    
    事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
    *
    *本软件由版权所有者和贡献者"按原样"提供
    *、
    
    不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
    *贡献者都不对任何直接、间接、偶然、特殊、
    *模范、 或相应的损害(包括但不限于
    *采购替代产品或服务;丧失使用、数据或利润;
    *或业务中断)、但出于任何责任理论
    、*无论是在合同中、严格责任还是由于
    使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
    、*即使已获悉可能会发生此类损坏。
    *
    ***
    *
    * MSP430代码示例免责声明
    *
    * MSP430代码示例是自包含的低级程序
    ,通常*以
    高度*简明的方式演示单个外设功能或器件功能。 为此、代码可能依赖于器件的加电默认
    值*寄存器值和时钟配置等设置、
    并且在组合多个示例中的代码时必须*小心以避免潜在的副作用
    *。 另请参阅 www.ti.com/grace 了解 GUI、并参阅 www.ti.com/msp430ware
    *了解外设配置的 API 函数库方法。
    *
    *--/版权--*
    //*********
    // MSP430F552x 演示- USCI_A0、115200 UART Echo ISR、DCO SMCLK
    //
    说明:回显接收到的字符、使用 RX ISR。 正常模式为 LPM0。
    // USCI_A0 RX 中断触发 TX 回波。
    //带有1048576hz 的波特率分频器= 1048576/115200 =~9.1 (009h|01h)
    // ACLK = REFO =~32768Hz,MCLK = SMCLK =默认 DCO = 32 x ACLK = 1048576Hz
    //请参阅用户指南了解波特率分频器表
    //
    MSP430F552x
    // --------
    // /|\| |
    // || |
    // -|RST |
    // | |
    // | P3.3/UCA0TXD|--- >//
    | | 115200 - 8N1
    // | P3.4/UCA0RXD|<---
    //
    // Bhargavi Nisarga
    // Texas Instruments Inc.
    // 2009年4月
    //使用 CCSv4和 IAR Embedded Workbench 构建版本:4.21
    //*********
    
    #include 
    
    int main (void)
    {
    WDTCTL = WDTPW + WDTHOLD; //停止 WDT
    
    P3SEL |= BIT3+BIT4; // P3.3、4 = USCI_A0 TXD/RXD
    UCA0CTL1 |= UCSWRST; //**将状态机复位**
    UCA0CTL1 |= UCSSEL_2; // SMCLK
    UCA0BR0 = 9; // 1MHz 115200 (请参阅用户指南)
    UCA0BR1 = 0; // 1MHz 115200
    UCA0MCTL |= UCBRS_1 + UCBRF_0; //调制 UCBRSx=1、UCBRFx=0
    UCA0CTL1 &=~Ω UCSWRST; //**初始化 USCI 状态机**
    UCA0IE |= UCRXIE; //启用 USCI_A0 RX 中断
    
    __bis_SR_register (LPM0_bits + GIE); //输入 LPM0,启用中断
    _no_operation (); //对于调试
    器}
    
    //回显 RXed 字符,确认 TX 缓冲区已准备就绪#if
    defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
    #pragma vector=USCI_A0_vector
    __interrupt void USCI_A0_ISR (void)
    #Elif defined (__GNC_ISR_)(
    void
    
    )#USCI_A0 (void)(void USCI_0_A0)(void)(void)(void)#USCI_ISR (void)
    #endif
    {
    switch (__even_in_range (UCA0IV、4))
    {
    case 0:break; //向量0 -无中断
    情况2: //向量2 - RXIFG
    while (!(UCA0IFG&UCTXIFG)); // USCI_A0 TX 缓冲器就绪?
    UCA0TXBUF = UCA0RXBUF; // TX -> RXed 字符
    中断;
    案例4:中断; //向量4 - TXIFG
    默认值:break;
    }
    
    
    

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

    您好、Gary、

    我在主循环中编写了以下代码、并检查了我正确接收到的所有数据  

    while (1){

    char *接收;
    unsigned int i;

    接收=(char*) malloc (120);//动态分配内存*/
    while (!(UCA0IFG&UCRXIFG));// USCI_A0 RX 缓冲器准备就绪?

    对于(i=0;i<120;i++){
    while (!(UCA0IFG&UCRXIFG));// USCI_A0 RX 缓冲器准备就绪?
    接收[i]=UCA0RXBUF;

    但是、当我尝试重新传输我收到的数据时、代码会多次传输数据、有时会丢失字节

    发送代码如下所示

    #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
    #pragma vector=USCI_A0_Vector
    _interrupt void USCI_A0_ISR (void)
    #Elif defined (_GNU_)
    void __attribute__((中断(USCI_A0_Vector)) USCI_A0_ISR (void)
    其他
    错误编译器不受支持!
    #endif

    char * receive1;
    unsigned int n;

    Receive1 =(char*) malloc (120);//动态分配内存*/
    while (!(UCA0IFG&UCTXIFG));// USCI_A0 TX 缓冲器准备就绪?

    对于(n=0;n<120;n++){
    while (!(UCA0IFG&UCTXIFG));// USCI_A0 TX 缓冲器准备就绪?
    UCA0TXBUF=receive1[n];


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

    谢谢 Ling Zhu2