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.

[参考译文] LAUNCHCC3235MOD:处于非阻塞模式的 UART 无法进行回调

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1164865/launchcc3235mod-uart-in-non-blocking-mode-not-getting-callback

器件型号:LAUNCHCC3235MOD
Thread 中讨论的其他器件:SysConfig

我使用的是 simpleLink SDK 版本4.10

我在非阻塞模式下使用的 UART 端口初始化如下:

UART_Handle InitTerm (void)

  UART_Params uartParams;
  int32_t semStatus;

  /*创建信标*/
  semStatus = SEM_INIT (&SEM、0、0);

  if (semStatus!= 0){
  /*创建信标时出错*/
  while (1);
  }

  UART_INIT();
  UART_PARAMS_INIT (uartParams);

  uartParams.writeDataMode = UART_DATA_BINARY;
  uartParams.readDataMode = UART_DATA_BINARY;
  uartParams.readMode = UART_MODE_CALLACK;
  uartParams.readTimeout = 1000;
  uartParams.readCallback = callbackFxn;
  uartParams.baudrate = 115200;

  uartHandle = UART_open (CONFIG_UART_0、uartParams);
  IF (uartHandle)
   GPIO_WRITE (CONFIG_GPIO_LED_0、CONFIG_GPIO_LED_ON);
  /*从 LPDS 依赖项中删除 UART 接收*/
  UART_CONTROL (uartHandle、UART_CMD_RXDISABLE、空);

  return (uartHandle);

回调函数如下定义:

void callbackFxn (UART_Handle handle、void * buffer、size_t count、
                       void * userArg, int_fast16_t status)

  if (status!= UART_STATUS_SUCCESS){
  /* UART2_READ()中出现 RX 错误*/
  while (1);
  }

  numBytesRead = count;
  SEM_post (&SEM);

我正在尝试使用如下所示的读取函数接收数据:

