当修改 uart2callback 示例以接收多个 char 时、即使在 UART 缓冲区中接收到数据、也并不总是获得回调。
我在接收到第一个数据时得到一个回调、但当我 再次调用 UART2_READ 时、我没有获得剩余数据的任何回调。
何时调用回调?
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.
当修改 uart2callback 示例以接收多个 char 时、即使在 UART 缓冲区中接收到数据、也并不总是获得回调。
我在接收到第一个数据时得到一个回调、但当我 再次调用 UART2_READ 时、我没有获得剩余数据的任何回调。
何时调用回调?
如果不知道您对示例所做的确切更改、就很难解释您看到了什么。
我举个例子、改变了
状态= UART2_READ (UART、&INPUT、1、NULL);
至
状态= UART2_READ (UART、&INPUT、3、NULL);
应用的行为没有改变、而且我在终端程序中键入的每个字节仍然可以进行1次回调。
这正如预期的那样、因为默认情况下、
uartParams.readReturnMode = UART2_ReadReturnMode_partial;// 当没有新数据输入时进行回调
正在设置
uartParams.readReturnMode = UART2_ReadReturnMode_Full;
将导致在生成回调之前必须输入3个字节。
Br
Siri
我做了以下测试、我想我会看到您描述的问题:
UART2_Params_init(&uartParams);
uartParams.readMode = UART2_Mode_CALLBACK;
uartParams.readCallback = callbackFxn;
uartParams.baudRate = 115200;
uartParams.readReturnMode = UART2_ReadReturnMode_PARTIAL;
UART2_open(CONFIG_UART2_0, &uartParams);
while (1)
{
numBytesRead = 0;
UART2_read(uart, &input, 3, NULL);
sem_wait(&sem);
if (numBytesRead > 0)
{
UART2_write(uart, &input, numBytesRead, NULL);
}
}
void callbackFxn(UART2_Handle handle, void *buffer, size_t count, void *userArg, int_fast16_t status)
{
if (status != UART2_STATUS_SUCCESS)
{
/* RX error occured in UART2_read() */
while (1) {}
}
numBytesRead = count;
interrupts++;
sem_post(&sem);
}
假设我在等待信号量后运行代码并设置断点。
‘输入一个单个字符'A'、由于 readReturnMode = UART2_ReadReturnMode_partial、我将获得回调 。
‘A’存储在输入中,然后打印回。

‘我然后在"CHAR"之前输入第二个"CHAR" UART2_READ 被‘、'DB'被存储在输入中、但是不生成新的回调。

这是在‘第三个 char 'C'被输入前不会发生的。

我向研发团队咨询并得到了以下反馈:
"这是一个非常特殊的边缘情形,对于代码目前的编写方式是可以预料的。 以部分模式从 UART2_READ 返回的条件是
a)所有请求的字节均可用、或
b)接收到一些字节、然后发生超时。
但是,驱动程序仅检查这些条件* 之后 *对 UART2_READ 的调用,意味着过去发生的超时无效。
该驱动程序从内部环缓冲器(char‘B')读取可以读取的值、然后开始等待返回条件变为真。
有多种方法可以解决这个问题、
第一种方法是最初以何种方式编写示例。
我测试了方法2、 在按下按钮时调用了 UART2_readCancel。
如果我在上面的测试用例中执行此操作、在环形缓冲器中收到 B 后、我会得到回调函数、并打印 B。
对于该"解决方案"、 除了 UART2_STATUS_SUCCESS 之外、您还需要修改回调以检查 UART2_STATUS_ECANCELED
Br
Siri
这是我看到的问题。
在实现中、我将 UART 用于与调制解调器通信、此"边沿便携包"始终可用。
一次读取一个字节将会极大地限制吞吐量、并且会产生一个回调/字节的巨大开销。
取消读取操作主要是轮询 UART、我看不到使用 UART2_Mode_callback 而不是 UART2_Mode_Blocking 的增益。
对于如何以非阻塞的方式读取未知数量的数据、您有什么建议吗?
Br、
Håkan