|
看了几天RTT的usart模块,发现串口功能很完善但也很复杂,呵呵。查资料后自己用finsh简单调试了发送和接收。虽然能成功,但是不知道符不符合RTT系统的要求,希望前辈们指导。
在RTT中usart采用了循环缓冲+动态分配内存方式,我选用了usart3的DMA方式发送+中断接收。(RTT功能非常强大,先没有仔细分析内部结构,准备先正确使用起来再去分析)
首先在rt_config.h中配置
#define RT_USING_DEVICE
#define RT_USING_UART1 //usart1用作finsh输出
#define RT_USING_CONSOLE
#define RT_USING_FINSH
#define RT_USING_UART3 //usart3用作普通串口输出
调试环境Stm32f103rc mdk4 RTT1.0.2
注:application.c中没有进行修改,仍然是led1和led2两个任务
bernard前辈有详细介绍usart的程序结构,我就不献丑了,呵呵。
------------------------发送--------------------------------
void usart3_send(void)
{
char sdata[]="hello rtt!";
rt_serial_write(&uart3_device,0,sdata,strlen(sdata));
}
#include <finsh.h>
FINSH_FUNCTION_EXPORT(usart3_send,just a test function);
这里用到了rt_serial_write(),它在serial.c中(但是发现是文件内部程序,前面加了static,我取消了static修饰,并在usart.c中调用,所以不知道这样修改会不会有问题,请指教。)
这样利用finsh就可以正常使用usart3_send()发送了。
------------------------中断接收------------------------------------
static char rdata[20]; //先暂且用全局变量,以后再尝试使用动态分配
void usart3_send(char *p,u8 size)
{
rt_serial_write(&uart3_device,0,p,size);
}
void usart3_read(void)
{
rt_serial_read(&uart3_device,0,rdata,20);
usart3_send(rdata,strlen(rdata));
}
#include <finsh.h>
FINSH_FUNCTION_EXPORT(usart3_read,just a test function);
先串口发送“hello mcu”给单片机板子,再调用finsh组件调试usart3_read(),单片机能够再把”hello mcu”发回给PC串口助手。
函数原型rt_size_t rt_serial_read (rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size)
我有几点不是很明白,
1、为什么要提前设定rt_serial_read()第4个形参rt_size_t size,是不是有什么巧妙的用途我没有理解,呵呵。
2、在RTT的IO设备层,一般都要先注册,再进行初始化但是这个程序
先rt_device_init_all();再rt_application_init();
请问其他的device是不是也可以这样?
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|