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.
工具/软件:Code Composer Studio
您好!
我构建了一个程序、尝试在 TI-RTOS 内开发读取 UART 数据和发送 UART 数据的程序。
我已经运行了 uartecho.c 演示、它运行良好、但是当我尝试将此代码放入当前的 TI-ROTS 程序时、我发送的每个字符都会返回 FF 或 FE。 某些字符返回 FF FF FE。 我不能找出这种行为的原因。
下面是主线程的代码、uarty 初始化和回波所在的空闲函数。 (我在一项任务中尝试执行此操作、但我以前无法使其正常工作)。
//***** 首页文件 // XDC 模块头文件 #include // XDC“基本类型”-必须先包括 #include // xdc.runtime pkg #include 中使用的 XDC 常量/类型 //对于在 RTOS .cfg 文件 #include 中静态创建的所有 BIOS 实例 //用于错误处理(例如错误块) #include // XDC 系统函数(例如 System_abort()、System_printf()) #include // TI-RTOS 内核头文件 #include // BIOS 模块 API #include //任务 API #include //信号量 API #include //时钟 API #include #include //标准 C 头文件 #include //标准整数类型 #include //标准变量类型和宏 //外设驱动程序头文件 #include "ti_drivers_config.h" // SYSCFG 板/驱动程序头文件 #include // TI GPIO 驱动程序头文件 #include "myGpio.h" // myGpio.c 的头文件 #include "myTimers.h" #include "myADC.h" #include "myUART.h" // *=== main ==== *//***** 原型 //***** 全局变量 Task_handle sensorRead、motorActuationDecirion、buttonPressed、uartRx; Task_Params 任务参数; Error_Block EB; UART_Handle UART; UART_Params uartParams; //***** 主循环 int main (void) { Board_init(); myGpio_init(); myTimers_init(); myADC_init(); myUart_init(); Task_Params_init (&taskParams); taskParams.priority=2; taskParams.STACKSIZE=512; // uartRx = Task_create (uartRxFxn、&taskParams、Error_IGNORE); // S_UartRX = Semaphore_create (0、NULL、Error_IGNORE); BIOS_start(); }
上面是我的主代码。 请注意、myUart_init 如下所示。
// XDC 模块头文件 #include // XDC“基本类型”-必须先包括 #include // xdc.runtime pkg #include 中使用的 XDC 常量/类型 //对于在 RTOS .cfg 文件 #include 中静态创建的所有 BIOS 实例 //用于错误处理(例如错误块) #include // XDC 系统函数(例如 System_abort()、System_printf()) #include #include #include /*驱动程序头文件*/ #include #include /*驱动程序配置*/ #include "ti_drivers_config.h" //***变量********* // extern UART_Handle UART; extern UART_Params uartParams; extern const char echoPrompt[]; unsigned char rxBuffer; void myUart_init (){ UART_INIT(); UART_PARAMS_INIT (uartParams); uartParams.writeDataMode = UART_DATA_BINARY; uartParams.readDataMode = UART_DATA_BINARY; uartParams.readReturnMode = UART_return_full; uartParams.readEcho = UART_ECHO_OFF; uartParams.baudrate = 115200; UART = UART_OPEN (CONFIG_UART_0、uartParams); //uart_write (UART、echoPrompt、sizeof (echoPrompt));//注意如果我取消注释,整个程序将中断。 }
最后、我的空闲函数代码位于 UART 读取和写入的位置下面。
// XDC 模块头文件 #include // XDC“基本类型”-必须先包括 #include // xdc.runtime pkg #include 中使用的 XDC 常量/类型 //对于在 RTOS .cfg 文件 #include 中静态创建的所有 BIOS 实例 //用于错误处理(例如错误块) #include // XDC 系统函数(例如 System_abort()、System_printf()) #include // TI-RTOS 内核头文件 #include // BIOS 模块 API #include //标准 C 头文件 #include //标准整数类型 #include //标准变量类型和宏 //外设驱动程序头文件 #include #include "ti_drivers_config.h" // SYSCFG 板/驱动程序头文件 #include // TI GPIO 驱动程序头文件 #include "myGpio.h" #include char rxUART; extern UART_Handle UART; extern UART_Params uartParams; const char echoPrompt[]="回显字符:\r\n"; void myIdleFxn (void) { UART_WRITE (UART、echoPrompt、sizeof (echoPrompt));//这不起作用! UART 上没有显示任何数据。 while (1){ UART_READ (UART、&rxUART、1);//rxUART 的 Loginfo 此处显示127。 UART_WRITE (UART、&rxUART、1); } }
请提供任何帮助。
尊敬的 Adam:
我不建议使用空闲函数在 UART 上进行传输。 呼叫可以被阻止、这意味着空闲任务被阻止。 您能否尝试改用较低优先级的任务。
Todd
谢谢 Todd、
我已经尝试过这种方法、但遇到了相同的问题。 当我运行示例时、代码工作正常、但是当我创建一个线程时、代码不起作用。 这是我的主题:
void * uartrx (void * arg0) { 特性 输入; const char echoPrompt[]="回显字符:\r\n"; UART_Handle UART; UART_Params uartParams; UART_INIT(); /*创建一个数据处理关闭的 UART。 * UART_PARAMS_INIT (uartParams); uartParams.writeDataMode = UART_DATA_BINARY; uartParams.readDataMode = UART_DATA_BINARY; uartParams.readReturnMode = UART_return_full; uartParams.readEcho = UART_ECHO_OFF; uartParams.baudrate = 115200; UART = UART_OPEN (CONFIG_UART_0、uartParams); if (UART == NULL){ /* UART_open()失败*/ while (1); } UART_WRITE (UART、echoPrompt、sizeof (echoPrompt)); /*循环永久回显*/ while (1){ UART_READ (UART、INPUT、1); UART_WRITE (UART、INPUT、1); } }
我调用此线程、其优先级高于任何其他值、并且它不返回输入的值。 它也无法正确写入回声波、它会给我一个完全错误的值。
您是否在多个任务中使用相同的 UART?
另一次尝试创建与其他线程更内联的线程的尝试使情况更糟。
//Main.c uartRx = Task_create (uartRxFxn、&taskParams、Error_IGNORE); //myUart.c void uartRxFxn (UArg a0、UArg A1) { UART_INIT(); /*创建一个数据处理关闭的 UART。 * UART_PARAMS_INIT (uartParams); uartParams.writeDataMode = UART_DATA_TEXT; uartParams.readDataMode = UART_DATA_TEXT; uartParams.readReturnMode = UART_return_full; uartParams.readEcho = UART_ECHO_OFF; uartParams.baudrate = 115200; UART = UART_OPEN (CONFIG_UART_0、uartParams); if (UART == NULL){ /* UART_open()失败*/ while (1); } UART_WRITE (UART、&echoPrompt、sizeof (echoPrompt)); /*循环永久回显*/ while (1){ UART_READ (UART、INPUT、sizeof (INPUT)); UART_WRITE (UART、INPUT、sizeof (INPUT)); } }
下面是 uartRx fucntion 如何捕获 RTOS 的屏幕截图。 我不确定为什么会发生这种情况。 整个过程都会冻结。
Edit (编辑):通过增大堆栈大小来解决此问题,但最初指出的问题仍然存在。
由于线程堆栈大小不同、第二次尝试出现了不同的问题、当我将堆栈大小设置为1024时、问题是相同的。
解决方案、将波特率降至9600、并在 SYSCFG 中将时钟切换到 ACLK。
Adam、
这里是一个后续行动。 当大量数据被回显到此线程时,它将经常被唤醒,以便在 UART_READ()和 UART_write()之间切换。
降低波特率使您可以降低发生这种情况的频率、因为您以低速率接收字节、因此该线程不会经常被阻止。
此致、
Derrick