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.

[参考译文] TMS570LC4357:使用 SCI 的传输和接收

Guru**** 2386620 points
Other Parts Discussed in Thread: TMDX570LC43HDK, HALCOGEN, TMS570LC4357
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1072877/tms570lc4357-transmission-and-reception-using-sci

部件号:TMS570LC4357
“线程”中讨论的其他部件:TMDX570LC43HDKHALCOGEN

大家好,团队

我想通过 SCI 使用 Hercules Eval 板(TMDX570LC43HDK)传输和接收消息。 我能够通过代码传输所需的字符串。 但是,收到的信息存在一些问题。 下图显示了我希望通过代码实现的目标的流程图。 此外,还附加了终端快照。

下面是我的代码片段。 请帮我解决我的问题吗?

 

/* USER CODE BEGIN (0) */
#include "HL_sci.h"
/* USER CODE END */

/* Include Files */

#include "HL_sys_common.h"

/* USER CODE BEGIN (1) */
static unsigned char command;
/* USER CODE END */

/** @fn void main(void)
*   @brief Application main function
*   @note This function is empty by default.
*
*   This function is called after startup.
*   The user can use this function to implement the application.
*/

/* USER CODE BEGIN (2) */
/* USER CODE END */

char text_send[]="Are you there??\n\r";
char resp1_send[]="Yeah!!!\n\r";
char resp2_send[]="Nope!!!\n\r";
//char text_recv[4]="\0";
char *text_recv;
char y[] = "yeah";
char n[] = "nope";

void main(void)
{
/* USER CODE BEGIN (3) */
    _enable_IRQ();

    sciInit();
    while(1)
    {
        sciSend(sciREG1, strlen(text_send), text_send);

        sciReceive(sciREG1, 4, *text_recv);
        command = strcmp(*text_recv, y);
        if (command == 1)
            //printf("Input is %s", y);
            sciSend(sciREG1, strlen(resp1_send), resp1_send);
        else
            //printf("Input is Nope");
            sciSend(sciREG1, strlen(resp2_send), resp2_send);
    }
/* USER CODE END */

}

/* USER CODE BEGIN (4) */
void sciNotification(sciBASE_t *sci, uint32 flags)
{
    sciSend(sci, 1, (unsigned char *)&command);
    sciReceive(sci, 1, (unsigned char *)&command);
}

void esmGroup1Notification(int bit)
{
    return;
}

void esmGroup2Notification(int bit)
{
    return;
}

/* USER CODE END */
 

我所面临的同一条线上的另一个查询是发送计数器值。 我已经编写了一个代码来传输计数器值。 计数器初始化时的值为0,然后递增至10000。 计数器达到10000后,它将重置为0。 整个过程无限重复。 但是,问题在于终端程序(Putty)上看不到传输。 相同的代码片段如下所示。 请也帮我解决这个问题吗?

/* USER CODE BEGIN (0) */
#include "HL_sci.h"
/* USER CODE END */
/* Include Files */
#include "HL_sys_common.h"
/* USER CODE BEGIN (1) */
/* USER CODE END */
/* USER CODE BEGIN (2) */
/* USER CODE END */

void main(void)
{
/* USER CODE BEGIN (3) */
    sciInit();
    unsigned long int counter1 = 0;
    while(1)
    {
        while (counter1 <10000)
        {
            while(sciIsTxReady(sciREG1) != 0)
            {
                sciSendByte(sciREG1, char(counter1));
            }
        }
        counter1 = 0;
    }
/* USER CODE END */
}

/* USER CODE BEGIN (4) */
/* USER CODE END */
 

谢谢!

