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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/* 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;
}