📄 mock_uart._c
字号:
//模拟串口通讯
#include"include.h"
#define TX_LO() PORTD &= ~(1<<4) //发送端口
#define TX_HI() PORTD |= (1<<4)
#define RX_Port() (PIND&(1<<2)) //接收端口
unsigned char F_TM;
//TIMER0 initialize - prescale:8
// WGM: Normal
// desired value: 104uSec
// actual value: 104.000uSec (0.0%)
void Timer0_init(void)
{
TCCR0 = 0x00; //stop
TCNT0 = 0x30; //set count
OCR0 = 0xD0; //set compare
}
#pragma interrupt_handler Timer0_ovf_isr:10
void Timer0_ovf_isr(void)
{
TCNT0 = 0x30; //reload counter value
F_TM = 1;
}
//------------------------------------------------------------------------------
//发送一个字符
void PSendChar(unsigned char inch)
{
unsigned char ii;
ii=0;
F_TM=0;
TX_LO(); //start bit
TCCR0 = 0x02; //start timer
while(!F_TM);
while(ii<8)
{
if(inch&1)
{
TX_HI();
}
else
{
TX_LO();
}
F_TM=0;
while(!F_TM);
ii++;
inch>>=1;
}
TX_HI();
F_TM=0;
while(!F_TM);
TCCR0 = 0x00; //stop//停止timer
}
//------------------------------------------------------------------------------
//接收一个字符
unsigned char PGetChar()
{
unsigned char ii,rch;
TCCR0 = 0x02; //start timer
F_TM=0;
ii=0;
rch=0;
while(!F_TM); //等过起始位
while(ii<8)
{
rch>>=1;
if(RX_Port())
{
rch|=0x80;
}
ii++;
F_TM=0;
while(!F_TM);
}
F_TM=0;
while(!F_TM)
{
if(RX_Port())
{
break;
}
}
TCCR0 = 0x00; //stop//停止timer
return rch;
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//发送数据
void BUS_SendPacket_51Device(void)
{
unsigned char i,tmp;
unsigned int CRC,Count;
static unsigned char *C51_uart;
struct Device51_StructOfProtocol *C51_buf;
C51max485_on();
PSendChar(BOOT_CODE);
PSendChar(BOOT_CODE);//发送引导码
PSendChar(DEVICE_NUMBER);//发送系统设备号
C51_buf = (struct Device51_StructOfProtocol *)C51Buffer485;
Count = C51_buf->Length;
if(Count&&(Count<= 256))
{
C51_uart = C51Buffer485; /*初始化数据发送指针*/
CRC = 0xffff; /*初始化校验码*/
Count += 3;
for(i=0;i<Count;i++)
{
tmp = *C51_uart++; /*取发送数据*/
PSendChar(tmp);
CRC16(&CRC,tmp);
}
PSendChar(CRC>>8);
PSendChar(CRC);//发送校验码
}
C51max485_off();
Power_LED_Drown();
}
//------------------------------------------------------------------------------
//接收数据
unsigned char BUS_GetPacket_51Device(void)
{
unsigned char tmp;
static unsigned int CRC,Count;
static unsigned char *C51_uart;
struct Device51_StructOfProtocol *C51_buf;
struct Device51_Address *Device51;
if(PGetChar()!=BOOT_CODE) return 1;
if(PGetChar()!=BOOT_CODE) return 1;
if(PGetChar()!=DEVICE_NUMBER) return 1;
CRC = 0xffff; /*初始化校验码*/
C51_uart = C51Buffer485; /*初始化数据接收指针*/
tmp = PGetChar();
*C51_uart++ = tmp; /*接收地址*/
CRC16(&CRC,tmp); /*数据校验*/
tmp = PGetChar();
*C51_uart++ = tmp; /*接收包长度低位字节*/
CRC16(&CRC,tmp); /*数据校验*/
tmp = PGetChar();
*C51_uart++ = tmp; /*接收包长度高位字节*/
CRC16(&CRC,tmp); /*数据校验*/
C51_buf = (struct Device51_StructOfProtocol *)C51Buffer485;
Count = C51_buf->Length;
if (Count && Count <= (256 - 8))
{
do{
*C51_uart++ = tmp; /*接收数据*/
CRC16(&CRC,tmp); /*数据校验*/
}while(Count--);
}
else
return 1;
CRC16(&CRC,PGetChar()); /*数据校验*/
CRC16(&CRC,PGetChar()); /*数据校验*/
C51_buf = (struct Device51_StructOfProtocol *)C51Buffer485;
if (!CRC)
//接收完数据
return 0;
else
return 1;
}
//------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -