This commit is contained in:
parent
8ebc81864e
commit
38986bf14b
|
|
@ -39,7 +39,7 @@ loopbuff_t Form_DataM;
|
||||||
uint8_t Form_DataM_Data[sizeof(form_data_t) * (FORM_DATA_COUNT + 1)] = {0};
|
uint8_t Form_DataM_Data[sizeof(form_data_t) * (FORM_DATA_COUNT + 1)] = {0};
|
||||||
SemaphoreHandle_t Form_DataQ = NULL;
|
SemaphoreHandle_t Form_DataQ = NULL;
|
||||||
SemaphoreHandle_t Form_DataLock = NULL;
|
SemaphoreHandle_t Form_DataLock = NULL;
|
||||||
|
static int16_t topPtr=0;
|
||||||
// 屏幕读取结果队列
|
// 屏幕读取结果队列
|
||||||
#define FORM_READ_COUNT 3
|
#define FORM_READ_COUNT 3
|
||||||
loopbuff_t Form_ReadM;
|
loopbuff_t Form_ReadM;
|
||||||
|
|
@ -359,6 +359,18 @@ void Form_RefreshGrid2(form_grid2_t *grid)
|
||||||
// 加入队列
|
// 加入队列
|
||||||
LoopBuff_PutItem(&Form_DataM, (uint8_t *) &formData);
|
LoopBuff_PutItem(&Form_DataM, (uint8_t *) &formData);
|
||||||
}
|
}
|
||||||
|
//boxCnt.count=12;
|
||||||
|
formData.oper = DWIN_OPER_WRITE;
|
||||||
|
formData.Addr = 0x9002;
|
||||||
|
formData.count = 2;
|
||||||
|
formData.word[0] = htons((boxCnt.count/30)+1);
|
||||||
|
LoopBuff_PutItem(&Form_DataM, (uint8_t *) &formData);
|
||||||
|
formData.oper = DWIN_OPER_WRITE;
|
||||||
|
formData.Addr = 0x9000;
|
||||||
|
formData.count = 2;
|
||||||
|
formData.word[0] = htons((topPtr/30)+1);
|
||||||
|
LoopBuff_PutItem(&Form_DataM, (uint8_t *) &formData);
|
||||||
|
|
||||||
|
|
||||||
// 再将备份缓冲作为显示缓冲
|
// 再将备份缓冲作为显示缓冲
|
||||||
for(i = 0; i < 30; i++)
|
for(i = 0; i < 30; i++)
|
||||||
|
|
@ -676,6 +688,13 @@ void Form_Task(void *p_arg)
|
||||||
data.count = strlen(data.str);
|
data.count = strlen(data.str);
|
||||||
DWIN_Refresh(&data);
|
DWIN_Refresh(&data);
|
||||||
|
|
||||||
|
// data.oper = DWIN_OPER_WRITE;
|
||||||
|
// data.Addr = gridBox.hdrAddr+0x1000;
|
||||||
|
// sprintf(data.str, "%6s",
|
||||||
|
// "00");
|
||||||
|
// data.count = strlen(data.str);
|
||||||
|
// DWIN_Refresh(&data);
|
||||||
|
|
||||||
// 设置曲线的纵坐标
|
// 设置曲线的纵坐标
|
||||||
// 绿轴:液位(百分比)
|
// 绿轴:液位(百分比)
|
||||||
data.oper = DWIN_OPER_WRITE;
|
data.oper = DWIN_OPER_WRITE;
|
||||||
|
|
@ -2483,15 +2502,21 @@ void Form_En_About()
|
||||||
|
|
||||||
Form_RefreshGrid(&gridAboutEn);
|
Form_RefreshGrid(&gridAboutEn);
|
||||||
}
|
}
|
||||||
static int16_t topPtr=0;
|
|
||||||
void Form_BOX_PSN()
|
void Form_BOX_PSN()
|
||||||
{
|
{
|
||||||
|
// static form_data_t data2;
|
||||||
int i=0;
|
int i=0;
|
||||||
uint8_t row = 0;
|
uint8_t row = 0;
|
||||||
int16_t rowCount=0;
|
int16_t rowCount=0;
|
||||||
topPtr=0;
|
topPtr=0;
|
||||||
|
gridBox.rowCount=boxCnt.count;//
|
||||||
rowCount=gridBox.rowCount;
|
rowCount=gridBox.rowCount;
|
||||||
if(rowCount>30)rowCount=30;
|
if(rowCount>30)
|
||||||
|
{
|
||||||
|
rowCount=30;
|
||||||
|
gridBox.rowCount=30;
|
||||||
|
}
|
||||||
for(i=0; i<rowCount; i++)
|
for(i=0; i<rowCount; i++)
|
||||||
{
|
{
|
||||||
sprintf(gridBox.rowStr[row++], "%s 20%02d%02d%02d%02d%03d",
|
sprintf(gridBox.rowStr[row++], "%s 20%02d%02d%02d%02d%03d",
|
||||||
|
|
@ -2501,6 +2526,12 @@ void Form_BOX_PSN()
|
||||||
|
|
||||||
}
|
}
|
||||||
Form_RefreshGrid2(&gridBox);
|
Form_RefreshGrid2(&gridBox);
|
||||||
|
// boxCnt.count=12;
|
||||||
|
// data2.oper = DWIN_OPER_WRITE;
|
||||||
|
// data2.Addr = 0x9000;
|
||||||
|
// data2.count = 2;
|
||||||
|
// data2.word[0] = htons(boxCnt.count);
|
||||||
|
// DWIN_Refresh(&data2);
|
||||||
|
|
||||||
}
|
}
|
||||||
void Form_BOX_PSN_D0WN()
|
void Form_BOX_PSN_D0WN()
|
||||||
|
|
@ -2529,6 +2560,7 @@ void Form_BOX_PSN_D0WN()
|
||||||
}
|
}
|
||||||
void Form_BOX_PSN_UP()
|
void Form_BOX_PSN_UP()
|
||||||
{
|
{
|
||||||
|
|
||||||
int i=0;
|
int i=0;
|
||||||
int16_t rowCount=0;
|
int16_t rowCount=0;
|
||||||
uint8_t row = 0;
|
uint8_t row = 0;
|
||||||
|
|
@ -2544,6 +2576,9 @@ void Form_BOX_PSN_UP()
|
||||||
}
|
}
|
||||||
Form_RefreshGrid2(&gridBox);
|
Form_RefreshGrid2(&gridBox);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 按键任务主体
|
// 按键任务主体
|
||||||
|
|
|
||||||
|
|
@ -323,9 +323,9 @@ void Data_Open()
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if 1
|
#if 0
|
||||||
// 测试代码,手动建立几个储罐扩展档案
|
// 测试代码,手动建立几个储罐扩展档案
|
||||||
boxCnt.count = 500;
|
boxCnt.count = 5;
|
||||||
for(i = 0; i < boxCnt.count; i++)
|
for(i = 0; i < boxCnt.count; i++)
|
||||||
{
|
{
|
||||||
memset(&boxRec, 0, sizeof(ext_box_t));
|
memset(&boxRec, 0, sizeof(ext_box_t));
|
||||||
|
|
|
||||||
|
|
@ -14,16 +14,22 @@ SemaphoreHandle_t Modbus_SendQ = NULL; //
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
uint8_t id; // 通信地址
|
uint8_t head_L;
|
||||||
uint8_t cmd; // 功能码
|
uint8_t head_S;
|
||||||
uint8_t index; // 包序号
|
uint8_t id; // 通信地址
|
||||||
uint8_t all; // 包数
|
uint8_t cmd; // 功能码
|
||||||
|
uint8_t len_H;
|
||||||
|
uint8_t len_L;
|
||||||
|
uint8_t index; // 包序号
|
||||||
|
uint8_t all; // 包数
|
||||||
|
uint8_t PSN[7];
|
||||||
|
uint8_t BOX[12];
|
||||||
// union
|
// union
|
||||||
// {
|
// {
|
||||||
// uint16_t cnt; // 读取:寄存器数量
|
// uint16_t cnt; // 读取:寄存器数量
|
||||||
// uint16_t data; // 写入:寄存器数据
|
// uint16_t data; // 写入:寄存器数据
|
||||||
// };
|
// };
|
||||||
// uint16_t crc;
|
uint16_t crc;
|
||||||
} modbus_request_t;
|
} modbus_request_t;
|
||||||
|
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
|
@ -43,202 +49,280 @@ static void RS485_SendDataByte(uint8_t *pu8TxBuf, uint32_t u32WriteBytes)
|
||||||
}
|
}
|
||||||
void Slave_IRQHandler(USART_Handle *huart)
|
void Slave_IRQHandler(USART_Handle *huart)
|
||||||
{
|
{
|
||||||
uint8_t u8DTU = (uint8_t) huart->Instance->DR;
|
uint8_t u8DTU = (uint8_t) huart->Instance->DR;
|
||||||
|
|
||||||
/* Handle received data */
|
/* Handle received data */
|
||||||
ReadModbus_Task(u8DTU);
|
ReadModbus_Task(u8DTU);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Modbus_Open()
|
void Modbus_Open()
|
||||||
{
|
{
|
||||||
// 创建消息队列
|
// 创建消息队列
|
||||||
LoopBuff_Create(&Modbus_SendM, sizeof(ext_data_t), MODBUS_SENDM_DATA_COUNT, 0, (uint32_t) Modbus_SendM_Data);
|
LoopBuff_Create(&Modbus_SendM, sizeof(ext_data_t), MODBUS_SENDM_DATA_COUNT, 0, (uint32_t) Modbus_SendM_Data);
|
||||||
|
|
||||||
// 创建信号量
|
// 创建信号量
|
||||||
Modbus_SendQ = xSemaphoreCreateBinary();
|
Modbus_SendQ = xSemaphoreCreateBinary();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t pack_heart_send_data()
|
uint8_t pack_heart_send_data()
|
||||||
{
|
{
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
uint16_t crc;
|
uint16_t crc;
|
||||||
|
|
||||||
// 打包上报数据(按modbus从机响应的格式)
|
// 打包上报数据(按modbus从机响应的格式)
|
||||||
memset(Heart_sendBuff, 0, HEART_SENDBUFF_SIZE);
|
memset(Heart_sendBuff, 0, HEART_SENDBUFF_SIZE);
|
||||||
i = 0;
|
i = 0;
|
||||||
|
|
||||||
// PSN
|
// PSN
|
||||||
memmove(Heart_sendBuff + i, dcBuff.configBottle.PSN, 6);
|
memmove(Heart_sendBuff + i, dcBuff.configBottle.PSN, 6);
|
||||||
i += 6;
|
i += 6;
|
||||||
|
|
||||||
Heart_sendBuff[i++] = 0x02; // 命令码:心跳
|
Heart_sendBuff[i++] = 0x02; // 命令码:心跳
|
||||||
|
|
||||||
// 数据长度:先预设为0,最后再修改,位置为Heart_sendBuff[7]
|
// 数据长度:先预设为0,最后再修改,位置为Heart_sendBuff[7]
|
||||||
Heart_sendBuff[i++] = 0;
|
Heart_sendBuff[i++] = 0;
|
||||||
|
|
||||||
// 硬件版本
|
// 硬件版本
|
||||||
Heart_sendBuff[i++] = dcBuff.powerInfo.hardVer.minor;
|
Heart_sendBuff[i++] = dcBuff.powerInfo.hardVer.minor;
|
||||||
// 软件版本
|
// 软件版本
|
||||||
Heart_sendBuff[i++] = dcBuff.powerInfo.softVer.minor;
|
Heart_sendBuff[i++] = dcBuff.powerInfo.softVer.minor;
|
||||||
// 软件日期
|
// 软件日期
|
||||||
Heart_sendBuff[i++] = dcBuff.powerInfo.softDate.year;
|
Heart_sendBuff[i++] = dcBuff.powerInfo.softDate.year;
|
||||||
Heart_sendBuff[i++] = dcBuff.powerInfo.softDate.month;
|
Heart_sendBuff[i++] = dcBuff.powerInfo.softDate.month;
|
||||||
Heart_sendBuff[i++] = dcBuff.powerInfo.softDate.day;
|
Heart_sendBuff[i++] = dcBuff.powerInfo.softDate.day;
|
||||||
|
|
||||||
// 射频自检状态
|
// 射频自检状态
|
||||||
Heart_sendBuff[i++] = RF_initStatus;
|
Heart_sendBuff[i++] = RF_initStatus;
|
||||||
// 网口自检状态
|
// 网口自检状态
|
||||||
Heart_sendBuff[i++] = Ethernet_initStatus;
|
Heart_sendBuff[i++] = Ethernet_initStatus;
|
||||||
// 网络连接状态
|
// 网络连接状态
|
||||||
Heart_sendBuff[i++] = Ethernet_IsConnected();
|
Heart_sendBuff[i++] = Ethernet_IsConnected();
|
||||||
// GPRS入网状态
|
// GPRS入网状态
|
||||||
Heart_sendBuff[i++] = dcBuff.dtuData.networked;
|
Heart_sendBuff[i++] = dcBuff.dtuData.networked;
|
||||||
// GPRS信号强度
|
// GPRS信号强度
|
||||||
Heart_sendBuff[i++] = dcBuff.dtuData.rssi;
|
Heart_sendBuff[i++] = dcBuff.dtuData.rssi;
|
||||||
// GPRS连接状态
|
// GPRS连接状态
|
||||||
Heart_sendBuff[i++] = dcBuff.dtuData.connected;
|
Heart_sendBuff[i++] = dcBuff.dtuData.connected;
|
||||||
|
|
||||||
// 保留备用
|
// 保留备用
|
||||||
i += 41;
|
i += 41;
|
||||||
|
|
||||||
// 修改数据长度
|
// 修改数据长度
|
||||||
Heart_sendBuff[7] = i - 8;
|
Heart_sendBuff[7] = i - 8;
|
||||||
|
|
||||||
// 校验码
|
// 校验码
|
||||||
crc = MODBUS_RTU_CRC16((uint8_t *) Heart_sendBuff, i);
|
crc = MODBUS_RTU_CRC16((uint8_t *) Heart_sendBuff, i);
|
||||||
*(uint16_t *)(Heart_sendBuff + i) = htons(crc);
|
*(uint16_t *)(Heart_sendBuff + i) = htons(crc);
|
||||||
i += 2;
|
i += 2;
|
||||||
// 结束符
|
// 结束符
|
||||||
Heart_sendBuff[i++] = 0x0d;
|
Heart_sendBuff[i++] = 0x0d;
|
||||||
Heart_sendBuff[i++] = 0x0a;
|
Heart_sendBuff[i++] = 0x0a;
|
||||||
|
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 任务主体
|
// 任务主体
|
||||||
void Modbus_Task(void *p_arg)
|
void Modbus_Task(void *p_arg)
|
||||||
{
|
{
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
uint32_t heartTick = 0;
|
uint32_t heartTick = 0;
|
||||||
ext_data_t Gprs;
|
ext_data_t Gprs;
|
||||||
|
|
||||||
while(TRUE)
|
while(TRUE)
|
||||||
{
|
{
|
||||||
// 本任务读取发送队列的记录
|
// 本任务读取发送队列的记录
|
||||||
// 这条语句用于任务切换(让其它任务有机会得到执行)
|
// 这条语句用于任务切换(让其它任务有机会得到执行)
|
||||||
xSemaphoreTake(Modbus_SendQ, 1000);
|
xSemaphoreTake(Modbus_SendQ, 1000);
|
||||||
|
|
||||||
if(IsTickOut(heartTick))
|
if(IsTickOut(heartTick))
|
||||||
{
|
{
|
||||||
heartTick = GetDelayTick(30000); // 30秒以后再发
|
heartTick = GetDelayTick(30000); // 30秒以后再发
|
||||||
|
|
||||||
// TODO: 发送心跳到上位机,不等待返回
|
// TODO: 发送心跳到上位机,不等待返回
|
||||||
// i = pack_heart_send_data();
|
// i = pack_heart_send_data();
|
||||||
// RS485_SendDataByte(Heart_sendBuff, i);
|
// RS485_SendDataByte(Heart_sendBuff, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(LoopBuff_GetCount(&Modbus_SendM))
|
if(LoopBuff_GetCount(&Modbus_SendM))
|
||||||
{
|
{
|
||||||
// 取数据
|
// 取数据
|
||||||
memmove(&Gprs, LoopBuff_GetDataPtr(&Modbus_SendM, Modbus_SendM.info.rdPtr), sizeof(ext_data_t));
|
memmove(&Gprs, LoopBuff_GetDataPtr(&Modbus_SendM, Modbus_SendM.info.rdPtr), sizeof(ext_data_t));
|
||||||
LoopBuff_RemoveItems(&Modbus_SendM, 1);
|
LoopBuff_RemoveItems(&Modbus_SendM, 1);
|
||||||
i = pack_modbus_tran_data(&Gprs);
|
i = pack_modbus_tran_data(&Gprs);
|
||||||
|
|
||||||
// TODO: 发送数据到上位机,不等待返回
|
// TODO: 发送数据到上位机,不等待返回
|
||||||
RS485_SendDataByte(Modbus_sendBuff, i);
|
RS485_SendDataByte(Modbus_sendBuff, i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 处理modbus rtu命令(已经验证过长度和CRC的包)
|
// 处理modbus rtu命令(已经验证过长度和CRC的包)
|
||||||
void MODBUS_RTU_CMD(modbus_request_t *req)
|
void MODBUS_RTU_CMD(modbus_request_t *req)
|
||||||
{
|
{
|
||||||
static uint8_t BUFF[100]; // 响应包
|
static uint8_t BUFF2[100]; // 响应包
|
||||||
uint8_t err = 0; // 错误代码
|
uint8_t err = 0; // 错误代码
|
||||||
uint8_t len = 0; // 发送数据长度
|
uint8_t len = 0; // 发送数据长度
|
||||||
|
|
||||||
uint16_t id; // 通信地址
|
uint16_t count; // 通信地址
|
||||||
uint16_t reg; // 数据地址
|
// uint16_t reg; // 数据地址
|
||||||
uint16_t cnt; // 数据个数
|
uint16_t cnt; // 数据个数
|
||||||
uint16_t crc;
|
uint16_t crc;
|
||||||
|
ext_box_t boxRec;
|
||||||
// 检查通信地址
|
char* psn;
|
||||||
if(req->id != dcBuff.configBottle.addr && req->id != 0)
|
// // 检查通信地址
|
||||||
return;
|
// 添加记录
|
||||||
|
// boxCnt.count = 5;
|
||||||
// 清空发送帧
|
// for(i = 0; i < boxCnt.count; i++)
|
||||||
memset(BUFF, 0, sizeof(BUFF));
|
|
||||||
|
|
||||||
BUFF[len++] = dcBuff.configBottle.addr; // 从机地址
|
|
||||||
BUFF[len++] = req->cmd; // 命令代码
|
|
||||||
|
|
||||||
// reg = ntohs(req->reg); // 数据寄存器
|
|
||||||
// if(req->cmd == 0x03 || req->cmd == 0x06)
|
|
||||||
// reg += 40001;
|
|
||||||
// else if(req->cmd == 0x04)
|
|
||||||
// reg += 30001;
|
|
||||||
// else
|
|
||||||
// err = MODBUS_ERR_ILF; // 无效功能码
|
|
||||||
//
|
|
||||||
if(err == 0)
|
|
||||||
{
|
|
||||||
if(req->cmd == 0x03) // 读保持数据
|
|
||||||
{
|
|
||||||
// cnt = ntohs(req->cnt); // 参数个数
|
|
||||||
// if(reg != MODBUS_ADR_REG || cnt != 1)
|
|
||||||
// err = MODBUS_ERR_NAK; // 命令无法执行
|
|
||||||
// else
|
|
||||||
// {
|
|
||||||
// // 用最新的通讯地址刷新缓冲
|
|
||||||
// id = htons(dcBuff.configBottle.addr);
|
|
||||||
// BUFF[len++] = 2; // 数据长度
|
|
||||||
// memmove(BUFF + len, (uint8_t *) &id, 2);
|
|
||||||
// len += 2;
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// if(err != 0)
|
|
||||||
// {
|
// {
|
||||||
// BUFF[1] |= 0x80; // 错误指示
|
// memset(&boxRec, 0, sizeof(ext_box_t));
|
||||||
// BUFF[len++] = err; // 错误代码
|
// boxRec.PSN[0] = 26;
|
||||||
|
// boxRec.PSN[3] = (0 + i * 1) / 1000;
|
||||||
|
// boxRec.PSN[4] = ((0 + i * 1) % 1000) >> 8;
|
||||||
|
// boxRec.PSN[5] = ((0 + i * 1) % 1000) & 0xFF;
|
||||||
|
// strcpy(boxRec.TGGU, "TGGU2000000");
|
||||||
|
// boxRec.TGGU[7] = '0' + (0 + i) / 100;
|
||||||
|
// boxRec.TGGU[8] = '0' + (0 + i) % 100 / 10;
|
||||||
|
// boxRec.TGGU[9] = '0' + (0 + i) % 10;
|
||||||
|
// FRAM_BufferWrite(FRAM_BOX_DATA_BASE + sizeof(ext_box_t) * i, (uint8_t *) &boxRec, sizeof(ext_box_t));
|
||||||
// }
|
// }
|
||||||
|
// FRAM_SaveInfo(FRAM_BOX_INFO_BASE, (uint8_t *) &boxCnt, sizeof(ext_count_t));
|
||||||
|
|
||||||
// 计算CRC
|
|
||||||
crc = MODBUS_RTU_CRC16(BUFF, len);
|
|
||||||
crc = htons(crc);
|
|
||||||
|
|
||||||
memmove(BUFF + len, &crc, 2);
|
|
||||||
len += 2;
|
|
||||||
|
|
||||||
if(req->id != 0)
|
if(req->cmd == 0x02) // 读保持数据
|
||||||
{
|
{
|
||||||
// 发送应答
|
cnt = req->index; // 参数个数
|
||||||
RS485_SendDataByte(BUFF, len);
|
memset(&boxRec, 0, sizeof(ext_box_t));
|
||||||
}
|
boxRec.PSN[0] = req->PSN[0];
|
||||||
|
boxRec.PSN[1] = req->PSN[1];
|
||||||
|
boxRec.PSN[2] = req->PSN[2];
|
||||||
|
boxRec.PSN[3] = req->PSN[3];
|
||||||
|
boxRec.PSN[4] = req->PSN[4];
|
||||||
|
boxRec.PSN[5] = req->PSN[5];
|
||||||
|
for(int i=0; i<11; i++)
|
||||||
|
boxRec.TGGU[i]=req->BOX[i];
|
||||||
|
boxRec.TGGU[11]=0;
|
||||||
|
if(req->index>0)count=req->index-1;
|
||||||
|
|
||||||
|
FRAM_BufferWrite(FRAM_BOX_DATA_BASE + sizeof(ext_box_t) * count, (uint8_t *) &boxRec, sizeof(ext_box_t));
|
||||||
|
// // 更新索引信息
|
||||||
|
// strcpy(boxTGGU[count].TGGU, boxRec.TGGU);
|
||||||
|
// memmove(boxTGGU[count].PSN, boxRec.PSN, 6);
|
||||||
|
// boxTGGU[count].recNo = count;
|
||||||
|
// strcpy(boxPSN[count].TGGU, boxRec.TGGU);
|
||||||
|
// memmove(boxPSN[count].PSN, boxRec.PSN, 6);
|
||||||
|
// boxPSN[count].recNo = count;
|
||||||
|
|
||||||
|
if(req->index==req->all)
|
||||||
|
{
|
||||||
|
boxCnt.count=req->all;
|
||||||
|
FRAM_SaveInfo(FRAM_BOX_INFO_BASE, (uint8_t *) &boxCnt, sizeof(ext_count_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
memset(BUFF2, 0, sizeof(BUFF2));
|
||||||
|
BUFF2[len++]='L';
|
||||||
|
BUFF2[len++]='S';
|
||||||
|
BUFF2[len++] = dcBuff.configBottle.addr; // 从机地址
|
||||||
|
BUFF2[len++] = 2;//req->cmd; // 命令代码
|
||||||
|
BUFF2[len++] = 0;
|
||||||
|
BUFF2[len++] = 1; //LEN
|
||||||
|
BUFF2[len++] = 1;
|
||||||
|
|
||||||
|
// 计算CRC
|
||||||
|
crc = MODBUS_RTU_CRC16(BUFF2, len);
|
||||||
|
crc = htons(crc);
|
||||||
|
|
||||||
|
memmove(BUFF2 + len, &crc, 2);
|
||||||
|
len += 2;
|
||||||
|
RS485_SendDataByte(BUFF2, len);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 任务主体
|
// 任务主体
|
||||||
|
uint8_t BUFF[1000] = {0};
|
||||||
void ReadModbus_Task(uint8_t c)
|
void ReadModbus_Task(uint8_t c)
|
||||||
{
|
{
|
||||||
static uint8_t BUFF[sizeof(modbus_request_t)] = {0};
|
|
||||||
static uint8_t len = 0;
|
|
||||||
|
|
||||||
// 取数据
|
static uint8_t len = 0;
|
||||||
BUFF[len++] = c;
|
static uint16_t data_len = 0;
|
||||||
|
static uint16_t data_len2 = 0;
|
||||||
|
// // 取数据
|
||||||
|
// if((len==0)&&(c=='L')) len++;
|
||||||
|
// else return;
|
||||||
|
// if((len==1)&&(c=='S')) len++;
|
||||||
|
// else return;
|
||||||
|
//
|
||||||
|
// BUFF[len++] = c;
|
||||||
|
//
|
||||||
|
// // 验证长度和CRC值
|
||||||
|
// if(len == sizeof(modbus_request_t))
|
||||||
|
// {
|
||||||
|
// if(MODBUS_RTU_CRC16(BUFF, sizeof(modbus_request_t)) == 0)
|
||||||
|
// {
|
||||||
|
// MODBUS_RTU_CMD((modbus_request_t *) BUFF);
|
||||||
|
// len = 0;
|
||||||
|
// }
|
||||||
|
// else
|
||||||
|
// {
|
||||||
|
// // 丢掉第一个字节
|
||||||
|
// memmove(BUFF, BUFF + 1, --len);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
switch(len)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
BUFF[len]=c;
|
||||||
|
if(c=='L') len++;
|
||||||
|
else len=0;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
BUFF[len]=c;
|
||||||
|
if(c=='S') len++;
|
||||||
|
else len=0;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
BUFF[len++]=c;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
BUFF[len]=c;
|
||||||
|
if(c==2) len++;
|
||||||
|
else len=0;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
BUFF[len]=c;
|
||||||
|
data_len=c<<8;
|
||||||
|
len++;
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
BUFF[len]=c;
|
||||||
|
data_len|=c;
|
||||||
|
len++;
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
BUFF[6+data_len2++]=c;
|
||||||
|
if(data_len2+1>data_len)
|
||||||
|
len++;
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
BUFF[6+data_len2++]=c;
|
||||||
|
len++;
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
BUFF[6+data_len2]=c;
|
||||||
|
len=0;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
len=0;
|
||||||
|
}
|
||||||
|
if((len==0)&&(data_len2>1))
|
||||||
|
{
|
||||||
|
if(MODBUS_RTU_CRC16(BUFF, 7+data_len2) == 0)
|
||||||
|
{
|
||||||
|
MODBUS_RTU_CMD((modbus_request_t *) BUFF);
|
||||||
|
|
||||||
// 验证长度和CRC值
|
}
|
||||||
if(len == sizeof(modbus_request_t))
|
data_len2=0;
|
||||||
{
|
}
|
||||||
if(MODBUS_RTU_CRC16(BUFF, sizeof(modbus_request_t)) == 0)
|
|
||||||
{
|
|
||||||
MODBUS_RTU_CMD((modbus_request_t *) BUFF);
|
|
||||||
len = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// 丢掉第一个字节
|
|
||||||
memmove(BUFF, BUFF + 1, --len);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue