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/CC1352R:UART2_WRITE 在阻塞模式下不等待传输

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/951513/ccs-cc1352r-uart2_write-not-waiting-for-transmission-in-blocking-mode

器件型号:CC1352R

工具/软件:Code Composer Studio 、SDK 4_30_00_54

您好!

我使用 UART2模块在 RS485接口上工作。 作为 RS485驱动器、我使用 TD331S485H-E 微电路。 微电路有一个控制引脚- CON (程序中为 CONFIG_GPIO_485_DIR)、如果它为1、则 RX 工作、如果为0、则 TX 工作。


程序代码如下:
//…
/*在回调读取模式下创建 UART */
UART2_Params_init (& uartParams);
uartParams.readMode = UART2_Mode_callback;
uartParams.readCallback = callbackFxnR;
uartParams.baudrate = 115200;

UART = UART2_open (CONFIG_UART2_0和 uartParams);

if (UART == NULL){
/* UART2_open ()失败*/
while (1);
}
//
/*循环永久回显*/
while (1){
numBytesRead = 0;

/*传递字节为空,因为它未在本示例中使用*/
GPIO_WRITE (CONFIG_GPIO_485_DIR、1);
STATUS = UART2_READ (UART、&输入[0]、10、NULL);
如果(状态! = UART2_STATUS_SUCCESS){
/* UART2_READ ()失败*/
while (1);
}

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

if (numBytesRad>0){
//... 用数据填充255字节输入缓冲区

GPIO_WRITE (CONFIG_GPIO_485_DIR、0);

STATUS = UART2_WRITE (UART、& INPUT [0]、255和 numBytesWritten);

如果(状态! = UART2_STATUS_SUCCESS){
/* UART2_WRITE ()失败*/
while (1);
}
}
}

/*
*==== callbackFxnR ===
*/
void callbackFxnR (UART2_Handle handle、void * buffer、size_t count、
void * userArg, int_fast16_t status)
{
如果(状态! = UART2_STATUS_SUCCESS){
/* UART2_READ ()中发生 RX 错误*/
while (1);
}

numBytesRead = count;
SEM_post (& SEM);
}

在回调模式下读取 UART、在阻塞模式下写入。
问题如下:执行 UART2_WRITE 后、程序进入 while (1)循环的开头、CON 输入切换为使用命令"GPIO_WRITE (CONFIG_GPIO_485_DIR、1)"接收数据、我们看到 UART 实际传输的数据约为191字节、而不是255字节。 结果是、在传输完所有数据之前执行从函数退出。 如果在执行 UART2_WRITE 后出现延迟、例如睡眠(2)、则将传输所有数据。 从这个结论中、我认为在传输所有数据之前执行 UART2_WRITE 返回。

如何解决此问题?

P.S.  如果在回调模式下使用写入、结果是相同的-在传输所有数据之前执行回调。

谢谢!

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

    你好 Alex

    我不熟悉您使用的硬件(TD331S485H-E)、因此不确定这会对事物产生什么影响。

    我建议您首先检查是否可以向串行会话发送和接收所需的内容(例如 PuTTY,等等)。

    我修改了 SDK 中的 UART2_Echo 示例、为收到的每个字节传输250个字节、效果很好。

    BR

    Siri

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

    你(们)好  

    Siri、

    我想我明白原因是什么。 从 UART2_WRITE 函数退出在 DMA 传输工作结束前执行。 我是如何确定的? 我在 UART2_WRITE 之后放置一个断点、在 PuTTy 中、我看到并非所有数据都已传输。 如果您在调试中再执行一个步骤、那么在 PuTTy 中、我们会看到所有数据。 如何跟踪 DMA 完成工作的时间?

    谢谢!

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

    你好 Alex

    根据 DMA TX 操作何时完成、但在 EOT 中断触发之前、驱动程序释放写入信标似乎存在一个问题。

    这已被报告为驱动程序团队的错误。

    温度。 解决方法您可以尝试在 UART2_WRITE 之后添加 Task_sleep

    BR

    Siri