H C 特里维迪

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

    您好,

    1.我建议对 SCI 接收使用中断模式

    2.终端(Putty)是否具有相同的 SCI 设置?  

    我没有看到任何关于增加反1的指令,也不认为“char (反1)”是正确的。  -->正确的一个是(char)(counter1++)

    请尝试 HALCOGen 帮助中的 SCI 示例代码

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

    感谢王的及时回应。 我可以在这方面取得一些进展。 请在下面找到我的代码片段。

    /* USER CODE BEGIN (0) */
    #include "HL_sci.h"
    /* USER CODE END */
    
    /* Include Files */
    
    #include "HL_sys_common.h"
    
    /* USER CODE BEGIN (1) */
    char text_send[] = "Are you there?? \n \r";
    char resp1_send[] = "Yes, I'm!! \n \r";
    char resp2_send[] = "Nope, I'm not!! \n \r";
    static unsigned char command;
    unsigned int * data1;
    static int count1 = 0;
    /* USER CODE END */
    
    /** @fn void main(void)
    *   @brief Application main function
    *   @note This function is empty by default.
    *
    *   This function is called after startup.
    *   The user can use this function to implement the application.
    */
    
    /* USER CODE BEGIN (2) */
    /* USER CODE END */
    
    int main(void)
    {
    /* USER CODE BEGIN (3) */
        _enable_IRQ();
    
        sciInit();
        sciSend(sciREG1, strlen(text_send), text_send);
        //sciSend(sciREG1, 21, (unsigned char *)"Please press a key!! \r\n");
        //sciReceive(sciREG1, 1, (unsigned char *)&command);
        sciReceive(sciREG1, 4, &data1);
    
        while(1);
    
    /* USER CODE END */
    
        return 0;
    }
    
    
    /* USER CODE BEGIN (4) */
    void sciNotification(sciBASE_t *sci, uint32 flags)
    {
    
        /*if (command == 'y')
            //printf("Input is %s", y);
            sciSend(sciREG1, strlen(resp1_send), resp1_send);
        else if (command == 'n')
            sciSend(sciREG1, strlen(resp2_send), resp2_send);
        else
            //printf("Input is Nope");
            //sciSend(sciREG1, strlen(resp2_send), resp2_send);
            //sciSend(sci, 1, (unsigned char *) &command);
            sciSend(sci, 4, count1);
    
        count1++;*/
    
    
        if (strcmp(*data1, "yeah"))
            //printf("Input is %s", y);
            sciSend(sciREG1, strlen(resp1_send), resp1_send);
        else if (strcmp(*data1, "nope"))
            sciSend(sciREG1, strlen(resp2_send), resp2_send);
        else
            //printf("Input is Nope");
            //sciSend(sciREG1, strlen(resp2_send), resp2_send);
            //sciSend(sci, 1, (unsigned char *) &command);
            sciSend(sciREG1, strlen(*data1), *data1);
    
        sciSend(sciREG1, strlen(*data1), *data1);
        sciReceive(sci, 1, (unsigned char *) &command);
    }
    
    void esmGroup1Notification(int bit)
    {
        return;
    }
    
    void esmGroup2Notification(int bit)
    {
        return;
    }
    /* USER CODE END */
    

    我可以使用中断来接收数据。 根据我的询问所取得的进展如下:

    1. 我现在可以接收数据。
    2. 使用收到的数据,我可以执行所需的命令。

    但是,根据我以前的询问,我一直面临两个问题:

    1. 我仍然无法通过 UART 发送计数器值。
    2. 我无法接收和处理字符串输入。例如,如果您查看提供的代码片段,我可以接收单个字符并处理相同的字符(在代码中注释)。但是,当我定义整数指针并使用接收器时, 我无法以类似的方式继续。 请看一下并分享您的想法吗? 基本上,我想做的事情与我在上面第2点提到的一样,但我想用字符串代替字符串。

    谢谢,

    H C 特里维迪

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

    您好,

    要打印数字,需要先使用 ASCII 表将数字转换为字符串或字符。 我为您写了一篇函数作为参考:

    void UART_send32位数据(sciBASE,UINT32_t 数据)

       UINT8_t c_get;
       挥发性 int i = 0;
       (i = 8;i > 0;i-)
       {
         C_GET =(数据>> 28)和15;
         如果(c_get > 9)
            c_get +=7;
         c_get +=48;

         当(((sci->FLR & SCI_TX_INT)==0){/*等待*/};
         SCI ->TD = c_get;
         数据=数据<4;
       }
    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="488031" url="~ë/support/icls/arm-based 微处理器-组/基于 ARM 的微处理器/f/基于 ARM 的微控制器- forum/1072877/tms570lc4357 -传输和接收-使用-sci/3971680#3971680]您可以查看并分享您的想法吗? 基本上,我想做的事情与我在上面第2点提到的一样,但我想用字符串代替字符串。

    C 中的字符串是字符数组,后跟 NULL 终止符。 您可以将收到的字符数组“comman []”复制到字符串:

    strncpy (字符串,命令,10); //10是数组命令的大小  

    字符串[10]=“\0”;

    Web 中有许多用于将数字转换为字符串或将字符串转换为数字的示例代码。   

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

    感谢王的及时回应。 我正在研究您建议的解决方法,稍后我会再与您讨论。

    此致,

    H C 特里维迪