STM32的RT-THREAD的串口怎么使用邮箱
是在串口的中断里面,把接到的数据通过库函数USART_ReceiveData(USART1)得到后,
发送到邮箱里面么,还是怎么样?
还有STM32的rt-thread例子很少见,
能不能介绍几个例子,
发现收音机那个里面一共就一个线程,还都是一些初始化外设的,
没有多少参考价值,看了还是不太了解,那个手册页看过很多遍了。 我感觉这样处理好点:中断里接收数据,用邮箱发到Bottom Half线程中进行分析,根据包内容再发送到相应的线程。 1楼说的好像是LINUX的中断吧,我是在void USART1_IRQHandler(void)这个中断函数里
用result_in=USART_ReceiveData(USART1)接受电脑发的指令
,然后要传送到线程里,不想用全局变量,是不是就直接用
rt_mb_send(&mb, (rt_uint32_t)&result_in);发送就行了~
我的中断程序:void USART1_IRQHandler(void)
{
#ifdef RT_USING_UART1
u16 result_in=0;
extern struct rt_device uart1_device;
extern void rt_hw_serial_isr(struct rt_device *device);
/* enter interrupt */
rt_interrupt_enter();
result_in=USART_ReceiveData(USART1);
rt_mb_send(&mb, (rt_uint32_t)&result_in);
rt_hw_serial_isr(&uart1_device);
/* leave interrupt */
rt_interrupt_leave();
#endif
}
或者得使用其它方式? 回复【2楼】1300961082
-----------------------------------------------------------------------
你这样是把局部变量的指针传递过去,会死翘翘的
关于串口的操作方式,建议还是把它分成一个个包传递给线程进行处理。例如每个包有个头,当收取完整个包时再递交给上层线程处理。 我收回来的是类似于:0X0016,0X0043这样的16进制数,完整包怎么穿,我看说明上不是就是用指针传的么,完整包时,怎么再递交给上层现成处理?不用邮箱了? 你上面一个程序,如果传递过去一个指针,当脱离这个函数时,这个指针指向的内容不是没有了么。所以不太对。
如果你确实希望通过邮箱发送,那么估计得
char result;
result = ...; /* 从外设中读取 */
rt_mb_send(mb, (rt_uint32_t)result));
即把1个字符当成了4个字节来传送,效率上比较低。 哦,明白你意思了,谢谢啦~~ 这用这种方式也可以的啊
void USART1_IRQHandler(void)
{
#ifdef RT_USING_UART1
extern struct rt_device uart1_device;
extern void rt_hw_serial_isr(struct rt_device *device);
/* enter interrupt */
rt_interrupt_enter();
rt_hw_serial_isr(&uart1_device);
/* leave interrupt */
rt_interrupt_leave();
#endif
}
页:
[1]