#include <stdio.h>
#include <string.h>
#include <math.h>
#include "serial.c"
#define TRUE 1
#define FALSE 0
unsigned char m_csendbuf[200];
unsigned char m_crecvbuf[200];
unsigned char m_creg[50];
int fd;
// 初始化端口
char init_com(char *name,int bandrate,int databits,int stopbits,char parity)
{
fd = init_serial(name);
if(fd>0)
set_speed(fd,bandrate);
else
{
printf("Can't Open Serial Port!\n");
exit(0);
}
if(set_parity(fd,databits,stopbits,parity) == FALSE)
{
printf("Set Parity Error\n");
exit(0);
}
printf("\nSuccess set\n");
return TRUE;
}
//
//函数名称:Xor_Chek
//函数功能:形成异或校验和
//函数参数:BYTE* pData(数据缓冲地址)
// int nData(数据长度)
//函数返回:异或校验和
//
char xor_check(char *pdata,int ndata)
{
char cxor=0x00;
int i;
for(i=0;i<ndata;i++)
{
cxor^=*(pdata+i);
}
return cxor;
}
//
//函数名称:Add_Chek
//函数功能:形成累加校验和
//函数参数:BYTE* pData(数据缓冲地址)
//int nData(数据长度)
//函数返回:累加校验和
//
char add_check(char * pdata, int ndata)
{
char cadd=0x00;
int i;
for(i=0;i<ndata;i++)
cadd+=*(pdata+i);
return cadd;
}
//设置一个桢,用于上下位机通信。
int frame_make(char cfunc,char reg_start,char reg_num,char *pdata,int ndata)
{
int i;
if(cfunc == 0x03)
{
m_csendbuf[0] = 0xa5; // head
m_csendbuf[1] = 0x01; // addr
m_csendbuf[2] = 0x03; // command
m_csendbuf[3] = reg_start;
m_csendbuf[4] = reg_num;
m_csendbuf[5] = 0;
m_csendbuf[6] = add_check(m_csendbuf,5);// 累加校验和
m_csendbuf[7] = xor_check(m_csendbuf,5);// 异或校验和
return 8;
}
else if(cfunc == 0x16)
{
m_csendbuf[0] = 0xa5; // head
m_csendbuf[1] = 0x01; // addr
m_csendbuf[2] = 0x16; // command
m_csendbuf[3] = reg_start;
m_csendbuf[4] = reg_num;
for(i=0;i<reg_num;i++)
{
m_csendbuf[5+i] = *((char*)(pdata)+i);
}
m_csendbuf[5+i] = add_check(m_csendbuf,i+5);// 累加校验和
m_csendbuf[6+i] = xor_check(m_csendbuf,i+5);// 异或校验和
return 7+i;
}
else
{
return -1;
}
}
//
//函数名称:UnPack
//函数功能:将从串口读取的数据根据功能号解包
//函数参数:int nFunc (功能号)
// int nBuffer(读取的数据缓冲长度)
//函数返回:成功解包则返回TRUE;否则FALSE。
//
char unpack(int nfunc, int nbuffer)
{
char reg_start, reg_num;
int i;
if(nfunc==0x03)// read from the slave cpu
{
// 帧头不对
if(m_crecvbuf[0]!=0xa5)
{
printf("header wrong!");
printf("得到的数据:%x",m_crecvbuf[0]);
return FALSE;
}
// 表址不对
if(m_crecvbuf[1]!=0x01)
{
printf("adress wrong!");
return FALSE;
}
// 命令标志字不对
if(m_crecvbuf[2]!=0x03)
{
printf("command wrong!");
return FALSE;
}
// 检查校验和是否正确
char cxor=xor_check(m_crecvbuf,nbuffer-2);
if(cxor!=m_crecvbuf[nbuffer-1])
{
printf("xor wrong!");
// return FALSE;
}
char cadd=add_check(m_crecvbuf,nbuffer-2);
if(cadd!=m_crecvbuf[nbuffer-2])
{
printf("add wrong!");
// return FALSE;
}
// 解析读取的寄存器
reg_start = m_crecvbuf[3];
reg_num = m_crecvbuf[4];
for(i=0; i<reg_num; i++)
{
m_creg[reg_start+i] = m_crecvbuf[5+i];
}
return TRUE;
}
else
return FALSE;
}
//
//发送数据
//
int sendout_buf(int isend)
{
return write(fd,m_csendbuf,isend);
}
//
//接收数据
//
unsigned char *read_data()
{
int i;
int read_num2 = m_crecvbuf[2];
int reg_start = m_crecvbuf[3];
static unsigned char read_buf[200];
for(i=0;i<read_num2;i++)
{
read_buf[i] = m_creg[reg_start+i];
printf("得到的数据:%d\n",read_buf[i]);
}
return read_buf;
}
//
//从串口读数据
//
int read_com()
{
int read_num = m_csendbuf[4];
return read(fd,m_crecvbuf,read_num+7);
//
}
评论1