打印

PK 使人进步:晒晒你的串口程序

[复制链接]
9784|61
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
西安农民工|  楼主 | 2011-11-10 21:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是我做的一个简单的下位机程序,欢迎拍砖!
引用刘公公的一句话“能修改BUG的才是高手!”
希望大家以这个程序为跳板,都成为高手!
同志们,拿起你的板砖,拍过来!
/*************************************************************************************************************/
/*    串口接收包程序
/* 功能:通过串口接收数据包
/* 作者:zsl
/* 日期:猴年马月
/* 修改日期:xxxx xxxx
/* 修改内容:增加注释
/* 通讯协议格式:   帧头(8bit) | 数据起始(8bit)  |             数据域(32bit)          |      数据尾
/*                    0x55    |     0xaa  |  高8 - 32bit:预留;0-7bit:控制led灯    |    0xee
/*
/*************************************************************************************************************/
#include <AT89X52.H>
#include "UART.h"
#define LEN 16
/********状态机*************/
enum UartFsm
{
    HEAD = 0,
    BEGIN,
    DATA,
    END,
};
/********当前状态变量***********/
unsigned char gudState = 0;
/********接收数据***********/
unsigned char ReceData[5];
/********串口接收缓冲***********/
unsigned char gaRXBuff[LEN];
/********接收队列头***********/
unsigned char gudHead = 0;
/********接收队列尾***********/
unsigned char gudTail = 0;
/********接收计数***********/
unsigned char gudCount = 0;
/********接收完成标志***********/
unsigned char gudRxOK标志寄存器 = 0;
/********错误标志***********/
unsigned char gudRxErr = 0;   
/********接收缓冲变量***********/
volatile unsigned char Buftemp = 0;
/********************************/
/* 函数名称:GetData
/* 说明:    从接收队列中取一个字节
/********************************/
unsigned char GetData()
{
    unsigned char udVal;
    if(gudTail >= LEN)
    {
        gudTail = 0;
    }
udVal =  gaRXBuff[gudTail++];
return udVal;
}
/********************************/
/* 函数名称:GetFrmData
/* 说    明:从数据包中取出数据域
/********************************/
void GetFrmData(unsigned char *pDat)
{
    unsigned char i;
if(gudTail == gudHead) return;
    for(i = 0; i < 4; i++)
    {
        pDat = GetData();
    }
}
main()
{
    init_UART();
P0 = 0xff;
ReceData[4] = '\0';
Send_Data("Ready!\n");
    while(1)
    {
        if(gudRxOK标志寄存器)
        {
      gudRxOK标志寄存器 = 0;
            GetFrmData(ReceData);
/*******数据域中,第一个字节用来控制LED灯*******/
   P0 = ~ReceData[0];     
   Send_Data("Receive OK!\n");
        }
        if(gudRxErr)
  {
      gudRxErr = 0;
   Send_Data("Data error!\n");
  }
}
}

void Uart(void) interrupt 4 using 3
{
    if(RI)
{
  RI=0;
        Buftemp = SBUF;
        switch(gudState)
        {
            case HEAD:
                if(0x55 == Buftemp)
                {
                    gudState = BEGIN;
                }
                break;
            case BEGIN:
                if(0xaa == Buftemp)
                {
                    gudCount = 0;
                    gudState = DATA;
                }
                else
                    gudState = HEAD;
                break;
            case DATA:
                if(gudHead >= LEN)
                {
                    gudHead = 0;
                }
                gaRXBuff[gudHead++] = Buftemp;
                gudCount++;
                if(gudCount >= 4)
                {
                    gudState = END;
                }
                break;
            case END:
                if(0xee == Buftemp)
                {
                    gudRxOK标志寄存器 = 1;
                }
                else
                {
                    gudRxErr = 1;
     gudTail = gudHead;   /* 如果有错误,数据丢弃 */
                }
                gudState = HEAD;
                break;
            default:
                gudState = HEAD;
                break;
        }
}
}

UartPkg.rar (32.14 KB)
评分
参与人数 3威望 +3 收起 理由
_编程浪子 + 1 我很赞同
ddtx + 1
dong_abc + 1

相关帖子

沙发
西安农民工|  楼主 | 2011-11-10 21:55 | 只看该作者
unsigned char gudRxOK标志寄存器 = 0;
为什么代码传上去,这个变量后面成了中文???:o

使用特权

评论回复
板凳
hotpower| | 2011-11-10 22:22 | 只看该作者
用code

使用特权

评论回复
地板
highgear| | 2011-11-10 22:37 | 只看该作者
顶农民工

代码专业,简练,功底不凡。现在的农民工,不得了啊。

使用特权

评论回复
5
DownCloud| | 2011-11-10 23:44 | 只看该作者
又见好帖,顶西安农民工,手机登陆,明天学习之。

使用特权

评论回复
6
hotpower| | 2011-11-11 00:37 | 只看该作者
感觉这个农民工怎么像姐姐???

使用特权

评论回复
7
Cortex-M0| | 2011-11-11 05:39 | 只看该作者
感觉这个农民工怎么像菜农???

使用特权

评论回复
8
SLEET1986| | 2011-11-11 07:48 | 只看该作者
:Qbucuo

使用特权

评论回复
9
hotpower| | 2011-11-11 07:49 | 只看该作者
gudtail&=len-1不破坏流水线,当然51没有流水线了,非2的幂可以为%=len。
俺不会串口编程的。

使用特权

评论回复
10
渤海三叠浪| | 2011-11-11 08:28 | 只看该作者
本帖最后由 渤海三叠浪 于 2011-11-22 11:51 编辑

:)

使用特权

评论回复
11
陈永宾0| | 2011-11-11 08:38 | 只看该作者
PK使人进步系列

使用特权

评论回复
12
tuzihog| | 2011-11-11 08:40 | 只看该作者
留名研究一下!!!!!!!!1

使用特权

评论回复
13
HORSE7812| | 2011-11-11 10:23 | 只看该作者
你们真闲啊,还有时间PK

使用特权

评论回复
14
ddtx| | 2011-11-11 11:34 | 只看该作者
学习了,状态机用枚举,呵呵,以前没想到过,之前用就就是定义一个状态标志。

使用特权

评论回复
15
Ryanhsiung| | 2011-11-11 12:18 | 只看该作者
NO 贴出流程图最好了,不要贴程序

使用特权

评论回复
评论
阮天宇00 2012-12-17 13:05 回复TA
对头~顶一个 
16
wf850907| | 2011-11-11 12:37 | 只看该作者
挺好的

使用特权

评论回复
17
hotpower| | 2011-11-11 13:11 | 只看该作者
发送数据函数为何没有?最关键的看不见,晕。

使用特权

评论回复
18
univercity| | 2011-11-11 13:59 | 只看该作者
只有接收函数RI,没有发生函数TI?

使用特权

评论回复
19
dong_abc| | 2011-11-11 18:30 | 只看该作者
本帖最后由 dong_abc 于 2011-11-11 18:32 编辑

还有重点在TI,听过hotpower的滚筒洗衣机论调,也就是手动触发.没写个程序试一下,惭愧.好象还有个255

使用特权

评论回复
20
ic_ecore| | 2011-11-11 18:50 | 只看该作者
高手甚多

使用特权

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

本版积分规则

1

主题

17

帖子

1

粉丝