豆皮 - STM32开发板入门教程(十五) - 串口中间件(队列)的使用 (原创)
发布: 2008-12-03 10:20 | 作者: littleworm | 来源: StmFans思蜕盟 OPELC 自由电子联盟
豆皮 - 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
(2008-12-04 13:19:12, Size: 332 KB, Downloads: 259)
USART_QUEUE.rar
(2008-12-04 13:19:12, Size: 283 KB, Downloads: 294)

虫子能不能加几张调试的图片得揭图上去呢。
QUOTE:
谢谢安哥夸奖和指导调试的时候是用2台电脑一起调试的 因为要用到2个串口 呵呵
匆忙的搬了个本本过来测试的
测试完了就还过去了
所以 这次没有截图 呵呵
教程上面有IAR442 IAR520的教程
有豆皮的兄弟们直接下载编译就可以跑了
呵呵
[ 本帖最后由 littleworm 于 2008-12-4 14:43 编辑 ]
QUOTE:
暂时例程里面的代码处理是等待队列为空 然后入队(适合中断出队的情况)但是 数据满的情况是根据你的需求来处理的