int GetRawCmd (char * pcBuffer、unsigned int uiBufLen)

  char cChar;
  buffint index = 0;
  uint32_t status = UART_STATUS_SUCCESS;

  while (1){
    numBytesRead = 0;

    /*对 bytesRead 传递 NULL,因为它未在本示例中使用*/
    状态= UART_READ (uartHandle、&cChar、1);

    display_printf (display、0、0、"out of ready\r\n");

    if (status!= UART_STATUS_SUCCESS){
      /* UART_READ()失败*/
      display_printf (display、0、0、"read failed\r\n");
      while (1);
    }

    display_printf (display、0、0、"正在等待回叫\r\n);

    /*在执行读回调之前不要写入*/
    SEM_WAIT (SEM);

    display_printf (display、0、0、"callback recv\r\n");

    if ((cChar ='\r')||(cChar ='\n')){
      pcBuffer[buffindex]='\0';
      中断;
    }否则{
      pcBuffer[buffindex]= cChar;
     buffindex++;
   }
  }

  返回 buffindex;

我正在使用第二个 UART 端口来执行调试语句。 将显示以下调试语句:

读数不正确

正在等待回调

未接收到进一步的调试语句。 这意味着它一直在等待在回调函数中释放的信标。 即使 我从 PC 上的 Tera Term 发送了字符、也不会接收回调、我正在使用 USB 转串行转换器将第二个 UART 端口连接到 PC。 如果我使用阻塞 UART 模式、此设置功能正常。

请帮助进行调试、以了解为何未收到回调函数。

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

    您好!

    使用  UART_CONTROL (uartHandle、UART_CMD_RXDISABLE、NULL)会出现问题、因为它允许 ELP 并禁用所有中断。

    这就是您可能无法获得回调中断的原因。

    请在 https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1049642/cc3220sf-what-is-uart_control-uarthandle-uart_cmd_rxdisable-null-in-demo-code-at_commands?tisearch=e2e-sitesearch&keymatch=UART_CMD_RXDISABLE#上查看带说明的主题

    此致、

    Shlomi

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

    您好!

    我删除 了 UART_CONTROL (uartHandle、UART_CMD_RXDISABLE、NULL); 从程序中仍然有相同的响应、即它卡在 GetRawCmd ()的 SEM_WAIT (&SEM)中;

    我有疑问:

    1.当 UART_Read (uartHandle、&cChar、1)时;由于 UART 端口上没有输入、因此在设置超时后输出、那么我们是否会接收回调?

    2.我已将超时值设置为 uartParams.readTimeout = 1000; 我不确定是以微秒还是毫秒为单位取值1000?  

    谢谢、

    Pradeep

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

    您好!

    有关超时单位 https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/648684/cc3220-simplelink-sdk-uart_params-readtimeout、请参阅此主题

    我需要进一步研究它为什么不起作用。 您是否在项目中使用了两个 UART 接口?

    此致、

    Shlomi

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

    感谢提供超时单元的链接。

    是的、我在项目中使用两个 UART 端口。  

    我正在使用 simplesample_http 示例工程并更新相同的工程以使用另一个 UART 端口。  

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

    您好!

    我认为您的问题可能与读回模式有关。

    正如您在调用  UART_Params_init (&uartParams)时在默认值上看到的那样、这些值为:

    const UART_Params UART_defaultParams ={
    UART_MODE_BLOCKING、/* readMode *
    UART_MODE_BLOCKING、/* writeMode */
    UART_WAIT_FOREVY、/* readTimeout */
    UART_WAIT_FOREVE、/* writeTimeout */
    空,/* readCallback */
    空、/* writeCallback */
    UART_RETURE_NEWLINE、/* readReturnMode *
    UART_DATA_TEXT、/* readDataMode *
    UART_DATA_TEXT、/* writeDataMode *
    UART_ECHO_ON、/* readEcho */
    115200、/*波特率*/
    UART_LEN_8、/* dataLength */
    UART_STOP_ONE、/* STOPBITS */
    UART_PAR_NONE、/* parityType */
    空/*自定义*/
    };

    这意味着您将仅在 UART_RETURE_NEWLINE 上获得回调。

    您能否更改为: uartParams.readDataMode = UART_DATA_BINARY;

    此致、

    Shlomi

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

    修复了我的最后一个响应、我意味着更改 readReturnMode。

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

    您好!

    我曾尝试过、但它再次 在 GetRawCmd()函数中的"SEM_WAIT (&SEM);"等待、这意味着没有调用回调函数。 我在这里有疑问:

    UART_READ()函数在超时后输出、因为未从另一侧接收到数据。 在这种情况下、我们是否仍然可以调用回调函数?  

    如果不是、则在等待 SEM_WAIT (&SEM)方面没有意义;因为不调用回调时、SEM_POST (&SEM)永远不会发生。

    考虑到这一点、我注释掉了 SEM_WAIT (&SEM)并检查了是否(numbytesread = 0)、如果是、则 返回到 UART_READ()。 但当我第二次调用 UART_read()时,它返回 UART_STATUS_FAILED。

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

    您好!

    这里似乎有些混淆。

    您的 syscfg 文件是什么样的?

    您提到您正在使用两个 UART 接口。

    在代码段中配置的  代码类型为 UART_Params、此结构中的回调类型为:

    void callbackFxn (UART_Handle handle、void * buffer、size_t count、
                           void * userArg, int_fast16_t status)

    这是没有意义的、因为在 UART_Params 下 、readCallback 是 UART_Callback 类型 、即:

    void (* UART_Callback)(UART_Handle handle、void * buf、size_t count);

    它甚至是如何编译的?

    Shlomi

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

    您好!

    附件是我的 syscfg 文件。  

    我按照您指示的方式更改了 UART 回调函数。 它还会进行编译、但不会接收回调。

    我正在使用 simpleLink SDK 版本4.10、这是否与 UART 回调函数的格式有任何连接?

    我还注意到 syscfg 文件具有输入"Error callback function name"的选项。 我也尝试过这种方法、但没有成功。 我们是否必须输入此名称? 如果是、它应该是诸如 callbackfxn 之类的函数名称还是诸如 void (* UART_Callback)之类的完整格式(UART_Handle handle、void * buf、size_t count);?

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

    您好!

    SDK 版本4.10非常旧、但我认为这不是您的问题。

    也未附加 SysConfig 文件。

    无论如何、还是使用 UART 或 UART2都令人困惑。

    我的建议是:

    • 如果您使用的是 UART2、SDK 中有一个名为 uart2callback 的示例。 我检查了它、它正常工作(在回调中放置了一个断点、它在那里停止)。
    • 如果您使用的是 UART、则没有回调示例。 因此、我基于 uart2callback 创建了相同的内容并进行了测试。
      您可以找到附加的 uartcallback.c 和 SysConfig 文件。

    此致、

    Shlomi

    e2e.ti.com/.../uartcallback.syscfg

    e2e.ti.com/.../uartcallback.c

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

    您好!

    如何附加文件? 上次拖放时、似乎没有连接。

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

    您好!

    让我再次尝试解释问题:

    我正在使用 simplesample_http 示例。 这是使用 FreeRTOS 实现的。 例如、我有一个任务、它接受硬编码数据并发送到物联网集线器。 直到这一切正常。

    现在、我介绍了第二个任务、它从 UART 端口获取输入数据、并将通过简单的任务共享相同的数据、以将数据发送到物联网集线器。 因此、我现在不发送硬编码数据、而是发送从 UART 端口接收到的数据。

    在我的第二个任务中,UART_Read() 阻止任务,它还阻止 simplesample 任务。 因此、我无法从物联网集线器接收任何数据。 因此、对于 UART 配置、我将设置回调模式、以便它不会阻止任务。 但是、由于回调模式中的默认超时为0、它仍然会阻止任务。 因此、我尝试将超时设置为1000。 在本例中,UART_READ()发出并等待信号量,该信号量再次阻止这两个任务。

    我希望接收到 UART 回调、即使由于超时而出现 UART_READ()也是如此。 这是正确的期望吗?  

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

    您好!

    您能进一步指导我解决上述问题吗?

    谢谢、

    Pradeep

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

    您好!

    很抱歉、我不在办公室。

    不确定为什么回调不适合您、但我的代码片段在我的末尾起作用

    无论如何、对于读取超时、它用于阻塞模式、而不是回调模式。 这就是它不工作的原因。

    作为回调模式的权变措施、您可以使用具有低超时的阻塞模式、这样 API 就不会被完全阻止、并查看它是否适合您。

    此致、

    Shlomi