📄 vfdb.c
字号:
/****************************************
*名称:vfdb.c
*功能:
****************************************/
#include "includes.h"
/*address*/
# define BROADCAST 0x00
/*starting address*/
# define TEL_ADDR 0x0900 //通讯地址
/*function*/
# define READREG 0x03 //读出寄存器内容
# define WRITEONE 0x06 //写入一笔资料至寄存器
# define WRITECHECK 0x08 //回路侦测
# define WRITEMORE 0x10 //写入多笔资料至寄存器
# define STX 0x3A
# define CR 0x0D
# define LF 0x0A
/****************************************
*名称:Send_datatrans()
*功能:发送前将输入数据转换成相应HEX格式,例如将0(0x00)-->'0'(0x30),A(0x0a)-->'A'(0x41)
*说明:输入数据必须要在0~F(HEX)之间
*入口函数:
*出口函数:
****************************************/
static UINT8 Send_datatrans(UINT8 t_data)
{
UINT8 r_data;
if(( t_data >= 0 )&&( t_data <= 9 )) r_data = t_data + 0x30;
else if(( t_data >=10 )&&( t_data <= 15 )) r_data = t_data + 0x37;
else r_data = 0;
return r_data;
}
/****************************************
*名称:Send_vfdbbyte()
*功能:
****************************************/
static void send_vfdbbyte( UINT8 s_data)
{
Sendbyte(Send_datatrans(s_data>>4));
Sendbyte(Send_datatrans(s_data & 0x0f));
}
/****************************************
*名称:Send_vfdbword()
*功能:
****************************************/
static void send_vfdbword( UINT16 s_data)
{
Sendbyte(Send_datatrans((UINT8)(s_data>>12)));
Sendbyte(Send_datatrans((UINT8)((s_data & 0x0f00)>>8)));
Sendbyte(Send_datatrans((UINT8)((s_data & 0x00f0)>>4)));
Sendbyte(Send_datatrans((UINT8)(s_data & 0x000f)));
}
/****************************************
*名称:Send_readreg()
*功能:完成读出寄存器数据发送指令
*说明:
STX---Address---Function---Starting Address---Number of data(count by word)---LRC Check---END
*入口函数:addr:通讯地址;s_addr:操作起始地址;num:操作数据笔数(word)
*出口函数:
****************************************/
void Send_readreg(UINT8 addr, UINT16 s_addr,UINT16 num)
{
UINT8 lrc_data;
//lrc_data = 0xff - (addr + READREG + (UINT8)(s_addr>>8) + (UINT8)(s_addr&0x00ff) + (UINT8)(num>>8) + (UINT8)(num&0x00ff));
lrc_data = ~(addr + READREG + (UINT8)(s_addr>>8) + (UINT8)(s_addr&0x00ff) + (UINT8)(num>>8) + (UINT8)(num&0x00ff)) + 1;
// lrc_data =0xd7;
/*START*/
Sendbyte(STX);
/*address*/
send_vfdbbyte(addr);
/*function*/
send_vfdbbyte(READREG);
/*starting address*/
send_vfdbword(s_addr);
/*number of data (count by word)*/
send_vfdbword(num);
/*LRC check*/
send_vfdbbyte(lrc_data);
/*END*/
Sendbyte(CR);
Sendbyte(LF);
}
/****************************************
*名称:Send_writeone()
*功能:完成发送一笔数据到固定地址
*说明:
STX---Address---Function---Data Address---Data content---LRC Check---END
*入口函数:addr:通讯地址;d_addr:写入数据起始地址;w_data:写入数据
*出口函数:
****************************************/
void Send_writeone(UINT8 addr,UINT16 d_addr,volatile UINT16 w_data)
{
UINT8 lrc_data;
lrc_data = ~(addr + WRITEONE + (UINT8)(d_addr>>8) + (UINT8)(d_addr&0x00ff) + (UINT8)(w_data>>8) + (UINT8)(w_data&0x00ff)) + 1;
/*START*/
Sendbyte(STX);
/*address*/
send_vfdbbyte(addr);
/*function*/
send_vfdbbyte(WRITEONE);
/*data address*/
send_vfdbword(d_addr);
/*data content*/
send_vfdbword(w_data);
/*LRC check*/
send_vfdbbyte(lrc_data);
/*END*/
Sendbyte(CR);
Sendbyte(LF);
}
/****************************************
*名称:Send_writecheck()
*功能:完成一次数据发送,回路侦测
*说明:
STX---Address---Function---Starting Address---Number of data(count by word)---LRC Check---END
*入口函数:addr:通讯地址;d_addr:写入数据起始地址;w_data:写入数据
*出口函数:
****************************************/
void Send_writecheck(UINT8 addr,UINT16 d_addr,volatile UINT16 w_data)
{
UINT8 lrc_data;
lrc_data = ~(addr + WRITECHECK + (UINT8)(d_addr>>8) + (UINT8)(d_addr&0x00ff) + (UINT8)(w_data>>8) + (UINT8)(w_data&0x00ff)) + 1;
/*START*/
Sendbyte(STX);
/*address*/
send_vfdbbyte(addr);
/*function*/
send_vfdbbyte(WRITECHECK);
/*data address*/
send_vfdbword(d_addr);
/*data content*/
send_vfdbword(w_data);
/*LRC check*/
send_vfdbbyte(lrc_data);
/*END*/
Sendbyte(CR);
Sendbyte(LF);
}
/****************************************
*名称:Send_writemore()
*功能:完成发送一笔数据到固定地址
*说明:
STX---Address---Function---Data Address---Data content---LRC Check---END
*入口函数:addr:通讯地址;d_addr:写入数据起始地址;w_data:写入数据地址
*出口函数:
****************************************/
void Send_writemore(UINT8 addr,UINT16 d_addr, UINT16 num,volatile UINT16 *w_data)
{
UINT8 lrc_data;
UINT8 num_byte;
volatile UINT16 i,w_datareg;
num_byte = (UINT8)num*2;
lrc_data = addr + WRITEMORE + (UINT8)(d_addr>>8) + (UINT8)(d_addr&0x00ff) + (UINT8)(num>>8) + (UINT8)(num&0x00ff);
/*START*/
Sendbyte(STX);
/*address*/
send_vfdbbyte(addr);
/*function*/
send_vfdbbyte(WRITEMORE);
/*data address*/
send_vfdbword(d_addr);
/*number of data(word)*/
send_vfdbword(num);
/*number of data(byte)*/
send_vfdbbyte(num_byte);
for(i=0;i<num;i++)
{
w_datareg = *w_data;
lrc_data += ((UINT8)(w_datareg>>8) + (UINT8)(w_datareg&0x00ff));
w_data++;
/*data content*/
send_vfdbword(w_datareg);
}
/*LRC check*/
lrc_data = ~lrc_data + 1;
send_vfdbbyte(lrc_data);
/*END*/
Sendbyte(CR);
Sendbyte(LF);
}
/****************************************
*名称:Send_testbyte()
*功能:测试函数,测试接收后的函数发送出去,数据以字节格式提供
****************************************/
void Send_testbyte(UINT8 *p_data,UINT8 num)
{
UINT8 i;
UINT8 test_data;
UINT8 *p_datareg;
p_datareg = p_data;
for(i=0;i<num;i++)
{
test_data = *p_datareg;
send_vfdbbyte(test_data);
p_datareg++;
}
Sendbyte(CR);
Sendbyte(LF);
}
/****************************************
*名称:Send_testword()
*功能:测试函数,测试接收后的函数发送出去,数据以字节格式提供
****************************************/
void Send_testword(UINT16 *p_data,UINT8 num)
{
UINT8 i;
UINT16 test_data;
UINT16 *p_datareg;
p_datareg = p_data;
for(i=0;i<num;i++)
{
test_data = *p_datareg;
send_vfdbbyte((UINT8)(test_data>>8));
send_vfdbbyte((UINT8)test_data);
p_datareg++;
}
Sendbyte(CR);
Sendbyte(LF);
}
/****************************************
*
*Broadcast all and get the Address
*****************************************/
void Broadcast (void)
{
Send_readreg(BROADCAST,TEL_ADDR,1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -