You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

169 lines
4.7 KiB
C

/* Includes ------------------------------------------------------------------*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <stdio.h>
#include <string.h>
#include "cmd.h"
#include "fifo.h"
#include "common.h"
#include "ca_cau.h"
#include "serial.h"
#include "modbus.h"
#include "hwgpio.h"
#include "ca_main.h"
#include "ca_CL106d.h"
//#include "ca_CL106d.h"
//#include "serial.h"
//#include "hwgpio.h"
cl106d_ctrl_t cl106d_ctrl;
int cl106d_checksum(unsigned char *pdata, int len)
{
int i;
unsigned char check = 0;
for(i = 1;i < len;i++)
{
check ^= *(pdata + i);
}
pdata[len] = check;
return 0;
}
int cl106d_packet(unsigned char *pbuf)
{
ClHead_t *head = (ClHead_t *)pbuf;
head->ucHead = 0x81;
head->ucRxID = 0x01;
head->ucTxID = 0x07;
head->ucLength = 0x06;
head->ucCmd = 0xc9;
int len = 5;
cl106d_checksum((unsigned char *)head, len);
len++;
return len;
}
/**********************************************************************
* : cl106d_connet
* :
* : none
*
* : none
* : 0:failure 1:success
* :
* : 2023/12/08
***********************************************************************/
int cl106d_connet()
{
int i;
int ret = 0;
int len = cl106d_packet(cl106d_ctrl.send_buf);
for (i = 0; i < 3; i++)
{
GPIO_ENABLE_SEND(1);
usleep(1000);
serial_write(cl106d_ctrl.fd, cl106d_ctrl.send_buf, len);
print_raw_data(cl106d_ctrl.send_buf, len);
usleep(1000*6);
GPIO_ENABLE_SEND(0);
len = serial_read(cl106d_ctrl.fd, cl106d_ctrl.recv_buf, sizeof(cl106d_ctrl.recv_buf));
printh("[%s:%d] len=%d\n", __FUNCTION__, __LINE__, len);
print_raw_data(cl106d_ctrl.recv_buf, len);
if (len > 0)
{
ret = 1;
break;
}
}
return ret;
}
/**********************************************************************
* : cl106d_setpower
* :
* : none
*
* : none
* : 0:failure 1:success
* :
* : 2023/12/08
***********************************************************************/
int cl106d_setpower(float vol,float cur)
{
int ret = 0;
printh("cl106dSetPower vol:%.5f cul:%.5f",vol,cur);
unsigned char cmdExample[] = {
0x81,0x01,0x07,0x49,0xA3,0x05,0x46,0x3F,
0x00,0x00,0x00,0x00,//#QUc 相位值放大 1 万倍取整: 120 * 10000 = 1200000 = 0x124F80
0x00,0x00,0x00,0x00,//#QUb
0x00,0x00,0x00,0x00,//#QUa
0x00,0x00,0x00,0x00,//#QIc
0x00,0x00,0x00,0x00,//#QIb
0x00,0x00,0x00,0x00,//#QIa 32 Byte
0xff,
0x00,0x00,0x00,0x00,0x00,//#UC 57.7 = 577000 * 10-4577000 = 0x8CDE8 -4 = FC
0x00,0x00,0x00,0x00,0x00,//#UB
0x00,0x00,0x00,0x00,0xfc,//#UA [43] 4位小数
0x00,0x00,0x00,0x00,0x00,//#IC
0x00,0x00,0x00,0x00,0x00,//#IB
0x00,0x00,0x00,0x00,0xfa,//#IA [58] 6位小数
0x20,0xA1,0x07,0x00,//#F 频率值放大 1 万倍取整: 50 * 10000 = 500000 = 0x7A120
0x07,0x07,0x3f,0x3f,0x00,
0x00//CS #校验和字节,替换为实际计算异或和 41Byte
}; //73Byte
unsigned int *pVal = (unsigned int *)&cmdExample[43];
*pVal = (unsigned int)(vol * 10000);
unsigned int *pcul = (unsigned int *)&cmdExample[58];
*pcul = (unsigned int)(cur * 1000000);
memcpy(cl106d_ctrl.send_buf,cmdExample,73);
cl106d_checksum(cl106d_ctrl.send_buf, 72);
int i = 0;
for ( i = 0; i < 10; i++)
{
GPIO_ENABLE_SEND(1);
usleep(1000);
serial_write(cl106d_ctrl.fd, cl106d_ctrl.send_buf, 73);
usleep((1040)*73);
usleep(1000);
print_raw_data(cl106d_ctrl.send_buf, 73);
GPIO_ENABLE_SEND(0);
int len = serial_read(cl106d_ctrl.fd, cl106d_ctrl.recv_buf, sizeof(cl106d_ctrl.recv_buf));
printh("[%s:%d] len=%d\n", __FUNCTION__, __LINE__, len);
print_raw_data(cl106d_ctrl.recv_buf, len);
if (len > 0)
{
ret = 1;
break;
}
else
{
GPIO_SHUTDOWN_PWR();
}
}
return ret;
}
int cl106d_init()
{
memset(&cl106d_ctrl,0,sizeof(cl106d_ctrl_t));
//2 打开串口
cl106d_ctrl.fd = serial_open("/dev/ttymxc3", 9600);
if (cl106d_ctrl.fd < 0)
{
printh("[%s:%d]serial_open failed!\n", __FUNCTION__, __LINE__);
return -1;
}
return 0;
}