//设置串口参数,读取串口参数
//设置MAC地址,读取MAC地址,添加从节点MAC
//获取从节点列表,删除从节点MAC,清空MAC列表
//设置时间,读取时间
//复位命令
/*
主机与从机公用的功能:
1、设置/读取串口参数
2、设置/读取MAC地址
3、设置/读取时间
4、//复位命令
主机特有的功能:
1、添加从节点MAC
2、获取从节点列表
3、删除/(清空)从节点(列表)
*/
#include "includes.h"
unsigned char FSN=0;
unsigned char DSN=0;
unsigned char MAC_MAP[32][6];
unsigned char SEND_data[250];
unsigned char mac[6];
unsigned char RX_BUF[250];
//发送控制或设置/读取命令后的确认帧
unsigned char REST_START=0X00;
unsigned char SET_BUAD_START = 0X00;
unsigned char READ_NODE_START = 0X00;
unsigned char READ_BUAD_START =0X00;
unsigned char READ_MAC_START = 0X00;
unsigned char READ_TIME_START = 0X00;
unsigned char CLEAR_NODE_START = 0X00;
unsigned char SET_MAC_START = 0X00;
unsigned char SET_TIME_START = 0X00;
unsigned char SEND_DATA_START=0X00;
unsigned char ADD_MAC_START = 0X00;
unsigned char DEF_MAC_START = 0X00;
//发送命令帧后,返回的标志
unsigned char ADD_MAC_OK = 0X00;
//发送帧后返回帧的后续处理定位
unsigned char REST_ST=0X00;
unsigned char SET_BUAD_ST = 0X00;
unsigned char READ_NODE_ST = 0X00;
unsigned char READ_BUAD_ST =0X00;
unsigned char READ_MAC_ST = 0X00;
unsigned char READ_TIME_ST = 0X00;
unsigned char CLEAR_NODE_ST = 0X00;
unsigned char SET_MAC_ST = 0X00;
unsigned char SET_TIME_ST = 0X00;
unsigned char SEND_DATA_ST = 0X00;
unsigned char ADD_MAC_ST = 0X00;
unsigned char DEF_MAC_ST = 0X00;
//计算一组数据的校验码
unsigned char Calc_Msg_Checkcode(
unsigned char* in,
unsigned short in_len
)
{
unsigned short i,check_code=0;
for(i=0;i<in_len;i++)
check_code += in[i];
check_code &= 0xff;
return check_code;
}
//复位命令
unsigned char Fill_REST_Frame(unsigned char* SendBuf,unsigned char rest)
{
unsigned short tx_len = sizeof(PLC_Head_Frame) + sizeof(PLC_REST_Frame);
PLC_Head_Frame* Head_Frame ;
PLC_REST_Frame* pFrame = (PLC_REST_Frame*)&SendBuf[sizeof(PLC_Head_Frame)];
Head_Frame = (PLC_Head_Frame*)(SendBuf);
Head_Frame->Start_Sign[0] = 0xE8;
Head_Frame->Start_Sign[1] = 0xE8;
Head_Frame->Start_Sign[2] = 0xE8;
Head_Frame->Start_Sign[3] = 0x17;
Head_Frame->CON[0] = 0X20 + (FSN & 0X0F); //00 1 0 0000(自加)
FSN ++;
Head_Frame->CON[1] = 0x03;
Head_Frame->Length[0] = tx_len >> 8;
Head_Frame->Length[1] = tx_len;
pFrame->FC = 0X01; //
pFrame->CMD = 0X01//
pFrame->CD = rest; //
SendBuf[tx_len++] = Calc_Msg_Checkcode((SendBuf+6),(tx_len-4));
SendBuf[tx_len++] = 0xE9;
return tx_len;
}
//设置串口参数//获取从节点列表 设置串口参数 CMD = 1,获取从节点列表 CMD = 23
unsigned char Fill_SET_BAUD_Frame(unsigned char* SendBuf,unsigned char cmd,unsigned short MAC)
{
unsigned short tx_len = sizeof(PLC_Head_Frame) + sizeof(PLC_REST_Frame);
PLC_Head_Frame* Head_Frame ;
PLC_REST_Frame* pFrame = (PLC_REST_Frame*)&SendBuf[sizeof(PLC_Head_Frame)];
Head_Frame = (PLC_Head_Frame*)(SendBuf);
Head_Frame->Start_Sign[0] = 0xE8;
Head_Frame->Start_Sign[1] = 0xE8;
Head_Frame->Start_Sign[2] = 0xE8;
Head_Frame->Start_Sign[3] = 0x17;
Head_Frame->CON[0] = 0X20 + (FSN & 0X0F); //00 1 0 0000(自加)
FSN ++;
Head_Frame->CON[1] = 0x03;
Head_Frame->Length[0] = tx_len >> 8;
Head_Frame->Length[1] = tx_len;
pFrame->FC = 0X02; //
pFrame->CMD = cmd;//
if(cmd == 0x01)
{
pFrame->CD[0] = MAC >> 8; //
pFrame->CD[1] = MAC; //
}
if(cmd == 0x17)
{
pFrame->CD[0] = MAC >> 8; //
pFrame->CD[1] = MAC; //
}
SendBuf[tx_len++] = Calc_Msg_Checkcode((SendBuf+6),(tx_len-4));
SendBuf[tx_len++] = 0xE9;
return tx_len;
}
//读串口速率 CMD = 2 //读取MAC CMD = 11,//清空丛节点列表 CMD = 25 //读取时间 CMD = 31
unsigned char Fill_READ_Frame(unsigned char* SendBuf,unsigned char cmd)
{
unsigned short tx_len = sizeof(PLC_Head_Frame) + sizeof(PLC_READ_BAUD_Frame);
PLC_Head_Frame* Head_Frame ;
PLC_READ_BAUD_Frame* pFrame = (PLC_READ_BAUD_Frame*)&SendBuf[sizeof(PLC_Head_Frame)];
Head_Frame = (PLC_Head_Frame*)(SendBuf);
Head_Frame->Start_Sign[0] = 0xE8;
Head_Frame->Start_Sign[1] = 0xE8;
Head_Frame->Start_Sign[2] = 0xE8;
Head_Frame->Start_Sign[3] = 0x17;
Head_Frame->CON[0] = 0X20 + (FSN & 0X0F); //00 1 0 0000(自加)
FSN ++;
Head_Frame->CON[1] = 0x03;
Head_Frame->Length[0] = tx_len >> 8;
Head_Frame->Length[1] = tx_len;
pFrame->FC = 0X02; //
pFrame->CMD = cmd;//
if(cmd == 0x02)
{
//将相应的命令标志,进行设置
}
if(cmd == 0x0b)
{
//将相应的命令标志,进行设置
}
if(cmd == 0x19)
{
//将相应的命令标志,进行设置
}
if(cmd == 0x1f)
{
//将相应的命令标志,进行设置
}
pFrame->CD = 0; //
SendBuf[tx_len++] = Calc_Msg_Checkcode((SendBuf+6),(tx_len-4));
SendBuf[tx_len++] = 0xE9;
return tx_len;
}
//设置MAC CMD = 10 // 设置时间 CMD = 30
unsigned char Fill_SET_MAC_Frame(unsigned char* SendBuf,unsigned char cmd)
{
unsigned short tx_len = sizeof(PLC_Head_Frame) + sizeof(PLC_SET_MAC_Frame);
PLC_Head_Frame* Head_Frame ;
PLC_SET_MAC_Frame* pFrame = (PLC_SET_MAC_Frame*)&SendBuf[sizeof(PLC_Head_Frame)];
Head_Frame = (PLC_Head_Frame*)(SendBuf);
Head_Frame->Start_Sign[0] = 0xE8;
Head_Frame->Start_Sign[1] = 0xE8;
Head_Frame->Start_Sign[2] = 0xE8;
Head_Frame->Start_Sign[3] = 0x17;
Head_Frame->CON[0] = 0X20 + (FSN & 0X0F); //00 1 0 0000(自加)
FSN ++;
Head_Frame->CON[1] = 0x03;
Head_Frame->Length[0] = tx_len >> 8;
Head_Frame->Length[1] = tx_len;
pFrame->FC = 0X02; //
pFrame->CMD = cmd;//
if(cmd == 0x0A)
{
memcpy(Head_Frame->CD,xxxx,6);//需要在FLASH中定义一个变量,来存储该MAC地址,并要求在ARM屏上可设置
}
if(cmd == 0x1E)
{
pFrame->CD[0] = dec2bcd(g_rtc_time.second);
pFrame->CD[1] = dec2bcd(g_rtc_time.minute);
pFrame->CD[2] = dec2bcd(g_rtc_time.hour);
pFrame->CD[3] = dec2bcd(g_rtc_time.day_of_month);
pFrame->CD[4] = dec2bcd(g_rtc_time.month);
pFrame->CD[5] = dec2bcd(g_rtc_time.year);
}
SendBuf[tx_len++] = Calc_Msg_Checkcode((SendBuf+6),(tx_len-4));
SendBuf[tx_len++] = 0xE9;
return tx_len;
}
//添加从机MAC地址 0x16 //删除从机MAC地址 0x18
unsigned char Fill_ADD_MAC_Frame(unsigned char* SendBuf,unsigned char cmd, unsigned char num,unsigned char* MAC)
{
unsigned char i=0,j=0;
unsigned short tx_len = sizeof(PLC_Head_Frame);
PLC_Head_Frame* Head_Frame ;
Head_Frame = (PLC_Head_Frame*)(SendBuf);
Head_Frame->Start_Sign[0] = 0xE8;
Head_Frame->Start_Sign[1] = 0xE8;
Head_Frame->Start_Sign[2] = 0xE8;
Head_Frame->Start_Sign[3] = 0x17;
Head_Frame->CON[0] = 0X20 + (FSN & 0X0F); //00 1 0 0000(自加)
FSN ++;
Head_Frame->CON[1] = 0x03;
/* Head_Frame->Length[0] = tx_len >> 8;
Head_Frame->Length[1] = tx_len; */
SendBuf[tx_len++] = 0X02; //
SendBuf[tx_len++] = cmd;//
if(num < 32)
SendBuf[tx_len++] = num;
else
SendBuf[tx_len++] = num & 0x1f;
memcpy(SendBuf[tx_len],MAC,num*6);
tx_len += num*6;
SendBuf[tx_len++] = Calc_Msg_Checkcode((SendBuf+6),(tx_len-4));
SendBuf[tx_len++] = 0xE9;
Head_Frame->Length[0] = tx_len >> 8;
Head_Frame->Length[1] = tx_len;
return tx_len;
}
//数据发送请求,单帧
unsigned char Fill_SEND_DATA_Frame(unsigned char* SendBuf,unsigned char* mac, unsigned char* DATA)
{
unsigned char i=0,j=0;
unsigned short tx_len = sizeof(PLC_Head_Frame);
PLC_Head_Frame* Head_Frame ;
Head_Frame = (PLC_Head_Frame*)(SendBuf);
Head_Frame->Start_Sign[0] = 0xE8;
Head_Frame->Start_Sign[1] = 0xE8;
Head_Frame->Start_Sign[2