1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
前置环镜:RTT Studio基于STM32F407开发。 所以,我的问题是,如果串口1已经用作FISH了,在使用来接受数据不出错吧?接受是DMA接受。首先不考虑混用串口带来的数据混乱问题,就只是为了验证串口能收到数据。其他串口我也试了,也没收到数据。 |
|
相关推荐
11个回答
|
|
强烈不建议这么做,运行 RT-Thread 操作系统最好单独留一个串口作为控制台的串口,在控制台中可以方便的看出来线程、定时器、信号量、互斥锁、内存等关键信息的运行情况,更方便监控整个系统的运行。 控制台线程的执行代码在文件 rt-threadcomponentsfinshshell.c 里面,如下所示。从中可以看出改线程在一直获取控制台串口的输入数据,也就是说该串口一收到数据就会被该线程读出来(该线程的优先级是 20),收到 “rn” 之后开始解析命令并执行对应的操作。如果将控制台串口和其他通讯功能合为一个,想实现除了解析命令还解析其他协议的话,那么就需要修改该函数的实现,如果修改不好会影响到控制台命令的解析,建议硬件设计时单独留出来一个串口作为控制台串口使用。 void finsh_thread_entry(void *parameter) { int ch; /* normal is echo mode */ #ifndef FINSH_ECHO_DISABLE_DEFAULT shell->echo_mode = 1; #else shell->echo_mode = 0; #endif #if !defined(RT_USING_POSIX) && defined(RT_USING_DEVICE) /* set console device as shell device */ if (shell->device == RT_NULL) { rt_device_t console = rt_console_get_device(); if (console) { finsh_set_device(console->parent.name); } } #endif #ifdef FINSH_USING_AUTH /* set the default password when the password isn't setting */ if (rt_strlen(finsh_get_password()) == 0) { if (finsh_set_password(FINSH_DEFAULT_PASSWORD) != RT_EOK) { rt_kprintf("Finsh password set failed.n"); } } /* waiting authenticate success */ finsh_wait_auth(); #endif rt_kprintf(FINSH_PROMPT); while (1) { ch = (int)finsh_getchar(); if (ch < 0) { continue; } /* * handle control key * up key : 0x1b 0x5b 0x41 * down key: 0x1b 0x5b 0x42 * right key:0x1b 0x5b 0x43 * left key: 0x1b 0x5b 0x44 */ if (ch == 0x1b) { shell->stat = WAIT_SPEC_KEY; continue; } else if (shell->stat == WAIT_SPEC_KEY) { if (ch == 0x5b) { shell->stat = WAIT_FUNC_KEY; continue; } shell->stat = WAIT_NORMAL; } else if (shell->stat == WAIT_FUNC_KEY) { shell->stat = WAIT_NORMAL; if (ch == 0x41) /* up key */ { #ifdef FINSH_USING_HISTORY /* prev history */ if (shell->current_history > 0) shell->current_history --; else { shell->current_history = 0; continue; } /* copy the history command */ memcpy(shell->line, &shell->cmd_history[shell->current_history][0], FINSH_CMD_SIZE); shell->line_curpos = shell->line_position = strlen(shell->line); shell_handle_history(shell); #endif continue; } else if (ch == 0x42) /* down key */ { #ifdef FINSH_USING_HISTORY /* next history */ if (shell->current_history < shell->history_count - 1) shell->current_history ++; else { /* set to the end of history */ if (shell->history_count != 0) shell->current_history = shell->history_count - 1; else continue; } memcpy(shell->line, &shell->cmd_history[shell->current_history][0], FINSH_CMD_SIZE); shell->line_curpos = shell->line_position = strlen(shell->line); shell_handle_history(shell); #endif continue; } else if (ch == 0x44) /* left key */ { if (shell->line_curpos) { rt_kprintf("b"); shell->line_curpos --; } continue; } else if (ch == 0x43) /* right key */ { if (shell->line_curpos < shell->line_position) { rt_kprintf("%c", shell->line[shell->line_curpos]); shell->line_curpos ++; } continue; } } /* received null or error */ if (ch == ' |