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/CC2652RB:CC2652RB

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/925840/ccs-cc2652rb-cc2652rb

器件型号:CC2652RB

工具/软件:Code Composer Studio

大家好、

 我在开发板上运行项目0、并且遇到了 UART RX INT 问题

 

 

这是设置

初始化时:

   UART_INIT();

   //初始化 UART 参数
   UART_PARAMS_INIT (&Bottom_COM_PARAMS);
   Bottom_Params.baudrate = c_top_Budrate;
   Bottom_Params.readMode = UART_MODE_CALLBACK;       //UART_MODE_BLOCKING
   Bottom_Params.writeMode = UART_MODE_CALLBACK;
   Bottom_Params.readTimeout = UART_WAIT_FOREVER;       //UART_WAIT_FOREVER;
   Bottom_Params.writeTimeout = UART_WAIT_FOREVE;
   Bottom_Params.writeCallback =发送字节;
   Bottom_Params.readCallback = Byte_Received;
   Bottom_Params.readDataMode = UART_DATA_BINARY;
   Bottom_Params.writeDataMode = UART_DATA_BINARY;
   Bottom_Params.readReturnMode = UART_return_full;

  //打开 UART

   Bottom_handle = UART_OPEN (Bottom_UART、&Bottom_COM_PARAMS);

  prx =&RX_Buffer[0];
   bytes_received = 1;
   UART_READ (Bottom_com_handle、prx、bytes_received);

在 RX 回叫中、超时计时器启动、该计时器设置一个标志、指示数据已接收

void RXTimeout (UARg ID){
   TIMEOUT_ON = false;
   RX_Received = true;
}


void Byte_received (UART_Handle handl、void *buf、size_t count){
   //设置和启动 COM 超时计时器
   if (Timeout_on =false){
       Util_startClock ((Clock_Structt *) TimeOutHandle);
       TIMEOUT_ON = true;
   }
}

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

此设置非常适合 TX INT、我在 X 缓冲区中放置一个字节、它将被传输、在 TX int 中它将获得下一个字节... 等等。

 

RX INT 有问题

设置

   bytes_received  到0不会设置 INT,调用函数 Byte_Received()永远不会被调用!

----

   bytes_received 更改为1设置 INT,调用回调函数 Byte_received()!

但是、当涉及到时   

      ReceivedFromUART = UART_READ (Bottom_COM_Handle、prx、i);

第一个字节丢失了?!!!  ReceivedFromUART 始终为0!!! 但是 prx[]缓冲区中有所有的字节,第一个字节除外

 

这是否是 UARTCC26XX.c 文件中的错误?

我不明白为什么仅使用 UARTCC26XX_READ (xxx)设置 RX INT;

 

感谢你的帮助

此致

Kurt

 

 

 

 

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

    您好、Kurtlin、

    不清楚为什么您希望设置 bytes_received 会调用中断或回调、您可以详细说明这一点吗?

    至于 UART_READ()的返回值,在回调模式下,默认返回值为0。 通过读取回调收到的实际字节数。

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

    你(们)好、M-W

      很抱歉,有点误解,Byte_Received()不调用只启用它的 INT。

    我的印象是、如果接收到一个字节、则调用回调函数(使用.readCallback 设置)。  

    如所示

    警告在 UART_MODE_CALLACK 中,不要从其自身的回调函数调用 UART_READ() 。

    我在回调函数中设置一个标志、以通知主循环。 在主循环中、我读取接收到的字节。

    正如我在之前的帖子中提到的,我必须调用 UART_read()函数来启用 INT (大小必须至少为1!),如果未调用该函数,则缓冲区永远不会被传入的数据填满!

    对 UART_read()的调用会使缓冲区混乱-接收到的字节在那里,但顺序会混乱(看起来像循环缓冲区)。  

    感谢你的帮助

    此致

    Kurt

     

     

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

    您好、Kurt、

    只要您考虑它可能产生的结果(例如嵌套回调)、就应该能够从回调内部调用 UART_Read。 从第一次调用 UART_READ 直到您明确取消它(或存在帧错误)、RX 模块将保持开启状态。 这意味着 UART 硬件在后台持续接收。 该驱动器具有内部环形缓冲器、用于存储 UART_READ 调用之间接收到的数据。 如果一次只读出一个字节、如果接收速度比读出速度快、则很可能会对该缓冲区进行换行。

    我通常建议执行大于"1"的读取操作、而是启用驱动程序的"部分返回"行为(此页面还包含一个"连续 RX 示例):  

    https://dev.ti.com/tirex/explore/content/simplelink_cc13x2_26x2_sdk_4_20_00_35/docs/tidrivers/doxygen/html/_u_a_r_t_c_c26_x_x_8h.html