打印
[AVR单片机]

俺的串口驱动:

[复制链接]
81711|56
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
农民讲习所|  楼主 | 2007-9-13 07:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//-------------------------------------------------------------
//串口驱动程序.8bit
//-------------------------------------------------------------
#include "....SystemCom.h"
#include "....SystemQueue.h"
#include "....SystemCommunicateQueue.h"
#include "....Mega.h"

#define TX8_ON()    do{ UCSR0B |= (1<<UDRIE0);}while(0)
#define TX8_OFF()   do{ UCSR0B &= ~(1<<UDRIE0);}while(0)

struct CommunicateQueue *psUart80;

//-------------------------------------------------------------
//队列压入回调函数
//-------------------------------------------------------------
void InUart80_QueueCallBack( void )
{
    TX8_ON();
}

//-------------------------------------------------------------
//设置串口
//-------------------------------------------------------------
void Uart80_Setup(U16 mBaud, U8 mMode, U16 mSendBufSize, U16 mReciBufSize )
{
    //设置寄存器
    UBRR0H = (U8)(mBaud>>8);
    UBRR0L = (U8)mBaud;

    UCSR0C = mMode | (0<<UCSZ02)|(1<<UCSZ01)|(1<<UCSZ00);    //8BIT
    UCSR0A = (1<<U2X0);                                        //倍速

    //申请队列
    psUart80 = CommunicateQueue_Register( mSendBufSize, mReciBufSize, InUart80_QueueCallBack );
    
    if( mSendBufSize ){
        //允许发送
        UCSR0B |= (1<<TXEN0);
    }

    if( mReciBufSize ){
        //允许接收及中断
        UCSR0B |= (1<<RXCIE0) | (1<<RXEN0);
    }
}

//-------------------------------------------------------------
//串口接收中断。
//-------------------------------------------------------------
SIGNAL( SIG_UART0_RECV )
{
    Queue_Push( psUart80->psReci, UDR0 );
}


//-------------------------------------------------------------
//串口发送中断,使用寄存器保持空中断。
//-------------------------------------------------------------
SIGNAL( SIG_UART0_DATA )
{
    if( Queue_Num( psUart80->psSend ) )
    {
        UDR0 = Queue_Pop( psUart80->psSend );
    }
    else
    {
        TX8_OFF();                                            //无发送数据,关闭
    }
}

相关帖子

沙发
农民讲习所|  楼主 | 2007-9-13 07:20 | 只看该作者

发送数据很简单:

CommunicateQueue_Push( psUart80, xxx );

使用特权

评论回复
板凳
kanprin| | 2007-9-13 09:12 | 只看该作者

能否解释一下回调函数的执行过程? 谢谢。

使用特权

评论回复
地板
农民讲习所|  楼主 | 2007-9-13 09:15 | 只看该作者

标准队列扩展为通信用队列

#ifndef __COMMUNICATEQUEUEH
#define __COMMUNICATEQUEUEH

    //通信使用的队列结构
    struct CommunicateQueue
    {
        struct Queue *psSend;
        struct Queue *psReci;
        void (*Event_Push)( void );         //压入队列时触发处理函数
    };

    //------------------------------------------------------------
    //构造
    //------------------------------------------------------------
    #define CommunicateQueue_Init()                             do{;}while(0)

    //------------------------------------------------------------
    //析构,释放在init()中使用到的硬件资源
    //------------------------------------------------------------
    #define CommunicateQueue_Destory()                          do{;}while(0)

    //------------------------------------------------------------
    //申请注册缓冲队列
    //入口:发送缓冲大小, 接收缓冲大小,处理函数
    //返回struct Queue结构指针。
    //------------------------------------------------------------
    extern struct CommunicateQueue * CommunicateQueue_Register( U8 mSendSize, U8 mReciSize, void (*Event_Push)(void) );

    //------------------------------------------------------------
    //将数据压入发送队列
    //------------------------------------------------------------
    #define CommunicateQueue_Push( pCommunicateQueue, mData )   do{ Queue_Push( pCommunicateQueue->psSend, mData );
                                                                    if( pCommunicateQueue->Event_Push ){
                                                                        (*pCommunicateQueue->Event_Push)();
                                                                    }
                                                                }while(0)
    
    //------------------------------------------------------------
    //将接收数据弹出队列
    //------------------------------------------------------------
    #define CommunicateQueue_Pop( pCommunicateQueue )           Queue_Pop( pCommunicateQueue->psReci )

    #define CommunicateQueue_MainLoop()                         do{;}while(0)
    
