From 6e3f1f560d618b37ee1a47fa2b0f682b70c3ef1c Mon Sep 17 00:00:00 2001
From: jinlicong <493886250@qq.com>
Date: Wed, 19 Jun 2024 17:25:45 +0800
Subject: [PATCH] 增加OTA协议
---
Function/FLOW_METER_DATA_COLLECT/rs485_read_data.c | 314 +++++++++++++++++++++++++++++++++++++++++----------
1 files changed, 250 insertions(+), 64 deletions(-)
diff --git a/Function/FLOW_METER_DATA_COLLECT/rs485_read_data.c b/Function/FLOW_METER_DATA_COLLECT/rs485_read_data.c
index 06361b7..1e33468 100644
--- a/Function/FLOW_METER_DATA_COLLECT/rs485_read_data.c
+++ b/Function/FLOW_METER_DATA_COLLECT/rs485_read_data.c
@@ -1,13 +1,19 @@
#include "rs485_read_data.h"
#include "rs485_data_analysis_pro.h"
#include "tim.h"
+#include "billing.h"
+#include "gpio.h"
+#include "uart.h"
+#include "linked_list.h"
+#include "sizhu_alarm_record.h"
+/****�������˼·******************
+*RS485������Ʒ�Ϊ�ϵ硢���Ͷ�ȡָ��ȴ��������ݲ���������״̬�����裻����ʵ�ֵȴ���ʱ�жϺͶ���ض���
+*���modbus��ַ�ֵıȽϿ�������һ���Զ�ȡ���������RS485_MODBUS_STEP_STATUS_T��ȡ�������������һ��STEP�������ͺŵĵ�һ�����趼��STEP1��
+*���ɹ���ȡһ��ָ��֮���жϵ�ǰSTEP�Ƿ���ڵ������һ��STEP�������ʾȫ����ȡ��ɣ��������Ҫ����������һ��STEP�Ķ�ȡָ�
+*
+**********************************/
-//__IO RS485_COM_STATUS_T rs485_com_status_g = RS485_COM_IDLE;
-
-//__IO FlagStatus rs485_pwr_delay_status_g = RESET; //����ʱ�䵽���־
-
-//static uint8_t rs485_pwr_delay_time_out_cnt =0;
__IO RS485_COM_CTRL_PARA_T rs485_com_ctrl_pata_g={
.status = RS485_COM_IDLE, \
@@ -18,63 +24,183 @@
.recv_flag = RESET, \
};
+
+
+void RS485_read_data_GPIO_Init(void)
+{
+ InputtIO(RS485_SYNC_PORT,RS485_SYNC_PIN,IN_NORMAL);
+ OutputIO(RS485_PWR_PORT,RS485_PWR_PIN,OUT_PUSHPULL);
+ OutputIO(RS485_RE_PORT,RS485_RE_PIN,OUT_PUSHPULL);
+ OutputIO(PWR_OUTPUT1_PORT,PWR_OUTPUT1_PIN,OUT_PUSHPULL);
+ OutputIO(PWR_OUTPUT2_PORT,PWR_OUTPUT2_PIN,OUT_PUSHPULL);
+ OutputIO(PWR_BOOST_EN_PORT,PWR_BOOST_EN_PIN,OUT_PUSHPULL);
+ OutputIO(PWR_OUTPUT_9V_PORT,PWR_OUTPUT_9V_PIN,OUT_PUSHPULL);
+ OutputIO(PWR_OUTPUT_12V_PORT,PWR_OUTPUT_12V_PIN,OUT_PUSHPULL);
+
+ RS485_PWR_OFF;
+ RS485_RE_REC_ENABLE;
+ PWR_OUTPUT1_OFF;
+ PWR_OUTPUT2_OFF;
+ PWR_BOOST_DIABLE;
+ PWR_OUTPUT_9V_OFF;
+ PWR_OUTPUT_12V_OFF;
+}
+
+void RS485_UART_GPIO_Init(void)
+{
+ CMU_PERCLK_SetableEx(PADCLK, ENABLE); //PADʱ�ӣ�GPIO��ʹ�ܺ���
+ CMU_PERCLK_SetableEx(UART1CLK,ENABLE);
+ CMU_PERCLK_SetableEx(DMACLK, ENABLE);
+ AltFunIO(RS485_READ_DATA_TX_PORT, RS485_READ_DATA_TX_PIN, ALTFUN_NORMAL);
+ AltFunIO(RS485_READ_DATA_RX_PORT, RS485_READ_DATA_RX_PIN, ALTFUN_NORMAL);
+
+}
+
+void RS485_UART_GPIO_sleep(void)
+{
+ CMU_PERCLK_SetableEx(UART1CLK,DISABLE);
+ CloseIO(RS485_READ_DATA_TX_PORT, RS485_READ_DATA_TX_PIN);
+ CloseIO(RS485_READ_DATA_RX_PORT, RS485_READ_DATA_RX_PIN);
+}
+
+
+void RS485_read_data_RX_DMA_check(void)
+{
+ uint16_t timeout_cnt = 0,dma_recv_cnt;
+ uint32_t dma_mar_reg_read = DMA_CHxMAR_Read(RS485_READ_DATA_DMA_CHX);
+
+ if(dma_mar_reg_read != (uint32)RS485_read_data_recv_buff){
+ delay_ms(2);
+ while(dma_mar_reg_read != DMA_CHxMAR_Read(RS485_READ_DATA_DMA_CHX)){
+ dma_mar_reg_read = DMA_CHxMAR_Read(RS485_READ_DATA_DMA_CHX);
+ delay_ms(2);
+ if(timeout_cnt++ > 100)
+ break;
+ }
+ }
+ else
+ return ;
+
+ dma_recv_cnt = dma_mar_reg_read - (uint32)RS485_read_data_recv_buff;
+ if(dma_recv_cnt)
+ {
+ if((dma_recv_cnt >= RS485_READ_DATA_RECV_BUFF_LEN_MAX)||(dma_recv_cnt >= WRC_REC_BUF_LENGTH))
+ return;
+ rs485_com_uart_data_g.recv_length = dma_recv_cnt;
+ arrayA_2_arrayB(RS485_read_data_recv_buff , rs485_com_uart_data_g.recv_buf, dma_recv_cnt, LITTLE_ENDIAN) ;
+ rs485_com_uart_data_g.recv_flag = SET;//�������
+ }
+
+}
+
+
+
+
+
//�����豸���봦�������ع�����ʱʱ��������
uint8_t rs485GetDelayTime(uint16_t device_code)
{
-
//���ڱ�����������1��һ�Σ�������ʱ�IJ�����1000ms�� ������ֵ��0-1000ms֮�䣬ʵ����ʱ��Ϊ1�����ң� ��ֵ��1000-2000ms֮�䣬ʵ����ʱ��Ϊ2������
switch (device_code){
+ case SIZHUMODBUS1: rs485_com_ctrl_pata_g.modbus_last_status = MODBUS_STEP1; return 1;
+ case SIZHUMODBUS2: rs485_com_ctrl_pata_g.modbus_last_status = MODBUS_STEP1; return 1;
+ case SIZHUMODBUS3: rs485_com_ctrl_pata_g.modbus_last_status = MODBUS_STEP1;return 1;
+ case SIZHUMODBUSV2_0: rs485_com_ctrl_pata_g.modbus_last_status = MODBUS_STEP1;return 1;
+ case TIANXINCUSTOM: rs485_com_ctrl_pata_g.modbus_last_status = MODBUS_STEP1;return 1;
+ case TIANXINMODBUS: rs485_com_ctrl_pata_g.modbus_last_status = MODBUS_STEP1;return 1;
- case SIZHUMODBUS1: return 1;
- case SIZHUMODBUS2: return 1;
- case SIZHUMODBUS3: return 1;
- case SIZHUMODBUSV2_0: return 1;
- case TIANXINCUSTOM: return 1;
- case TIANXINMODBUS: return 1;
- //��Ҫ����......
+ case EKMODBUS: rs485_com_ctrl_pata_g.modbus_last_status = MODBUS_STEP3;return 1;
+ //?��Ҫ����......
default:return 100;
}
-
}
//�����豸���뷢�Ͷ�ȡ֡
void rs485SendReadData(uint16_t device_code,uint8_t slaveAddress)
{
-
switch (device_code){
-
- case SIZHUMODBUS1: sendModbusReadFrame(slaveAddress,501,50);break;
+ case SIZHUMODBUS1: break;
case SIZHUMODBUS2: break;
case SIZHUMODBUS3: break;
- case SIZHUMODBUSV2_0: break;
+ case SIZHUMODBUSV2_0: sendModbusReadFrame(slaveAddress,501,49);break;
case TIANXINCUSTOM: break;
case TIANXINMODBUS: break;
- //��Ҫ����......
+
+ case EKMODBUS:
+ if(rs485_com_ctrl_pata_g.modbus_step_status ==MODBUS_STEP1)
+ sendModbusReadFrame(slaveAddress,100,4);
+ else if(rs485_com_ctrl_pata_g.modbus_step_status ==MODBUS_STEP2)
+ sendModbusReadFrame(slaveAddress,306,4);
+ else if(rs485_com_ctrl_pata_g.modbus_step_status ==MODBUS_STEP3)
+ sendModbusReadFrame(slaveAddress,326,4);
+ break;
+ //?��Ҫ����......
default:break;
}
-
}
RS485_COM_STATUS_T rs485ComPwrOnHandle(void)
{
uint8_t delay_time_s;
+ uint8_t RS485_sync_status =0;
+ uint8_t count_i = 0;
- //IO�ڳ�ʼ��
+ //jIO�ڳ�ʼ��
+ RS485_read_data_GPIO_Init();
+
+ RS485_sync_status = RS485_SYNC_IO_READ;
+ while(RS485_sync_status){
+ count_i ++;
+ delay_ms(10);
+ RS485_sync_status = RS485_SYNC_IO_READ;
+ if(count_i > 10)
+ break;
+ }
+ if(RS485_sync_status)
+ return RS485_COM_IDLE;
//����
+ if(flow_meter_para_g.output_voltage_code == RS485_V1_5V){
+ PWR_OUTPUT1_ON;
+ PWR_OUTPUT2_OFF;
+ delay_ms(1);
+ PWR_OUTPUT_9V_OFF;
+ PWR_OUTPUT_12V_OFF;
+ }else if(flow_meter_para_g.output_voltage_code == RS485_V1_9V){
+ PWR_OUTPUT1_ON;
+ PWR_OUTPUT2_OFF;
+ delay_ms(1);
+ PWR_OUTPUT_9V_ON;
+ PWR_OUTPUT_12V_OFF;
+ }else if(flow_meter_para_g.output_voltage_code == RS485_V1_12V){
+ PWR_OUTPUT1_ON;
+ PWR_OUTPUT2_OFF;
+ delay_ms(1);
+ PWR_OUTPUT_9V_OFF;
+ PWR_OUTPUT_12V_ON;
+ }else if(flow_meter_para_g.output_voltage_code == RS485_V2_5V){
+ PWR_OUTPUT1_OFF;
+ PWR_OUTPUT2_ON;
+ delay_ms(1);
+ PWR_OUTPUT_9V_OFF;
+ PWR_OUTPUT_12V_OFF;
+ }
+ delay_ms(1);
+ PWR_BOOST_ENABLE;
//��ʱ���жϣ���ͬ�豸������ʱ���ȣ�Ҫ��Ҫ���ǹ������������ȡ�������
- delay_time_s = rs485GetDelayTime(SIZHUMODBUSV2_0);
+ delay_time_s = rs485GetDelayTime(flow_meter_para_g.flow_meter_code);
rs485_com_ctrl_pata_g.pwr_delay_status = RESET;
rs485_com_ctrl_pata_g.pwr_delay_time_out_cnt = 0;
-
//����״̬��λ
rs485_com_ctrl_pata_g.reread_num_cnt = RS485_REREAD_NUM;
rs485_com_ctrl_pata_g.reread_wait_time_cnt = RS485_REREAD_WATI_TIME;
rs485_com_ctrl_pata_g.pwr_delay_time_out_cnt = delay_time_s;
+
+ rs485_com_ctrl_pata_g.modbus_step_status = MODBUS_STEP1;
return RS485_COM_SEND;
@@ -83,89 +209,149 @@
RS485_COM_STATUS_T rs485ComSendHandle(void)
{
+ uint32_t BaudRate;
+ UART_ParityBitTypeDef ParityBit;
+ UART_StopBitTypeDef StopBit;
+
//��ʱ��--�� �����ʱ1�룬��--�͵���0�ˣ� ���ж�==0�Ϳ��Զ�ȡ���ݡ���Ϊ�ϵ絽�������ݰ�״̬��ִ�У�����Ͳ���һ��ѭ�����ڵ�ʱ�䣨����1�룩
- if(rs485_com_ctrl_pata_g.pwr_delay_time_out_cnt)
- {
+ if(rs485_com_ctrl_pata_g.pwr_delay_time_out_cnt){
rs485_com_ctrl_pata_g.pwr_delay_time_out_cnt--;
}
-
if(rs485_com_ctrl_pata_g.pwr_delay_time_out_cnt == 0) //��ʱ��0�Ϳ��Է��Ͷ�ȡָ��
{
- rs485SendReadData(SIZHUMODBUSV2_0,1); //�˴����Ҫ��
+ //��������
+// RS485_UART_GPIO_Init(); //uart_Init�Ѿ�������IO����
+ switch(flow_meter_para_g.baudrate_code ){
+ case BAUDRATE_1200:BaudRate = 1200; break;
+ case BAUDRATE_2400:BaudRate = 2400; break;
+ case BAUDRATE_4800:BaudRate = 4800; break;
+ case BAUDRATE_9600:BaudRate = 9600; break;
+ case BAUDRATE_19200:BaudRate = 19200; break;
+ case BAUDRATE_56000:BaudRate = 56000; break;
+ case BAUDRATE_57600:BaudRate = 57600; break;
+ case BAUDRATE_115200:BaudRate = 115200; break;
+ default:BaudRate = 9600; break;
+ }
+ switch(flow_meter_para_g.parity_bit ){
+ case PARITY_NONE:ParityBit = NONE; break;
+ case PARITY_ODD:ParityBit = ODD; break;
+ case PARITY_EVEN:ParityBit = EVEN; break;
+ default:ParityBit = NONE; break;
+ }
+
+ RS485_read_data_uart_Init(BaudRate,ParityBit,OneBit);
+ RS485_read_data_RX_DMA_CH3_Init();
+ uart_ctrl_para_g.RS485_rxto_flag = RESET;
+
+ RS485_PWR_ON;
+ delay_us(10);
+ rs485SendReadData(flow_meter_para_g.flow_meter_code,flow_meter_para_g.slave_address);
+ rs485_com_ctrl_pata_g.reread_wait_time_cnt = RS485_REREAD_WATI_TIME; //���õȴ���Ӧʱ��
return RS485_COM_WAIT_ANSWER;
}
-
+ return RS485_COM_SEND;
}
-
+#define RS485_READ_ERR_ALARM_TIMES 1 //����RS485_READ_ERR_ALARM_TIMES��ʧ�ܱ���RS485�쳣
RS485_COM_STATUS_T rs485ComWaitAnswerHandle(void)
{
+ static uint8_t RS485_err_cnt =0 ; //��ȡʧ�ܼ���
+
ErrorStatus read_ok = FAIL;
//��鴮������
-
-
+ if(uart_ctrl_para_g.RS485_rxto_flag ==SET){
+ uart_ctrl_para_g.RS485_rxto_flag = RESET;
+ RS485_read_data_RX_DMA_check();
+ }
//��������,����ɹ���������read_ok = PASS
- if(rs485_com_uart_data_g.recv_flag == SET)
- {
+ if(rs485_com_uart_data_g.recv_flag == SET){
rs485_com_uart_data_g.recv_flag =RESET;
+
+ read_ok = rs485ComDataAnalysis(rs485_com_uart_data_g,SIZHUMODBUSV2_0,1,rs485_com_ctrl_pata_g ) ;
+ memset(rs485_com_uart_data_g.recv_buf, 0, sizeof(rs485_com_uart_data_g.recv_buf)); //Ӧ�������ս���
+
}
-
- if(read_ok==PASS)
- {
- return RS485_COM_IDLE;
- }
-
- if((--rs485_com_ctrl_pata_g.reread_wait_time_cnt)==0)
- {
- if((--rs485_com_ctrl_pata_g.reread_num_cnt)==0)
- {
- //��ʱ���ض��������꣬���س�ʱ����
-
- //�رյ�Դ���رմ��ڣ�RS485ͨѶʧ��+1,
-
+ if(read_ok==PASS){
+ if(rs485_com_ctrl_pata_g.modbus_step_status >= rs485_com_ctrl_pata_g.modbus_last_status) {
+ //����ͨѶȫ���ɹ���������Ӧ�Ĵ���
+ //�رյ�Դ���رմ���
+ RS485_PWR_OFF;
+ RS485_RE_REC_ENABLE;
+ PWR_BOOST_DIABLE;
+ PWR_OUTPUT1_OFF;
+ PWR_OUTPUT2_OFF;
+ PWR_OUTPUT_9V_OFF;
+ PWR_OUTPUT_12V_OFF;
+ RS485_UART_GPIO_sleep();
+ __SYS_STATUS_BYTES_STATUS(RS485_err, RESET, ALARM_ID_READ_485_ABNORMAL);
+ RS485_err_cnt =0 ;
return RS485_COM_IDLE;
- }else
- {
- //��ʱ�����ظ��������У��������·��Ͷ�ȡ����
+ }
+ else{
+ rs485_com_ctrl_pata_g.modbus_step_status ++;
return RS485_COM_SEND;
}
+ }
+
+ if((--rs485_com_ctrl_pata_g.reread_wait_time_cnt)==0){
+ if((--rs485_com_ctrl_pata_g.reread_num_cnt)==0){
+ //��ʱ���ض��������꣬����ͨѶ������ʧ�ܸ��գ�������Ӧ�Ĵ���
+ //�رյ�Դ���رմ��ڣ�RS485ͨѶʧ��+1,
+ RS485_PWR_OFF;
+ RS485_RE_REC_ENABLE;
+ PWR_BOOST_DIABLE;
+ PWR_OUTPUT1_OFF;
+ PWR_OUTPUT2_OFF;
+ PWR_OUTPUT_9V_OFF;
+ PWR_OUTPUT_12V_OFF;
+ RS485_UART_GPIO_sleep();
+ if(RS485_err_cnt < 250){
+ if( ++RS485_err_cnt >= RS485_READ_ERR_ALARM_TIMES)
+ __SYS_STATUS_ALARM_BYTES_SET(RS485_err,ALARM_ID_READ_485_ABNORMAL);
+ }
+ return RS485_COM_IDLE;
+ }else{
+ //��ʱ�����ظ��������У��������·��Ͷ�ȡ����
+ return RS485_COM_SEND;
+ }
}
- return RS485_COM_WAIT_ANSWER;
-
+ return RS485_COM_WAIT_ANSWER;
}
-void rs485ReadDataPro(void)
+void rs485ReadDataPro(FUN_START_CTRL_PARA_T * sys_fun_run_ctrl_p)
{
-
-
- if(1)//�ж�485�ɼ���ʶ
+ if((sys_fun_run_ctrl_p->rs485_ctrl_flag.start_flag ==SET)&&(sys_fun_run_ctrl_p->valve_ctrl_flag.running_flag == RESET)&&(sys_fun_run_ctrl_p->wrc_ctrl_flag.running_flag == RESET))//�ж�485�ɼ���ʶ
{
+ sys_fun_run_ctrl_p->rs485_ctrl_flag.start_flag = RESET;
if(rs485_com_ctrl_pata_g.status == RS485_COM_IDLE)
{
rs485_com_ctrl_pata_g.status = RS485_COM_PWR_ON;
+ sys_fun_run_ctrl_p->rs485_ctrl_flag.running_flag = SET;
}
-
}
-
switch (rs485_com_ctrl_pata_g.status){
case RS485_COM_IDLE: break;
- case RS485_COM_PWR_ON: break;
- case RS485_COM_SEND: break;
- case RS485_COM_WAIT_ANSWER: break;
+ case RS485_COM_PWR_ON: rs485_com_ctrl_pata_g.status = rs485ComPwrOnHandle();break;
+ case RS485_COM_SEND: rs485_com_ctrl_pata_g.status = rs485ComSendHandle();break;
+ case RS485_COM_WAIT_ANSWER: rs485_com_ctrl_pata_g.status = rs485ComWaitAnswerHandle();break;
default:;
}
-
-
-}
\ No newline at end of file
+ if(rs485_com_ctrl_pata_g.status == RS485_COM_IDLE){
+ if(sys_fun_run_ctrl_p->rs485_ctrl_flag.running_flag ==SET){
+ sys_fun_run_ctrl_p->rs485_ctrl_flag.running_flag = RESET;
+ RS485_trigger_settle_flag = SET; //RS485�ɼ�֮��һ�ν���
+ }
+ }
+}
--
Gitblit v1.9.3