豆皮 - STM32开发板入门教程(十五) - 串口中间件(队列)的使用 (原创)


豆皮 - STM32开发板入门教程(十五) - 串口中间件的使用 (原创)


版权所有 STMFANS 原创,转载请保留出处

http://www.stmfans.com/bbs/viewthread.php?tid=1352&page=1&extra=page%3D1




串口中间件 实质上就是数据队列(queue) 应用在不同的外设上面 就可以叫做该种外设的中间件(其实中间件这个名字一点都不好听 不过也没想出别的好听的咚咚来 就先这样叫着吧)   这里移植使用的是ZLG的队列模块




数据队列用处很多 在这里我们用于数据缓存 用于平衡速率不同的两个部件 使快速部件无需等待慢速部件   数据队列一般是先进先出的(FIFO) 呵呵 这个队列可以配置成后进先出(LIFO) 本 数据队列是可裁剪的模块 独立于系统 数据队列使用的空间大小由用户配置 并且一个空间的地址唯一识别一个数据队列 在一个应用中可以创建N多队列 每个队列对应一个数据空间 相互独立 互不干扰 在这里我们创建了2个队列 一个是快速部件的接收队列 一个是慢速部件的发送队列



配置情况:

1.   USART1   baudrate 115200  中断接收
2.   USART3   baudrate  9600  中断发送
3.   对于 USART1 有一个接收队列 长度由用户设定
4.   对于 USART3 有一个发送队列 长度由用户设定


工作过程  从 USART1 中断接收数据 保存到接收队列 主函数中检测队列长度 一旦发现有数据 则从USART1的接收队列取一个数据保存到USART3的发送队列 并且开启USART3的发送中断 即:发送和接收都是在中断完成 主函数只做一个搬运的工作


如果还想减轻主函数的任务 呵呵 可以把搬运工作也放中断 这样 就成了软件DMA了 呵呵




如果队列已经满了 又有新的数据进来 怎么办?

u8 Uart0WriteFull(DataQueue *Buf, QUEUE_DATA_TYPE Data, u8 Mod)
{
    u16 temp;
    Mod = Mod;
   
    //输出提示 测试代码
    //Uart1_PutString("Queue Full\n" , strlen("Queue Full\n"));
   
    temp = QueueSize((void *)Buf);
    while (temp <= QueueNData((void *)Buf))         /* 等待数据队列不满 */
    {
    }
    return QueueWrite((void *)Buf, Data);           /* 数据重新入队 */
}


这个是接收队列满了的处理情况(发送队列的处理也是): 等待队列不满 然后把数据进队 这样的话程序就在这里等着 这是一个简单的处理办法 也可以直接把数据丢弃处理或者别的 大家根据自己的需要调整   


队列长度的设定

//缓冲区的总大小等于 0x18 + ??(数据缓冲的大小) 0x18是固定消耗
#define UART0_RECEIVE_QUEUE_LENGTH 0x18+0x3f  //接收缓冲区
#define UART0_SEND_QUEUE_LENGTH 0x18+0x3f  //发送缓冲区


可以由用户自己指定



这个中间件 也就是队列 可以应用在任意的外设等 queue.c  queue.h copy这2个文件就可以了 移植还是很方便的 在数据传输中 匹配通讯双方的速率 还是很不错的



完整工程在附件里

敬请继续关注 豆皮的的教程会逐步推出

WORM_UART_INT.rar (332.24 KB)

IAR442工程

USART_QUEUE.rar (283.07 KB)

IAR520工程

1

评分人数

  • aleyn

我有一個夢想 擁有一大片土地 做個小地主 每天帶著一群狗奴才去調戲良家婦女....

先顶下,呵呵!

TOP

虫子必出精品。

虫子能不能加几张调试的图片得揭图上去呢。

TOP

太好了,正要用呢,又有新教程了

TOP

原帖由 lvhaian 于 2008-12-4 14:02 发表
虫子必出精品。

虫子能不能加几张调试的图片得揭图上去呢。




谢谢安哥夸奖和指导

调试的时候是用2台电脑一起调试的 因为要用到2个串口 呵呵
匆忙的搬了个本本过来测试的
测试完了就还过去了
所以 这次没有截图 呵呵

教程上面有IAR442 IAR520的教程
有豆皮的兄弟们直接下载编译就可以跑了
呵呵

[ 本帖最后由 littleworm 于 2008-12-4 14:43 编辑 ]
我有一個夢想 擁有一大片土地 做個小地主 每天帶著一群狗奴才去調戲良家婦女....

TOP

太好了,正要用呢,又有新教程了

TOP

哈哈,下载了,支持

TOP

终于学完了!

TOP

看看先

TOP

没太看明白数据满了的情况,是怎么处理的??停止操作等到前面的数据发送出去了空出了地方再进数据??

TOP

虫子必出精品。

TOP

下载学习!

TOP

感谢您的努力

TOP

先看看,谢谢努力!

TOP

学习了,

TOP

看看了,这个教程没下载过.

TOP

支持一下,楼主辛苦了

TOP

原帖由 xiaoduxp 于 2008-12-11 16:54 发表
没太看明白数据满了的情况,是怎么处理的??停止操作等到前面的数据发送出去了空出了地方再进数据??




暂时例程里面的代码处理是等待队列为空 然后入队(适合中断出队的情况)
但是 数据满的情况是根据你的需求来处理的
我有一個夢想 擁有一大片土地 做個小地主 每天帶著一群狗奴才去調戲良家婦女....

TOP

谢谢虫子!

TOP

谢谢搂主分享。

TOP

dddddddddd

ddddddddddsafadsf

TOP

学习 学习

TOP

终于学完了!

TOP

1# littleworm


顶!

TOP

1# littleworm


顶!

TOP

能下载的,谢谢,这个没有阅读权限

TOP

看看,谢谢努力! 顶!

TOP

先顶下,呵呵!

TOP

18# littleworm


谢谢!!!

TOP

继续顶,继续学习!

TOP

Review opelc.org on alexa.com