📄 gm16c550.c
字号:
#include "stdafx.h"
data unsigned char ReceiveSBUF;
unsigned char step = 0;
unsigned char indexMeter = 0;
unsigned char flagMeter;
unsigned char meterOvertimeFlag = 0; // 读电表超时使能 0: 不进行超时计数 1:进行超时计数
unsigned char meterOTCounter = 0; // 读电表超时计数器
unsigned int len = 0;
unsigned char BuffMeter[30];
struct GM16c550_data
{unsigned char n;//
unsigned char index;
unsigned char *d;
}GM16c550_recive_datastream;
//=================================================================================================
void GM16c550_set_BTL(unsigned char cs)
{GM16c550_LCR=0x80;
switch(cs)
{case 1: GM16c550_DLL=0x80; GM16c550_DLM=0x01; break;//600
case 2: GM16c550_DLL=0xc0; GM16c550_DLM=0x00; break;//1200
case 3: GM16c550_DLL=0x80; GM16c550_DLM=0x00; break;//1800
case 4: GM16c550_DLL=0x60; GM16c550_DLM=0x00; break;//2400
case 5: GM16c550_DLL=0x30; GM16c550_DLM=0x00; break;//4800
case 6: GM16c550_DLL=0x18; GM16c550_DLM=0x00; break;//9600
case 7: GM16c550_DLL=0x0c; GM16c550_DLM=0x00; break;//19200
case 8: GM16c550_DLL=0x06; GM16c550_DLM=0x00; break;//38400
default : GM16c550_DLL=0x18; GM16c550_DLM=0x00; break;//9600
}
GM16c550_LCR&=0x1b;
return;
}
//=================================================================================================
void GM16c550_init(void)
{
GM16c550_set_BTL(2);
GM16c550_LCR=0x1b;//03;//1b;//无奇偶校验、数据位为8位、停止位1位
GM16c550_FCR=0x07;//00:禁止FIFO模式 07:FIFO设置
GM16c550_IER=0x01;//01;//使能接收和发送中断03b 7;//开启接收器线状
//GM16c550_ISR=0x3f;//05;//???????????????
//GM16c550_MCR=0x03;//?????????
IT1 = 1;
EX1=1;
// IP=0x40;
}
//=================================================================================================
bit GM16c550_send(unsigned char datastr[20],unsigned int n)
{
unsigned char j;
unsigned int i;
unsigned long k;
bit ok=1;
RS485_en=0;
delay(5);
delay(250);
i=0;
for(i=0;i<=n&&ok;i++)
{
j=GM16c550_LSR;
k=0;
while((!(j&0x60))&&(k<wait_limit))
{
j=GM16c550_LSR;
delay(1);
k++;
}
if(k<wait_limit)
GM16c550_THR=datastr[i];
else
{
ok=0;
GM16c550_init();//?????????
}
delay(50);
}
delay(5);
RS485_en=1;;
return ok;
}
//=================================================================================================
void GM16c550_recive_byte(void) interrupt 2
{
EX1 = 0;
ReceiveSBUF = GM16c550_RHR;
recv645();
EX1 = 1;
}
// 接收电表645规约
void recv645() reentrant
{
switch(step)
{
case 0: // 帧头
{
if(ReceiveSBUF == 0x68)
{
BuffMeter[indexMeter++] = ReceiveSBUF;
step++;
// 485Timer = 0;
// 485Timerflag = 1;
}
}
break;
case 1: // 电表地址
case 2:
case 3:
case 4:
case 5:
case 6:
{
BuffMeter[indexMeter++] = ReceiveSBUF;
step++;
}
break;
case 7: // 帧头
{
if(ReceiveSBUF == 0x68)
{
BuffMeter[indexMeter++] = ReceiveSBUF;
step++;
}
else
{
flagMeter = 0;
indexMeter = 0;
step = 0;
}
}
break;
case 8: //控制码
{
BuffMeter[indexMeter++] = ReceiveSBUF;
step++;
}
break;
case 9: // 数据长度
{
len = 0;
BuffMeter[indexMeter++] = ReceiveSBUF;
step++;
}
break;
case 10: // 读取数据
{
BuffMeter[indexMeter++] = ReceiveSBUF;
len ++;
if(len == BuffMeter[9])
step ++;
}
break;
case 11: // 读取校验
{
BuffMeter[indexMeter++] = ReceiveSBUF;
step++;
}
break;
case 12: // 读取结束符
{
if(ReceiveSBUF == 0x16)
{
BuffMeter[indexMeter] = ReceiveSBUF;
flagMeter = 1;
step = 0;
meterOTCounter = 0; // 清超时计数器
meterOvertimeFlag = 0; // 清超时定时器
}
else
{
flagMeter = 0;
indexMeter = 0;
step = 0;
}
}
break;
default:
{
flagMeter = 0;
indexMeter = 0;
step = 0;
}
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -