📄 uart.c.bak.bak.bak
字号:
#include <iom128v.h>
#include "Uart.h"
#include "Crc.h"
//============================================================
//计算和设置128的波特率参数 chenzuan 2006-03-16
#define BAUD 19200
#define CRYSTAL 7372800
#define BAUD_SETTING (unsigned char)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1)
#define BAUD_H (unsigned char)(BAUD_SETTING>>8)
#define BAUD_L (unsigned char)BAUD_SETTING
//============================================================
//函 数:void Init_Com(void)
//功 能:初始化串口设置
//入口参数:无
//返 回 值:无
//设 计 者:陈祖安
//创作时间:2006-03-16
//修改时间:
//修改目的:
//============================================================
void Init_Com(void)
{
UBRR0H = BAUD_H;
UBRR0L = BAUD_L;
UCSR0B = 0x18;
UCSR0C = 0x0E;
OCR0 = 0xEA;
TCCR0 = 0x0F;
}
//============================================================
//函 数:void Uart_PutChar(unsigned char Data)
//功 能:发送一个字符
//入口参数:发送的字符数据
//返 回 值:无
//设 计 者:陈祖安
//创作时间:2006-03-16
//修改时间:
//修改目的:
//============================================================
void Uart_PutChar(unsigned char Data)
{
while(!(UCSR0A & 0x20));
UDR0 = Data;
}
//============================================================
//函 数:int Uart_GetChar(void)
//功 能:接收一个字符
//入口参数:无
//返 回 值:返回-1接受数据错误,否则为接收到的一个字符数据
//设 计 者:陈祖安
//创作时间:2006-03-16
//修改时间:
//修改目的:
//============================================================
int Uart_GetChar(void)
{
unsigned char status,res;
if(!(UCSR0A&0x80))
return -1;
status = UCSR0A;
res = UDR0;
if(status & 0x1c)
return -1;
else
return res;
}
//============================================================
//函 数:void Uart_Send_Frame(unsigned char *Frame, int Len)
//功 能:发送一个字符串
//入口参数:*Frame发送一个字符串数据,Len发送的长度
//返 回 值:无
//设 计 者:陈祖安
//创作时间:2006-03-16
//修改时间:
//修改目的:
//============================================================
void Uart_Send_Frame(unsigned char *Frame, int Len)
{
while(Len > 0)
{
Uart_PutChar(*Frame);
Frame ++;
Len --;
}
}
//============================================================
//函 数:unsigned char Uart_Receive_Frame(unsigned char *Frame,
// int OverTime)
//功 能:接收一个字符串
//入口参数:*Frame接收一个字符串数据存放地址,OverTime超时时间
//返 回 值:无
//设 计 者:陈祖安
//创作时间:2006-03-16
//修改时间:
//修改目的:
//============================================================
unsigned char Uart_Receive_Frame(unsigned char *Frame,int OverTime)
{
int ByteData;
int TimerCount = 0;
int ReceiveLen = 0;
int Len = 255;
while(ReceiveLen < Len)
{
while((ByteData = Uart_GetChar()) == -1)
{
if(TIFR& 0x02)
{
if(++TimerCount > OverTime)
return 0;//等待超时如果还没接收到数据,则返回数据长度0
TIFR=TIFR|0x02;
}
}
Frame[ReceiveLen] = (unsigned char)ByteData;
if(ReceiveLen == 0x04)
Len = Frame[ReceiveLen] + 0x02;
ReceiveLen ++;
TimerCount = 0;
}
return ReceiveLen;
}
//============================================================
//函 数:void PC_Send_Err(unsigned char Ret,unsigned char *SendBuf)
//功 能:向PC返回执行结果
//入口参数:结果代码,发送缓冲区
//返 回 值:无
//设 计 者:陈祖安
//创作时间:2006-03-16
//修改时间:
//修改目的:
//============================================================
void PC_Send_Err(unsigned char Err_Ret,unsigned char *SendBuf)
{
unsigned short Crc_Data;
SendBuf[0] = 0x45;
SendBuf[1] = 0x52;
SendBuf[2] = 0x00;
SendBuf[3] = 0x05;
SendBuf[4] = Err_Ret;
Crc_Data = CRC16(SendBuf,5);
SendBuf[5] = Crc_Data / 0x100;
SendBuf[6] = (unsigned char)Crc_Data;
Uart_Send_Frame(SendBuf, 7);
}
//============================================================
//函 数:void PC_Send_Ok(unsigned char *Ok_Frame,unsigned char Ok_Coad,
// unsigned char *SendBuf,int Len)
//功 能:向PC返回执行结果
//入口参数:发送数据,结果代码,发送缓冲区,发送数据长度
//返 回 值:无
//设 计 者:陈祖安
//创作时间:2006-03-16
//修改时间:
//修改目的:
//============================================================
void PC_Send_Ok(unsigned char *Ok_Frame,unsigned char Ok_Coad,unsigned char *SendBuf,int Len)
{
int i;
unsigned short Crc_Data;
SendBuf[0] = 0x4F;
SendBuf[1] = 0x4B;
SendBuf[2] = 0x00; //包序号
SendBuf[3] = 0x04 + Len; //数据长度
if(Len == 1)
SendBuf[4] = Ok_Coad;
else if(Len > 1)
{
for(i = 0;i < Len;i ++)
SendBuf[4+i] = Ok_Frame[i];
}
else
SendBuf[4] = 0;
Crc_Data = CRC16(SendBuf,4+Len);
SendBuf[Len+4] = Crc_Data / 0x100;
SendBuf[Len+5] = (unsigned char)Crc_Data;
Uart_Send_Frame(SendBuf, Len+6);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -