豆皮 - 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)

lvhaian (2008-12-03 11:22:57)
先顶下,呵呵!
lvhaian (2008-12-04 14:02:27)
虫子必出精品。

虫子能不能加几张调试的图片得揭图上去呢。
xiaoduxp (2008-12-04 14:36:10)
太好了,正要用呢,又有新教程了
littleworm (2008-12-04 14:40:32)

QUOTE:

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

虫子能不能加几张调试的图片得揭图上去呢。
谢谢安哥夸奖和指导

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

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

[ 本帖最后由 littleworm 于 2008-12-4 14:43 编辑 ]
jameslee2005 (2008-12-05 11:05:11)
太好了,正要用呢,又有新教程了
c51avr (2008-12-06 11:33:50)
哈哈,下载了,支持
caixingang (2008-12-09 20:21:37)
终于学完了!
chenliyun (2008-12-10 10:04:52)
看看先
xiaoduxp (2008-12-11 16:54:09)
没太看明白数据满了的情况,是怎么处理的??停止操作等到前面的数据发送出去了空出了地方再进数据??
hwdpaley (2008-12-12 11:17:10)
虫子必出精品。
lljyes (2008-12-20 13:29:13)
下载学习!
eemkutay (2008-12-24 21:04:15)
感谢您的努力
kingstar (2008-12-28 15:20:36)
先看看,谢谢努力!
kirk803 (2008-12-31 09:03:39)
学习了,
laotong (2008-12-31 20:29:08)
看看了,这个教程没下载过.
lostgb (2009-1-12 22:30:46)
支持一下,楼主辛苦了
littleworm (2009-1-12 23:34:08)

QUOTE:

原帖由 xiaoduxp 于 2008-12-11 16:54 发表
没太看明白数据满了的情况,是怎么处理的??停止操作等到前面的数据发送出去了空出了地方再进数据??
暂时例程里面的代码处理是等待队列为空 然后入队(适合中断出队的情况)
但是 数据满的情况是根据你的需求来处理的
duqiong (2009-1-20 14:17:15)
谢谢虫子!
wudonghua (2009-2-12 09:48:01)
谢谢搂主分享。
hqgboy (2009-3-24 15:02:05)
ddddddddddsafadsf
()