📄 myusart.c
字号:
# include "MyUSART.h"
#include "sys.h"
#include "usart.h"
unsigned int g_UART_ISR_CNT = 0;
static unsigned char PC_Array_Buffer[30]={0};
static unsigned char Index=0;
static unsigned char Frame_Length = 0;
void Test_PORT_INIT(void)
{
//DDRC=0x0f;
//PORTC=0x0f;
}
void UART_Device_INIT(void)
{
/* CLI();
DDRE &= ~BIT(PE0);
PORTE |= BIT(PE0);
DDRE |= BIT(PE1);
PORTE |= BIT(PE1);
UCSR0B = 0x00; //disable while setting baud rate
UCSR0A = 0x00;
UCSR0C = 0x06;
UBRR0L = 0x17; //set baud rate lo
UBRR0H = 0x00; //set baud rate hi
UCSR0B = 0x98;
SEI();*/
}
//中断入口
//#pragma interrupt_handler UART0_RX_ISR:iv_USART0_RXC
void UART0_RX_ISR(void)
{
/*PC_Array_Buffer[Index] = UDR0;
if(Index < Frame_Length)
{
Index ++;
g_UART_ISR_CNT = USART_ISR_TOP; //串口发送速率计数,该变量在T0模块中自减
}*/
}
void UART0_RxIsrHandler(u8 rx_data)
{
PC_Array_Buffer[Index] = rx_data;
if((Index < Frame_Length) && (PC_Array_Buffer[0] == 0xaa))
{
Index ++;
}
}
//保证只有在收完一个数据帧后数据才才能实
//现数据拷贝
//函数增加返回值,判断是否有收到新数据
//修改日期:2008年,2月12日
unsigned char Get_PC_Data(unsigned char* p_Array, unsigned char ch_FL)
{
unsigned char i = 0;
if(Frame_Length != ch_FL)
{
Frame_Length = ch_FL;
}
if(Index == Frame_Length)
{
for(i=0; i< Frame_Length; i++)
{
p_Array[i] = PC_Array_Buffer[i];
}
Index = 0;
return 1;
}
return 0;
}
void UART_Send_Line(long Data ,
unsigned char Is_H,
unsigned char Line_ID)
{
signed char Temp_A_L;
signed char Temp_A_H;
signed char Temp_B_L;
signed char Temp_B_H;
unsigned char ch_XOR = 0;
Temp_A_L = Data;
Temp_A_H = Data>>8;
Temp_B_L = Data >> 16;
Temp_B_H = Data >> 24;
ch_XOR ^= 0x09;
ch_XOR ^= Line_ID;
ch_XOR ^= Temp_B_H;
ch_XOR ^= Temp_B_L;
ch_XOR ^= Temp_A_H;
ch_XOR ^= Temp_A_L;
UART_Transmit(0xaa);
UART_Transmit(0x09);
UART_Transmit(Line_ID);
if(Is_H) //是否是先发高字节?
{
UART_Transmit(Temp_B_H); //是
UART_Transmit(Temp_B_L);
UART_Transmit(Temp_A_H);
UART_Transmit(Temp_A_L);
}
else
{
UART_Transmit(Temp_A_L); //不是
UART_Transmit(Temp_A_H);
UART_Transmit(Temp_B_L);
UART_Transmit(Temp_B_H);
}
UART_Transmit(ch_XOR);
UART_Transmit(0x55);
}
//函数增加了判断是否有新数据被收到的条件
//修改日期:2008年,2月12日
unsigned char Get_PC_Rate(long int* p_Rate)
{
unsigned char Temp_Array[9] = {0};
unsigned char i =0;
long int Temp = 0;
long int Temp_Rate = 0;
static unsigned char ch_CMD = 0; //命令位用静态变量,保证数据能保持在
//上一次接收到的值(即不丢失)
if(Get_PC_Data(Temp_Array, 9)) //如果收到新数据才进行数据校验与恢复
{ //这样提高了查询速度
if((Temp_Array[0] == 0xaa)&&(Temp_Array[8] == 0x55))
{
for(i=3; i<7; i++)
{
Temp = Temp_Array[i];
Temp_Rate |= Temp_Array[i]<<((6-i)<<3);//8*(6-i)
}
ch_CMD = Temp_Array[2]; //获取命令位
*p_Rate = Temp_Rate; //获取数据位
}
}
return ch_CMD;
}
void UART_Transmit(unsigned char ch_Data)
{
/*while(!(UCSR0A&BIT(UDRE0)))
;
UDR0 = ch_Data;*/
USART1->DR = (u8) ch_Data;
while((USART1->SR&0X40)==0)
{
;//循环发送,直到发送完毕
}
}
void Display_A_String(unsigned char *p_STR)
{
while(*p_STR)
{
UART_Transmit(*p_STR ++);
}
}
unsigned char Is_Buffer_New(unsigned char* Buffer, unsigned char Buffer_Length)
{
unsigned char i = 0;
unsigned char Flag = 0;
static unsigned char Temp_Buffer[30] = {0};
{
for(i = 0; i< Buffer_Length; i++)
{
if(Temp_Buffer[i] != Buffer[i])
{
Temp_Buffer[i] = Buffer[i];
Flag = 1;
}
}
}
return Flag;
}
unsigned int Is_USART_ISR(void)
{
return g_UART_ISR_CNT;
}
////////////////////////////////////////////////////////////////////////////////
void UART_Debug(unsigned char Debug_Data)
{
UART_Transmit(0xaa);
UART_Transmit(Debug_Data);
UART_Transmit(0x55);
}
////////////////////////////////////////////////////////////////////////////////
void UART_SendData(unsigned char* pbuf, unsigned char length)
{
unsigned char i = 0;
pbuf[6] = 0;
for(i = 1; i < 6; i ++)
{
pbuf[6] ^= pbuf[i];
}
for(i = 0; i < length; i ++)
{
UART_Transmit(pbuf[i]);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -