发现潜在的错误。 当我在文本模式下启用 UART 时、使用 TX 和 Rx 回调函数实现非阻塞。 如果启用了回显模式、则只有当我有一个以某种方式操纵读取缓冲区的函数(这可能只是未定义的行为)时、回显模式才会使用 UART_WRITE 向终端打印文本。 值得注意的是、当回波模式被禁用时、我的代码100%完全正常工作。 随附的是所使用的代码。 我在 RX 回调函数中为环路注释了 A。 当回波模式打开时、当使用 UART_WRITE 时、它不会打印任何内容。 当回波模式关闭时、它确实是这样。 如果回波模式打开且未注释 for loop printf 语句、则会起作用。
我想弄清楚为什么会发生这种奇怪的行为、以便我可以针对循环删除这种行为、并避免类似这样的未定义行为。
/*
* ======== empty.c ========
*/
/* For usleep() */
#include <unistd.h>
#include <stdint.h>
#include <stddef.h>
#include <stdio.h>
#include <string.h>
/* Driver Header files */
#include <ti/drivers/GPIO.h>
// #include <ti/drivers/I2C.h>
// #include <ti/drivers/SPI.h>
#include <ti/drivers/UART.h>
// #include <ti/drivers/Watchdog.h>
/* Driver configuration */
#include "ti_drivers_config.h"
#define MAX_CLI_LENGTH (8)
unsigned char rxBuffer[MAX_CLI_LENGTH];
/*
* ======== mainThread ========
*/
void txCallback(UART_Handle handle, char *buf, size_t count) {}
void rxCallback(UART_Handle handle, char *buf, size_t count);
void *mainThread(void *arg0)
{
const char echoPrompt[] = "Echoing characters:\r\n";
UART_Handle uart;
UART_Params uartParams;
/* 1 second delay */
uint32_t time = 1;
/* Call driver init functions */
GPIO_init();
// I2C_init();
// SPI_init();
UART_init();
// Watchdog_init();
/* Configure the LED pin */
GPIO_setConfig(CONFIG_GPIO_LED_0, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
/* Turn on user LED */
GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_ON);
/* Create a UART with data processing off. */
UART_Params_init(&uartParams);
uartParams.baudRate = 115200;
uartParams.readEcho = UART_ECHO_ON;
uartParams.readMode = UART_MODE_CALLBACK;
uartParams.readDataMode = UART_DATA_TEXT;
uartParams.readReturnMode = UART_RETURN_NEWLINE;
uartParams.readCallback = (UART_Callback)&rxCallback;
uartParams.writeDataMode = UART_DATA_TEXT;
uartParams.writeMode = UART_MODE_CALLBACK;
uartParams.writeCallback = (UART_Callback)&txCallback;
uart = UART_open(CONFIG_UART_0, &uartParams);
if (uart == NULL) {
/* UART_open() failed */
while (1);
}
UART_write(uart, echoPrompt, sizeof(echoPrompt));
UART_read(uart,&rxBuffer,sizeof(rxBuffer));
while (1) {
sleep(time);
GPIO_toggle(CONFIG_GPIO_LED_0);
}
}
void rxCallback(UART_Handle handle, char *buf, size_t count) {
// printf("Read %i = ", count);
// int i;
// for(i = 0; i < MAX_CLI_LENGTH; i++) {
// printf("%d ", (int)(*((buf + i))));
// }
char infoMSG[] = "NOT A VALID COMMAND\r\n";
UART_write(handle, infoMSG, sizeof(infoMSG));
UART_read(handle,buf,MAX_CLI_LENGTH);
}