微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > PK 使人进步:晒晒你的串口程序

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

时间:10-02 整理:3721RD 点击:
这是我做的一个简单的下位机程序,欢迎拍砖!
引用刘公公的一句话“能修改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;
        }
}
}

unsigned char gudRxOK标志寄存器 = 0;
为什么代码传上去,这个变量后面成了中文?

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

gudtail&=len-1不破坏流水线,当然51没有流水线了,非2的幂可以为%=len。
俺不会串口编程的。

Send_Data 函数定义被吃掉啦?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top