#include "YsOiwY516A.h" #include #include #define YS_OIW_Y516A_READ_FLAG 0x10 // 表示写数据指令 #define YS_OIW_Y516A_WRITE_FLAG 0x03 // 表示读数据指令 /* YsChl515A初始化函数 */ int YsOiw516AInit(ys_oiw_y516a_dev *dev) { int rt = 0; /* 设置ID */ rt = YsOiw516ASetDevAddr(dev); if (rt < 0) { return -1; } /* 设置校准值 */ rt = YsOiw516ASetDevCalib(dev); if (rt < 0) { return -1; } dev->DelayMs(2000); return 0; } /* 设置设备ID */ int YsOiw516ASetDevAddr(ys_oiw_y516a_dev *dev) { uint16_t Crc16 = 0xffff; uint8_t wdata[11] = {0x01,0x10,0x30,0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x00}; uint8_t rdata[8]= {0}; if (dev->OldDevAddr == dev->NewDevAddr) { return 0; // 不需要设置 } wdata[0] = (uint8_t)((dev->OldDevAddr) & 0x00ff); // 写入旧地址 wdata[7] = (uint8_t)((dev->NewDevAddr) & 0x00ff); // 写入新地址低位 wdata[8] = (uint8_t)(((dev->NewDevAddr) & 0xff00) >> 8); // 写入新地址高位 dev->Crc(wdata, 9, &Crc16); wdata[9] = (uint8_t)(Crc16 & 0x00ff); wdata[10] = (uint8_t)((Crc16 & 0xff00) >> 8); dev->Write(wdata, sizeof(wdata)); dev->Read(rdata, sizeof(rdata)); /* 检验接收数据 */ if (rdata[0] != dev->OldDevAddr) { return -1; } Crc16 = 0xffff; dev->Crc(rdata, 6, &Crc16); if (Crc16 != ((((uint16_t)rdata[7]) << 8) | rdata[6])) { return -1; } return 0; } /* 设置线性校验值 */ int YsOiw516ASetDevCalib(ys_oiw_y516a_dev *dev) { uint32_t TempK = 0; uint32_t TempB = 0; uint16_t Crc16 = 0xffff; uint8_t wdata[17] = {0x01,0x10,0x11,0x00,0x00,0x04,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; uint8_t rdata[8] = {0}; memcpy(&TempK, &(dev->Calib.k), sizeof(uint32_t)); memcpy(&TempB, &(dev->Calib.b), sizeof(uint32_t)); wdata[0] = (uint8_t)((dev->NewDevAddr) & 0x00ff); wdata[10] = (uint8_t)((TempK & 0xff000000) >> 24); wdata[9] = (uint8_t)((TempK & 0x00ff0000) >> 16); wdata[8] = (uint8_t)((TempK & 0x0000ff00) >> 8); wdata[7] = (uint8_t)((TempK & 0x000000ff) >> 0); wdata[14] = (uint8_t)((TempB & 0xff000000) >> 24); wdata[13] = (uint8_t)((TempB & 0x00ff0000) >> 16); wdata[12] = (uint8_t)((TempB & 0x0000ff00) >> 8); wdata[11] = (uint8_t)((TempB & 0x000000ff) >> 0); dev->Crc(wdata, 15, &Crc16); wdata[15] = (uint8_t)(Crc16 & 0x00ff); wdata[16] = (uint8_t)((Crc16 & 0xff00) >> 8); dev->Write(wdata, sizeof(wdata)); dev->Read(rdata, sizeof(rdata)); /* 检验接收数据 */ if (rdata[0] != (uint8_t)((dev->NewDevAddr) & 0x00ff)) { return -1; } Crc16 = 0xffff; dev->Crc(rdata, 6, &Crc16); if (Crc16 != ((((uint16_t)rdata[7]) << 8) | rdata[6])) { return -1; } return 0; } /* 开始测量 */ int YsOiw516ADevStartMeasure(ys_oiw_y516a_dev *dev) { uint16_t Crc16 = 0xffff; uint8_t wdata[8] = {0x01,0x03,0x25,0x00,0x00,0x01,0x00,0x00}; uint8_t rdata[7] = {0}; wdata[0] = (uint8_t)((dev->NewDevAddr) & 0x00ff); dev->Crc(wdata, 6, &Crc16); wdata[6] = (uint8_t)(Crc16 & 0x00ff); wdata[7] = (uint8_t)((Crc16 & 0xff00) >> 8); dev->Write(wdata, sizeof(wdata)); dev->Read(rdata, sizeof(rdata)); if (rdata[0] != (uint8_t)((dev->NewDevAddr) & 0x00ff)) { return -1; } Crc16 = 0xffff; dev->Crc(rdata, 5, &Crc16); if (Crc16 != ((((uint16_t)rdata[6]) << 8) | rdata[5])) { return -1; } return 0; } /* 停止测量 */ int YsOiw516ADevStopMeasure(ys_oiw_y516a_dev *dev) { uint16_t Crc16 = 0xffff; uint8_t wdata[8] = {0x01,0x03,0x2E,0x00,0x00,0x01,0x00,0x00}; uint8_t rdata[7] = {0}; wdata[0] = (uint8_t)((dev->NewDevAddr) & 0x00ff); dev->Crc(wdata, 6, &Crc16); wdata[6] = (uint8_t)(Crc16 & 0x00ff); wdata[7] = (uint8_t)((Crc16 & 0xff00) >> 8); dev->Write(wdata, sizeof(wdata)); dev->Read(rdata, sizeof(rdata)); if (rdata[0] != (uint8_t)((dev->NewDevAddr) & 0x00ff)) { return -1; } Crc16 = 0xffff; dev->Crc(rdata, 5, &Crc16); if (Crc16 != ((((uint16_t)rdata[6]) << 8) | rdata[5])) { return -1; } return 0; } /* 获取温度和水中油值 */ int YsOiw516ADevGetOiwAndTemp(ys_oiw_y516a_dev *dev, ys_oiw_y516a_data* data) { uint32_t temp1 = 0; float temp2 = 0.0f; uint16_t Crc16 = 0xffff; uint8_t wdata[8] = {0x01,0x03,0x26,0x00,0x00,0x05,0x00,0x00}; uint8_t rdata[15] = {0}; wdata[0] = (uint8_t)((dev->NewDevAddr) & 0x00ff); dev->Crc(wdata, 6, &Crc16); wdata[6] = (uint8_t)(Crc16 & 0x00ff); wdata[7] = (uint8_t)((Crc16 & 0xff00) >> 8); dev->Write(wdata, sizeof(wdata)); dev->Read(rdata, sizeof(rdata)); if (rdata[0] != (uint8_t)((dev->NewDevAddr) & 0x00ff)) { return -1; } Crc16 = 0xffff; dev->Crc(rdata, 13, &Crc16); if (Crc16 != ((((uint16_t)rdata[14]) << 8) | rdata[13])) { return -1; } /* 获取温度值 */ if (data->TempIndex == YS_OIW_Y516A_DEV_ENABLE) { temp1 = ((uint32_t)rdata[6] << 24) | ((uint32_t)rdata[5] << 16) | ((uint32_t)rdata[4] << 8) | ((uint32_t)rdata[3] << 0); memcpy(&temp2, &temp1, sizeof(float)); data->Temp = temp2; } /* 获取水中油的值 */ if (data->OiwIndex == YS_OIW_Y516A_DEV_ENABLE) { temp1 = ((uint32_t)rdata[10] << 24) | ((uint32_t)rdata[9] << 16) | ((uint32_t)rdata[8] << 8) | ((uint32_t)rdata[7] << 0); memcpy(&temp2, &temp1, sizeof(float)); data->Oiw = temp2; } return 0; } /* 获取软件和硬件版本 */ int YsOiw516ADevGetVersion(ys_oiw_y516a_dev *dev) { uint16_t Crc16 = 0xffff; uint8_t wdata[8] = {0x01,0x03,0x07,0x00,0x00,0x02,0x00,0x00}; uint8_t rdata[9] = {0}; wdata[0] = (uint8_t)((dev->NewDevAddr) & 0x00ff); dev->Crc(wdata, 6, &Crc16); wdata[6] = (uint8_t)(Crc16 & 0x00ff); wdata[7] = (uint8_t)((Crc16 & 0xff00) >> 8); dev->Write(wdata, sizeof(wdata)); dev->Read(rdata, sizeof(rdata)); if (rdata[0] != (uint8_t)((dev->NewDevAddr) & 0x00ff)) { return -1; } Crc16 = 0xffff; dev->Crc(rdata, 7, &Crc16); if (Crc16 != ((((uint16_t)rdata[8]) << 8) | rdata[7])) { return -1; } dev->HdVer[0] = rdata[3]; dev->HdVer[1] = rdata[4]; dev->Soft[0] = rdata[5]; dev->Soft[1] = rdata[6]; return 0; }