1300961082 发表于 2011-1-28 20:39:24

STM32的RT-THREAD的串口怎么使用邮箱

是在串口的中断里面,
把接到的数据通过库函数USART_ReceiveData(USART1)得到后,
发送到邮箱里面么,还是怎么样?

还有STM32的rt-thread例子很少见,
能不能介绍几个例子,
发现收音机那个里面一共就一个线程,还都是一些初始化外设的,
没有多少参考价值,看了还是不太了解,那个手册页看过很多遍了。

taishan 发表于 2011-1-29 16:50:29

我感觉这样处理好点:中断里接收数据,用邮箱发到Bottom Half线程中进行分析,根据包内容再发送到相应的线程。

1300961082 发表于 2011-1-29 17:30:42

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
}
或者得使用其它方式?

ffxz 发表于 2011-1-30 14:07:44

回复【2楼】1300961082
-----------------------------------------------------------------------

你这样是把局部变量的指针传递过去,会死翘翘的

关于串口的操作方式,建议还是把它分成一个个包传递给线程进行处理。例如每个包有个头,当收取完整个包时再递交给上层线程处理。

1300961082 发表于 2011-1-31 22:12:59

我收回来的是类似于:0X0016,0X0043这样的16进制数,完整包怎么穿,我看说明上不是就是用指针传的么,完整包时,怎么再递交给上层现成处理?不用邮箱了?

ffxz 发表于 2011-1-31 22:42:26

你上面一个程序,如果传递过去一个指针,当脱离这个函数时,这个指针指向的内容不是没有了么。所以不太对。

如果你确实希望通过邮箱发送,那么估计得
char result;

result = ...; /* 从外设中读取 */

rt_mb_send(mb, (rt_uint32_t)result));

即把1个字符当成了4个字节来传送,效率上比较低。

1300961082 发表于 2011-2-7 14:23:30

哦,明白你意思了,谢谢啦~~

qqwuying2 发表于 2011-9-20 12:25:34

这用这种方式也可以的啊
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]
查看完整版本: STM32的RT-THREAD的串口怎么使用邮箱