#endif

使用特权

评论回复
5
onemillion| | 2007-9-13 14:59 | 只看该作者

哈,

 用串口一直就是用状态机,定个协议,
 楼主的程序对我等菜鸟好象不怎么实用,

使用特权

评论回复
6
农民讲习所|  楼主 | 2007-9-13 15:23 | 只看该作者

楼上的思想太落后,水份太多,要改

使用特权

评论回复
7
OneMillion| | 2007-9-13 22:18 | 只看该作者

愿听所长教训,

  鄙人确实是思想太落后,
  久仰所长大名,
  虔诚拜所长为师!
   嘭! 一拜
   嘭嘭! 二拜
   嘭嘭嘭! 三拜
。。。

使用特权

评论回复
8
end2000| | 2007-9-13 22:47 | 只看该作者

所长贴这段代码是什么意思?

难道所长的号被盗?代码写的花里胡哨的,华而不实。

使用特权

评论回复
9
bird777| | 2007-9-14 13:43 | 只看该作者

:

所长认为只有别墅才能叫房子.
1.别墅质量好.(去看看庐山的别墅).
2.别墅可以任意发挥,摇身一变内部当成民房也可以.
--------------------------------------------------------
直接建个通讯用环形队列和所长用内存动态分配(基本也属于长期固定霸占)整出的队列好像是一样的吧.后来想想,所长的大概的意思我是所长当然提出的东西肯定具备先进性(没有错,理解了所长的用意); 不容易啊,所长毕业那个年代89之后吧?,软件工程这个东东肯定都是实践中自学摸索的吧.
缓冲处理是肯定的,整体系统功能效果也是肯定一样的,仅是乡镇企业主和国营厂长的区别.国营单位知道什么叫ISO9000系列,因此要建立的农民讲习所,告诉乡镇企业的领导们,报创新项目该怎么书写,字体大小等等等,免得回回吃亏,不要觉得家族企业和现代企业一个样.






使用特权

评论回复
10
yewuyi| | 2007-9-14 16:03 | 只看该作者

呵呵,LS的真高……

学习所长好榜样……


俺拉张板凳,好好学习,天天向上

使用特权

评论回复
11
农民讲习所|  楼主 | 2007-9-14 16:40 | 只看该作者

再秀一把

俺这些都是摘自俺自建的标准库,MEGA128。单片机处理完全可以实现标准化,以极低的代价保证高水平的程序设计。

下面是库的头部文件,还可以加入更多的功能。

相关链接:https://bbs.21ic.com/upfiles/img/20079/2007914164013200.zip

使用特权

评论回复
12
OneMillion| | 2007-9-14 19:59 | 只看该作者

学习中!

使用特权

评论回复
13
音乐乐乐| | 2007-9-14 20:40 | 只看该作者

不错,顶

使用特权

评论回复
14
陈双君| | 2007-9-19 10:22 | 只看该作者

真的是讲给懂得不多的人听的.

真的是讲给懂得不多的人听的.

使用特权

评论回复
15
zhanghl45| | 2007-9-19 15:24 | 只看该作者

我看不懂,那就是一点都不懂。还没入门的人了。

我看不懂,那就是一点都不懂。还没入门的人了。

使用特权

评论回复
16
真水无香| | 2007-9-20 16:30 | 只看该作者

请问楼主

程序中使用
do{ }while(0)
的优点在哪里啊?

使用特权

评论回复
17
athlon64fx| | 2007-9-21 03:04 | 只看该作者

do while(0) 是一个真正的C语句.

可以把复合语句变成单个语句.linux的源码都是这种写法.

使用特权

评论回复
18
dudongdao| | 2007-9-21 15:10 | 只看该作者

我也不懂

do while(0) 是一个真正的C语句.????


他是一个真正的C语句,哪些是假的呢,实际的好处在哪呢,可以这样回答吗
    他是一个真正的C语句,所以他......(这里写他的做用,或者他的优势,或者他的特殊之处)

   那如果不是真正的C语句又如何呢,糊涂啊,高手指点~~

使用特权

评论回复
19
真水无香| | 2007-9-22 12:26 | 只看该作者

谢谢 athlon64fx

学到一招

使用特权

评论回复
20
busy| | 2007-10-18 21:12 | 只看该作者

农民好样的

记得俺在5年前刚学会MCU编程的时候就已经达到这个水准了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

1275

帖子

15

粉丝