|
@@ -565,7 +565,18 @@ void TerminalSlave485_Send_Data(uint8_t *buf,uint16_t len)
|
|
|
TerminalSlave485_TX_Set(1); //设置为发送模式
|
|
|
//HAL_UART_Transmit(&huart1,buf,len,1000);//串口1发送数据
|
|
|
// TerminalSlave485_TX_Set(0); //设置为接收模式
|
|
|
- memcpy(terminal_buf,buf,len);
|
|
|
+
|
|
|
+ // 如果来自41串口的报文回应,需要粘合原样5字节头部,其中将长度内容适配下即可
|
|
|
+ if(Pass41SensorScanParam.rx_buf[0] > 0){
|
|
|
+ memcpy(terminal_buf,Pass41SensorScanParam.rx_buf,5);
|
|
|
+ terminal_buf[2] = len;
|
|
|
+ memcpy(terminal_buf+5,buf,len);
|
|
|
+ len += 5;
|
|
|
+ Pass41SensorScanParam.rx_buf[0] = 0;
|
|
|
+ }else{
|
|
|
+ memcpy(terminal_buf,buf,len);
|
|
|
+ }
|
|
|
+
|
|
|
if(HAL_UART_Transmit_IT(&huart1,terminal_buf,len)!=HAL_OK)
|
|
|
{
|
|
|
TerminalSlave485_TX_Set(0); //设置为接收模式
|
|
@@ -1111,6 +1122,271 @@ void Send_A1_Cmd(unsigned char scrAddr, unsigned char funCode, unsigned char scr
|
|
|
*/
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ ***************************************
|
|
|
+ * 构建A1命令数据 -- hex制式
|
|
|
+ * 输入:
|
|
|
+ * pBuf-构建数据的存放首地址
|
|
|
+ * pEmergy,如果是数据有变动,表示紧急上报,将标记存于此地址
|
|
|
+ * flowID, 流水id值
|
|
|
+ * 返回: 构建数据的字节总数
|
|
|
+ ***************************************
|
|
|
+ */
|
|
|
+int BuildA1Cmd(uint8_t *pBuf, uint32_t flowID, uint8_t *pEmergencyflag)
|
|
|
+{
|
|
|
+ int send_pos=0;
|
|
|
+ unsigned char emergencyflag=0;
|
|
|
+ unsigned char Lrc_temp;
|
|
|
+ unsigned char overflow_flag=0;
|
|
|
+ int i,j;
|
|
|
+ unsigned char temp_i = 0x00;
|
|
|
+
|
|
|
+ pBuf[send_pos++] = 0xA1;
|
|
|
+ pBuf[send_pos++] = 120;
|
|
|
+ if(StoreNumber>0)
|
|
|
+ {
|
|
|
+ if(memcmp(Cang_IO_tbak[0],Cang01_IO,64))
|
|
|
+ {
|
|
|
+ emergencyflag=0x80;
|
|
|
+ }
|
|
|
+ memcpy(Cang_IO_tbak[0],Cang01_IO,64);
|
|
|
+ }
|
|
|
+ if(StoreNumber>1)
|
|
|
+ {
|
|
|
+ if(memcmp(Cang_IO_tbak[1],Cang02_IO,64))
|
|
|
+ {
|
|
|
+ emergencyflag=0x80;
|
|
|
+ }
|
|
|
+ memcpy(Cang_IO_tbak[1],Cang02_IO,64);
|
|
|
+ }
|
|
|
+ if(StoreNumber>2)
|
|
|
+ {
|
|
|
+ if(memcmp(Cang_IO_tbak[2],Cang03_IO,64))
|
|
|
+ {
|
|
|
+ emergencyflag=0x80;
|
|
|
+ }
|
|
|
+ memcpy(Cang_IO_tbak[2],Cang03_IO,64);
|
|
|
+ }
|
|
|
+ if(StoreNumber>3)
|
|
|
+ {
|
|
|
+ if(memcmp(Cang_IO_tbak[3],Cang04_IO,64))
|
|
|
+ {
|
|
|
+ emergencyflag=0x80;
|
|
|
+ }
|
|
|
+ memcpy(Cang_IO_tbak[3],Cang04_IO,64);
|
|
|
+ }
|
|
|
+ if((overflow_cnt==0) && (overflow_cnt==overflow_cnt_bak))
|
|
|
+ {
|
|
|
+ overflow_flag=0;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ overflow_flag=1;
|
|
|
+ }
|
|
|
+ overflow_cnt_bak=overflow_cnt;
|
|
|
+ if(overflow_flag_bak!=overflow_flag)
|
|
|
+ {
|
|
|
+ emergencyflag=0x80;
|
|
|
+ }
|
|
|
+ overflow_flag_bak=overflow_flag;
|
|
|
+
|
|
|
+ pBuf[send_pos++] = emergencyflag;
|
|
|
+ pBuf[send_pos++] = StoreNumber;
|
|
|
+ pBuf[send_pos++] = 0x22;
|
|
|
+ pBuf[send_pos++] = overflow_flag;
|
|
|
+
|
|
|
+ if((Config_info_all.ManHole_Big_info>0) && (Config_info_all.ManHole_Big_info<8))
|
|
|
+ {
|
|
|
+ pBuf[send_pos++] = 0x72;
|
|
|
+ for (i = 0; i < StoreNumber; i++)
|
|
|
+ {
|
|
|
+ pBuf[send_pos++] = Config_info_all.ManHole_Big_info/StoreNumber;
|
|
|
+ for(j=0;j<Config_info_all.ManHole_Big_info/StoreNumber;++j)
|
|
|
+ {
|
|
|
+ pBuf[send_pos++] = Cang_IO_tbak[i][indexDaGai01+10*j];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if((Config_info_all.Dump_info>0) && (Config_info_all.Dump_info<8))
|
|
|
+ {
|
|
|
+ pBuf[send_pos++] = 0x71;
|
|
|
+ for (i = 0; i < StoreNumber; i++)
|
|
|
+ {
|
|
|
+ pBuf[send_pos++] = Config_info_all.Dump_info/StoreNumber;
|
|
|
+ for(j=0;j<Config_info_all.Dump_info/StoreNumber;++j)
|
|
|
+ {
|
|
|
+ pBuf[send_pos++] = Cang_IO_tbak[i][indexXieYouFa01+10*j];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if((Config_info_all.HaiDiFa_info>0) && (Config_info_all.HaiDiFa_info<8))
|
|
|
+ {
|
|
|
+ pBuf[send_pos++] = 0x64;
|
|
|
+ for (i = 0; i < StoreNumber; i++)
|
|
|
+ {
|
|
|
+ pBuf[send_pos++] = Config_info_all.HaiDiFa_info/StoreNumber;
|
|
|
+ for(j=0;j<Config_info_all.HaiDiFa_info/StoreNumber;++j)
|
|
|
+ {
|
|
|
+ pBuf[send_pos++] = Cang_IO_tbak[i][indexHaiDiFa01+10*j];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 2022-8-25, 新增加的子命令
|
|
|
+ // 01, 流水号
|
|
|
+ // 02, 时间戳
|
|
|
+ do {
|
|
|
+ pBuf[send_pos++] = 0x01;
|
|
|
+ pBuf[send_pos++] = (flowID>>24) & 0xff;
|
|
|
+ pBuf[send_pos++] = (flowID>>16) & 0xff;
|
|
|
+ pBuf[send_pos++] = (flowID>>8) & 0xff;
|
|
|
+ pBuf[send_pos++] = (flowID>>0) & 0xff;
|
|
|
+ }while(0);
|
|
|
+
|
|
|
+ send_pos += BuildTimeCmd(pBuf+send_pos);
|
|
|
+
|
|
|
+ while (send_pos<(120+2))
|
|
|
+ {
|
|
|
+ pBuf[send_pos++] = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (pEmergencyflag) *pEmergencyflag = emergencyflag;
|
|
|
+ return send_pos;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ ***************************************
|
|
|
+ * 构建20命令数据 时间戳 -- hex制式
|
|
|
+ * 输入:pBuf-构建数据的存放首地址
|
|
|
+ * 返回: 构建数据的字节总数
|
|
|
+ ***************************************
|
|
|
+ */
|
|
|
+extern SDateTime m_datetime;
|
|
|
+int BuildTimeCmd(uint8_t *pBuf)
|
|
|
+{
|
|
|
+ int send_pos=0;
|
|
|
+
|
|
|
+ pBuf[send_pos++] = 0x02;
|
|
|
+
|
|
|
+ pBuf[send_pos++] = HEXtoBCD(m_datetime.year);
|
|
|
+ pBuf[send_pos++] = HEXtoBCD(m_datetime.month);
|
|
|
+ pBuf[send_pos++] = HEXtoBCD(m_datetime.day);
|
|
|
+ pBuf[send_pos++] = HEXtoBCD(m_datetime.hour);
|
|
|
+ pBuf[send_pos++] = HEXtoBCD(m_datetime.min);
|
|
|
+ pBuf[send_pos++] = HEXtoBCD(m_datetime.sec);
|
|
|
+
|
|
|
+ return send_pos;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ ***************************************
|
|
|
+ * 构建40命令数据 电子铅封 -- hex制式
|
|
|
+ * 输入:pBuf-构建数据的存放首地址
|
|
|
+ * 返回: 构建数据的字节总数
|
|
|
+ ***************************************
|
|
|
+ */
|
|
|
+int BuildSealTxCmd(uint8_t *pBuf, uint8_t *pEmergencyflag) // 40命令
|
|
|
+{
|
|
|
+ Return_data *ret;
|
|
|
+ int n = 0;
|
|
|
+ uint8_t emergencyflag = 0;
|
|
|
+
|
|
|
+ *pBuf++ = 0x40;
|
|
|
+ ret = Seal_Tx_Readvalue(0,0);
|
|
|
+ *pBuf++ = ret->length/2; // 调用返回的数据是asii制式的,所以真实的hex数是其一半
|
|
|
+
|
|
|
+ for(n=0; n < ret->length/2 && n < 100; n++) {
|
|
|
+ pBuf[n] = MODBUS_ASCII_AsciiToHex(ret->data + 2*n);
|
|
|
+ }
|
|
|
+
|
|
|
+ emergencyflag = pBuf[0];
|
|
|
+ if(pEmergencyflag) *pEmergencyflag = emergencyflag;
|
|
|
+ return n+2;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ ***************************************
|
|
|
+ * 构建91命令数据 IO状态 -- hex制式
|
|
|
+ * 输入:pBuf-构建数据的存放首地址
|
|
|
+ * 返回: 构建数据的字节总数
|
|
|
+ ***************************************
|
|
|
+ */
|
|
|
+int Build91Cmd(uint8_t *pBuf, uint8_t *pEmergencyflag)
|
|
|
+{
|
|
|
+ Return_data *ret;
|
|
|
+ int n = 0;
|
|
|
+ uint8_t emergencyflag = 0;
|
|
|
+
|
|
|
+ *pBuf++ = 0x91;
|
|
|
+ ret = IO_Tx_Readvalue(0,0);
|
|
|
+ *pBuf++ = ret->length/2; // 调用返回的数据是asii制式的,所以真实的hex数是其一半
|
|
|
+
|
|
|
+ for(n=0; n < ret->length/2 && n < 100; n++) {
|
|
|
+ pBuf[n] = MODBUS_ASCII_AsciiToHex(ret->data + 2*n);
|
|
|
+ }
|
|
|
+
|
|
|
+ emergencyflag = pBuf[0];
|
|
|
+ if(pEmergencyflag) *pEmergencyflag = emergencyflag;
|
|
|
+ return n+2;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ ***************************************
|
|
|
+ * xy,新透传,41串口透传,模拟F3轮询传感器
|
|
|
+ * 按照周期1构建数据,按照周期2发送数据
|
|
|
+ * 输入:无
|
|
|
+ * 返回: 无
|
|
|
+ * 发送区的格式为:
|
|
|
+ * 数据负载类别,1Byte
|
|
|
+ * 传感器命令数据包数,1Byte
|
|
|
+ * 具体的各个命令数据包,NByte
|
|
|
+ ***************************************
|
|
|
+ */
|
|
|
+void DoInternalSensorScanAndPost()
|
|
|
+{
|
|
|
+ int xlen=0, ylen=0;
|
|
|
+ uint8_t emergencyflag=0;
|
|
|
+ uint8_t *pSendBuf = USART1_TX_BUF;
|
|
|
+ static int step = 0;
|
|
|
+ static int nstep = 0;
|
|
|
+ static uint32_t flowID = 0;
|
|
|
+
|
|
|
+ if(++step % Pass41SensorScanParam.step == 0){
|
|
|
+ for(int n=0; n<Pass41SensorScanParam.cmd_num; n++) {
|
|
|
+ switch (Pass41SensorScanParam.cmd_arr[n]){
|
|
|
+ case 0x40:
|
|
|
+ xlen = BuildSealTxCmd(pSendBuf, emergencyflag?NULL:&emergencyflag);
|
|
|
+ pSendBuf += xlen;
|
|
|
+ ylen += xlen;
|
|
|
+ break;
|
|
|
+ case 0x91:
|
|
|
+ xlen = Build91Cmd(pSendBuf, emergencyflag?NULL:&emergencyflag);
|
|
|
+ pSendBuf += xlen;
|
|
|
+ ylen += xlen;
|
|
|
+ break;
|
|
|
+ case 0xA1:
|
|
|
+ xlen = BuildA1Cmd(pSendBuf, flowID, emergencyflag?NULL:&emergencyflag);
|
|
|
+ pSendBuf += xlen;
|
|
|
+ ylen += xlen;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(emergencyflag) {
|
|
|
+ TerminalSlave485_Send_Data(USART1_TX_BUF,ylen);
|
|
|
+ nstep = 0;
|
|
|
+ emergencyflag = 0;
|
|
|
+ flowID++;
|
|
|
+ } else {
|
|
|
+ if(++nstep % Pass41SensorScanParam.nstep == 0) {
|
|
|
+ TerminalSlave485_Send_Data(USART1_TX_BUF,ylen);
|
|
|
+ flowID++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
#include "leaf_ota.h"
|
|
|
//uint32_t data_count=0;
|
|
@@ -1126,6 +1402,18 @@ void Data_analysis(void)
|
|
|
usart1_rx_flag=0;
|
|
|
usart_timesec=0;
|
|
|
f3_flag=0;
|
|
|
+
|
|
|
+ // xy,匹配到0x0139为首的5字节的头,表示是41串口透传下行的数据
|
|
|
+ // 5字节的头定义为:
|
|
|
+ // [0][1] -- 01 39
|
|
|
+ // [2] -- 透传有效数据长度
|
|
|
+ // [3][4] -- 流水号
|
|
|
+ if( (USART1_RX_BUF[0]==0x01) && (USART1_RX_BUF[1]==0x39)){
|
|
|
+ memcpy(Pass41SensorScanParam.rx_buf,USART1_RX_BUF,5);
|
|
|
+ memcpy(USART1_RX_BUF,USART1_RX_BUF+5,rx1_len-5);
|
|
|
+ rx1_len -=5;
|
|
|
+ }
|
|
|
+
|
|
|
if((USART1_RX_BUF[0]==':') && (USART1_RX_BUF[1]==0xa5) && (USART1_RX_BUF[1]==0xa5))
|
|
|
{
|
|
|
memcpy(USART1_RX_BUF,USART1_RX_BUF+1,rx1_len-5);
|
|
@@ -5048,6 +5336,10 @@ int Process_CMD_0x39_RemoteCali(uint8_t dataMode)
|
|
|
FM25L16B_Read_N_Bytes(ADDR_OiLType_Data,T2C_RemoteCaliDat001.PayLoadData,32);
|
|
|
T2C_RemoteCaliDat001.NumberOfRegs = 32;
|
|
|
break;
|
|
|
+ case ADDR_Sensor_Scan_Param:
|
|
|
+ FM25L16B_Read_N_Bytes(ADDR_Sensor_Scan_Param,T2C_RemoteCaliDat001.PayLoadData,16);
|
|
|
+ T2C_RemoteCaliDat001.NumberOfRegs = 16;
|
|
|
+ break;
|
|
|
default:
|
|
|
|
|
|
//memset(&USART1_TX_BUF[33], '=', sizeof(USART1_TX_BUF) - 33);
|
|
@@ -5356,7 +5648,13 @@ int Process_CMD_0x39_RemoteCali(uint8_t dataMode)
|
|
|
}
|
|
|
T2C_RemoteCaliDat001.NumberOfRegs = 32;
|
|
|
break;
|
|
|
-
|
|
|
+
|
|
|
+ case ADDR_Sensor_Scan_Param:
|
|
|
+ FM25L16B_Write_N_Bytes(ADDR_Sensor_Scan_Param,T2C_RemoteCaliDat001.PayLoadData,16);
|
|
|
+ InitSensorScanParam();
|
|
|
+ T2C_RemoteCaliDat001.NumberOfRegs = 16;
|
|
|
+ break;
|
|
|
+
|
|
|
case ADDR_TiltAngle_Sensor://倾角补偿参数 ----长度为16字节
|
|
|
FM25L16B_Write_N_Bytes(ADDR_TiltAngle_Sensor,T2C_RemoteCaliDat001.PayLoadData,16);
|
|
|
T2C_RemoteCaliDat001.NumberOfRegs=16;
|
|
@@ -5389,14 +5687,13 @@ int Process_CMD_0x39_RemoteCali(uint8_t dataMode)
|
|
|
//memcpy(TimeBuf+1,T2C_RemoteCaliDat001.PayLoadData,6);
|
|
|
#if 0
|
|
|
ds1302_Write_Time(T2C_RemoteCaliDat001.PayLoadData-1);
|
|
|
+
|
|
|
#else
|
|
|
uint8_t Time_buf[16];
|
|
|
memset(Time_buf,0x00,sizeof(Time_buf));
|
|
|
memcpy((void*)&Time_buf[1],(void*)T2C_RemoteCaliDat001.PayLoadData,sizeof(Time_buf) - 1);
|
|
|
ds1302_Write_Time(Time_buf);
|
|
|
#endif
|
|
|
-
|
|
|
-
|
|
|
/*for(i001=0;i001<6;i001++)
|
|
|
{
|
|
|
sprintf((char *)(char*)(&USART1_TX_BUF[33+i001]),"%02X",T2C_RemoteCaliDat001.PayLoadData[i001]);
|