打印
[AVR单片机]

俺的串口驱动:

[复制链接]
楼主: 农民讲习所
手机看帖
扫描二维码
随时随地手机跟帖
21
sodwell| | 2007-10-20 13:29 | 只看该作者 回帖奖励 |倒序浏览

re

do while(0) 再linux中经常看到的 

使用特权

评论回复
22
dudongdao| | 2007-10-20 21:53 | 只看该作者

有啥作用?

  哪为大虾能解释解释啊,用最笨拙的语言来解释,要不不懂啊

使用特权

评论回复
23
wenzhigang| | 2007-10-21 13:59 | 只看该作者

我是菜鸟,请高手指点我的通讯程序

发送数据时,要把发送的数据都压入发送栈,启动发送后会自动在中断里面把栈中的数据发送出去,接收栈用于接收到的数据。


#include "dr4cpu.h"
#include "memu.h"
#include "dr4cpuUART.h"
#include <delay.h>
#include <stdlib.h> 
#include <math.h>
#define uchar unsigned char
#define uint  unsigned int
#define BUFF_SIZE 64
uchar input=0;
uchar output=0;

uchar resv_input=0;
uchar resv_output=0;

uchar send_buff[64];
uchar resv_buff[64];

void uart_init(void)
{
    UBRRL = 51;
    UBRRH = 0x00;
    UCSRA = 0x00;
    UCSRC = 0x86;
    UCSRB = 0xd8;
}
//接收中断
SIGNAL(SIG_UART_RECV)
{
    uchar a;
    a=UDR;
    put_resv(a);
}
//发送中断
SIGNAL(SIG_UART_TRANS)
{
    if(test_send())
    {
        UDR=get_send();    
    }
}
/*****************************************
发送字符型数据
*****************************************/
void send_char(uchar a)
{
    UDR=a;    
    delay(1,8000);
}
/*****************************************
发送压栈
*****************************************/
void put_send(uchar a)
{
    send_buff[input]=a;
    if(input<BUFF_SIZE-1)
        input++;
    else
        input=0;    
}
/*****************************************
发送出栈
*****************************************/
uchar get_send(void)
{
    uchar temp;
    if(output==input)
        return 0;
    else
    {
        temp=send_buff[output];
        if(output<BUFF_SIZE-1)
            output++;
        else 
            output=0;
        return temp;
    }
}
/*****************************************
发送缓冲测试
*****************************************/
uchar test_send(void)
{
    if(output==input)
        return 0;
    else
        return 1;
}
/*****************************************
接收压栈
*****************************************/
void put_resv(uchar a)
{
    send_buff[resv_input]=a;
    if(resv_input<BUFF_SIZE-1)
        resv_input++;
    else
        resv_input=0;    
}
/*****************************************
接收出栈
*****************************************/
uchar get_resv(void)
{
    uchar temp;
    if(resv_output==resv_input)
        return 0;
    else
    {
        temp=send_buff[resv_output];
        if(resv_output<BUFF_SIZE-1)
            resv_output++;
        else 
            resv_output=0;
        return temp;
    }
}
//测试接收栈
uchar test_resv(void)
{
    if(resv_output==resv_input)
        return 0;
    else
        return 1;
}

使用特权

评论回复
24
nanog| | 2007-10-31 00:33 | 只看该作者

lz要表达些什么?

lz要表达些什么?

使用特权

评论回复
25
现实主义| | 2007-11-14 11:47 | 只看该作者

农名所长在卖弄技巧啊

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


只有多条语句的宏定义这样用才有意义,
单条语句的宏这样用是对程序代码空间和程序执行速度的浪费,尽管这种浪费很小.
但是这种浪费是没有必要的.

使用特权

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

说你水平不高是不错的。

最最标准的宏定义,高级程序员通用写法。是严谨的语法结构。
do{ }while(0)是无任何实际语法意义的,唯一功能是因为是完整语句表达,可以避免几个宏定义并行书写,合并事发生的语法合并错误。

如果LS能去CSDN或其它高级语言论坛去进修进修,就会明白。

使用特权

评论回复
27
洪七公| | 2007-11-14 14:16 | 只看该作者

哈哈~~~最近热闹了~~~

使用特权

评论回复
28
dld2| | 2007-11-14 14:17 | 只看该作者

学到了

喜欢看有思想的代码

使用特权

评论回复
29
machunshui| | 2007-11-14 23:19 | 只看该作者

农民兄弟太托大了

农民兄弟太托大了.
自我感觉太好了,真把自己当成所长了.

do{...}while(0)结构的宏是用于避免象书写
if,else语句是没有写{},导致多个;的错误.

但是这种错误,通常是发生在有多条语句的宏定义时.

人家是说你象:#define TX8_ON()    do{ UCSR0B |= (1<<UDRIE0);}while(0)
只有单个语句单个语句的宏定义时,弄个do,while结构有卖弄的嫌疑.

使用特权

评论回复
30
machunshui| | 2007-11-14 23:28 | 只看该作者

其实啊,越是卖弄程序技巧的人,

其实啊,往往越是卖弄程序技巧的人,水平不达到一定程度,写出的程序越是不可靠.

以前我的老板,带的几个研究生,其中一个特别钟情于技巧,但是写出的程序毛病却多.
另一个,老老实实,按部就班,该处理到的都处理,相反写出的东西,代码是多了一些,但是却比卖弄技巧的毛病少.

当然,可能农民水平达到一定程度,不会有这样的错误.

使用特权

评论回复
31
machunshui| | 2007-11-14 23:39 | 只看该作者

其实

其实这种宏定义无非就是防止宏替换时候出现歧异性,没有什么其他的目的。

只有单个语句直接定义应该不会有什么问题.

使用特权

评论回复
32
ddb_21ic| | 2007-11-15 01:06 | 只看该作者

直接加个{}难道不行?

使用特权

评论回复
33
农民讲习所|  楼主 | 2007-11-15 08:24 | 只看该作者

晕,又来一个半吊子的

俺理解machunshui是问为什么使用宏?

理由很简单,很多人都明白:最简单例子,换个CPU,只要把宏替换掉就可以,使用宏表示和硬件有关,可能被替换。

竟然有人用这来评价是花俏?俺要跳楼去了。

使用特权

评论回复
34
农民讲习所|  楼主 | 2007-11-15 08:26 | 只看该作者

machunshui竟然还会VC编程?

想不通,VC可能也是初学吧?

使用特权

评论回复
35
hotpower| | 2007-11-15 08:27 | 只看该作者

俺送个充气垫子会舒服点~~~

使用特权

评论回复
36
农民讲习所|  楼主 | 2007-11-15 08:32 | 只看该作者

如果说用do{}while(0)定义宏是花俏

估计会被百万块砖头砸死:世界上大部分优秀的程序员都这么写的。

使用特权

评论回复
37
HWM| | 2007-11-15 08:36 | 只看该作者

LZ:没仔细看程序,请问发送是否用的是环形队?

若是这样就和我的思路差不多了。

使用特权

评论回复
38
农民讲习所|  楼主 | 2007-11-15 08:41 | 只看该作者

是,只是用使用通用队列模块

队列程序是一个,外部模块使用队列结构变量,用结构指针调用。

使用特权

评论回复
39
HWM| | 2007-11-15 08:44 | 只看该作者

呵呵,很好!我一直在用这样的结构。

使用特权

评论回复
40
现实主义| | 2007-11-15 08:52 | 只看该作者

简直是好笑

看到农民在33楼的回复,简直是好笑,
一个人自大自恋成这个样子.

人家问这个问题了吗?

使用特权

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

本版积分规则