当前位置: 首页 > news >正文

飞利浦双串口51单片机485网关

主要功能将PC端的数据接收下来,分发到不同的设备,也是轮询设备数据读取回来,打包回传到PC端,数据包包头包尾识别,数据校验,接收超时处理,将协议结构化处理,协议的改动不需要改动程序,中断接收一帧完成置标志位交由上层协议程序校验并处理转发

协议格式定义,每一个位都进行了定仪

#ifndef PROTOCOL_H
#define PROTOCOL_H
#include "define.h"
//IO_EMM_31
typedef struct 
{uchar Stx;uchar Length;uchar ID;uchar TollCollectorID[3];uchar LoginDuration[2];uchar VehicleClass;union{uchar byte;struct{uchar Payment:4;uchar Axle:4;}BIT;}AxlePaymentDisplay;union{uint word;uchar byte[2];}TollFare;union{uchar byte;struct{			uchar reserved:1;uchar Exit_LSS_Rlight:1;uchar BarrierClose:1;uchar BarrierOpen:1;uchar Entry_LSS_Rlight:1;uchar Entry_LSS_Glight:1;uchar LaneLog:1;uchar zero:1;}BIT;}TMU_Control1;union{uchar byte;struct{uchar EmergencyAlarm:1;uchar EvasionAlarm:1;uchar DiscrepancyAlarm:1;uchar MisregistrationAlarm:1;uchar reserved:1;uchar AxleDectorFault:1;uchar BoothEquipmentFault:1;uchar zero:1;}BIT;}TMU_Control2;union{uchar byte;struct{uchar EmergencyAlarmRstBut:1;uchar EvalsionAlarmRstBut:1;uchar DiscrepancyAlarmRstBut:1;uchar MisregistrationAlarmRstBut:1;uchar AxleDetectorOVerride:1;uchar KeyInOverrideSelect:1;uchar reserved:1;uchar zero:1;}BIT;}ConStatus1;union{uchar byte;struct{uchar resetved:4;uchar TMUCommFail:1;uchar TMUDimmerOverAct:1;uchar AllSignageDimmming:1;uchar zero:1;}BIT;}ConStatus2;union{uchar byte;struct{uchar reserved:1;uchar CanopyBeacon:1;uchar Entry_LSS_Rlight:1;uchar Entry_LSS_Glight:1;uchar TPS_Glight:1;uchar TPS_Rlight:1;uchar DimmingNormal:1;uchar zero:1;}BIT;}SignageControl;union{uchar byte;struct{uchar TPSCommFail:1;uchar reserve2:1;uchar reserve1:1;uchar TPSTempHigher70:1;uchar CLSCommFail:1;uchar CLSPixelFaultDetect:1;uchar CLSTempHigher70:1;uchar zero:1;}BIT;}TPS_CLSFaultStatus;union{uchar byte;struct{uchar EntryCommFail:1;uchar ExitCommFail:1;uchar RlightAspectHigher50:1;uchar RlightAspectHigher25:1;uchar TempHigher70:1;uchar reseved:1;uchar Rlight:1;uchar zero:1;}BIT;}ExitLSSStatus;union{uchar byte;struct{uchar GlightAspectHigher50:1;uchar GlightAspectHigher25:1;uchar RlightAspectHigher50:1;uchar RlightAspectHigher25:1;uchar TempHigher70:1;uchar Glight:1;uchar Rlight:1;uchar zero:1;}BIT;}EntryLSSStatus;union{uchar byte;struct{uchar ShortDetect:1;uchar reserved:2;uchar KickBarAlarm:1;uchar CabinetOpen:1;uchar BarrierColse:1;uchar BarrierOpen:1;uchar zero:1;}BIT;}LocalIOInputStatus;union{uchar byte;struct{uchar Class0:1;uchar Class1:1;uchar Class2:1;uchar Class3:1;uchar Class4:1;uchar Class5:1;uchar Class6:1;uchar zero:1;}BIT;}AutoTollInputStatus1;union{uchar byte;struct{uchar Class7:1;uchar Class8:1;uchar Class9:1;uchar ClassAdd1:1;uchar LaneOpen:1;uchar LaneClose:1;uchar reserved:1;uchar zero:1;}BIT;}AutoTollInputStatus2;union{uchar byte;struct{uchar Axle1:1;uchar Axle2:1;uchar Axle3:1;uchar Axle4:1;uchar Axle5:1;uchar Axle6:1;uchar reserved:1;uchar zero:1;}BIT;}AutoTollInputStatus3;uchar Checksum;uchar Etx;
}IO_EMM_31;//IO_EMM_32
typedef struct
{uchar Stx;uchar Length;uchar ID;union{uchar byte;struct{uchar reserved:1;uchar Dimmer:3;uchar Normal:3;uchar zero:1;}BIT;}TPSSetting;union{uchar byte;struct{uchar reserved:1;uchar Dimmer:3;uchar Normal:3;uchar zero:1;}BIT;}CLSSetting;union{uchar byte;struct{uchar reserved:1;uchar Dimmer:3;uchar Normal:3;uchar zero:1;}BIT;}EntryLSSSetting;union{uchar byte;struct{uchar reserved:1;uchar Dimmer:3;uchar Normal:3;uchar Zero:1;}BIT;}ExitLSSSetting;uchar Checksum;uchar Etx;
}IO_EMM_32;//IO_TMU
typedef struct
{uchar Stx;uchar Length;uchar ID;uchar TollCollectorID[3];uchar LoginDuration[2];uchar VehicleClass;union{uchar byte;struct{uchar Payment:4;uchar Axle:4;}BIT;}AxlePaymentDisplay;union{uchar byte;struct{			uchar reserved:1;uchar Exit_LSS_Rlight:1;uchar BarrierClose:1;uchar BarrierOpen:1;uchar Entry_LSS_Rlight:1;uchar Entry_LSS_Glight:1;uchar LaneLog:1;uchar zero:1;}BIT;}TMU_Control1;union{uchar byte;struct{uchar EmergencyAlarm:1;uchar EvasionAlarm:1;uchar DiscrepancyAlarm:1;uchar MisregistrationAlarm:1;uchar reserved:1;uchar AxleDectorFault:1;uchar BoothEquipmentFault:1;uchar zero:1;}BIT;}TMU_Control2;union{uchar byte;struct{uchar EmergencyAlarmRstBut:1;uchar EvalsionAlarmRstBut:1;uchar DiscrepancyAlarmRstBut:1;uchar MisregistrationAlarmRstBut:1;uchar AxleDetectorOVerride:1;uchar KeyInOverrideSelect:1;uchar reserved:1;uchar zero:1;}BIT;}ConStatus1;union{uchar byte;struct{uchar resetved:5;uchar TMUDimmerOverAct:1;uchar AllSignageDimming:1;uchar zero:1;}BIT;}ConStatus2;uchar Checksum;uchar Etx;
}IO_TMU;//IO_TPS
typedef struct
{uchar Stx;uchar Length;uchar ID;union{uint word;uchar byte[2];}TollFare;union{uchar byte;struct{uchar DispPleasePaid:1;uchar DispThankyou:1;uchar Rlight:1;uchar Glight:1;uchar BrightnessControl:3;uchar reserved:1;}BIT;}LedDisplay;union{uchar byte;struct{uchar TempHigher70:1;uchar reserved:7;}BIT;}Status;uchar Checksum;uchar Etx;
}IO_TPS;//IO_CLS
typedef struct
{uchar Stx;uchar Length;uchar ID;uchar VehicleClass;union{uchar byte;struct{uchar Axle:3;uchar reserved1:1;uchar RelayContactClose:1;uchar reserved2:3;}BIT;}AxleCounterDisplay;union{uchar byte;struct{uchar reserved:4;uchar Brightness:3;uchar zero:1;}BIT;}BrightnessControl;union{uchar byte;struct{uchar TempHigher70:1;uchar PixelFaultDetected:1;uchar reserved:6;}BIT;}Status;uchar Checksum;uchar Etx;
}IO_CLS;//IO_LSS
typedef struct
{uchar Stx;uchar Length;uchar ID;union{uchar byte;struct{uchar Rlight:1;uchar Glight:1;uchar reserved:6;			}BIT;}SignalDisp;union{uchar byte;struct{uchar RlightAspectHigher25:1;uchar RlightAspectHigher50:1;uchar GlightAspectHigher25:1;uchar GlightAspectHigher50:1;uchar BrightnessControl:3;uchar reserved:1;			}BIT;}Status1;union{uchar byte;struct{uchar TempHigher70:1;uchar reserved:7;}BIT;}Status2;uchar Checksum;uchar Etx;
}IO_LSS;typedef struct
{uchar Dimmer;uchar Normal;
}BRIGHTNESS;
#endif

中断接收与发送

void IntUart0Rx( void ) interrupt 4
{uchar temp;static uchar MsgLen;if( RI_0 ){RI_0 = 0;temp = S0BUF;Timer1ms[TIMER_COM_DEV].Tick = 10;Timer1ms[TIMER_COM_DEV].Flg.BIT.Enable = 1;Timer[TIMER_RESPONSE].Tick = 5;ACC = temp;if( P==RB8_0 ){if( !DevStrEndFlg ){if( temp==0xaa ){									  DevStrEndFlg = 1;IO2Dev.RecvPtr = 0;IO2Dev.RecvBuf[IO2Dev.RecvPtr++] = temp;IO2Dev.Error.byte = 0;}}else{if( temp==0xab && IO2Dev.RecvPtr==MsgLen ){DevStrEndFlg = 0;IO2Dev.RecvBuf[IO2Dev.RecvPtr++] = temp;IO2Dev.Flg.BIT.Recv = 1;IO2Dev.RecvLen = IO2Dev.RecvPtr;}/*else if( temp==0xaa  && IO2Dev.RecvPtr!=MsgLen-1 ){IO2Dev.RecvPtr = 0;IO2Dev.RecvBuf[IO2Dev.RecvPtr++] = temp;}*/else if( IO2Dev.RecvPtr==2 ){IO2Dev.ID = temp;IO2Dev.RecvBuf[IO2Dev.RecvPtr++] = temp;switch( IO2Dev.ID ){case IO_TMU_ID:MsgLen = sizeof( IO_TMU )-1;break;case IO_TPS_ID:MsgLen = sizeof( IO_TPS )-1;break;case IO_CLS_ID:MsgLen = sizeof( IO_CLS )-1;break;case IO_ELSS_ID:MsgLen = sizeof( IO_LSS )-1;break;case IO_XLSS_ID:MsgLen = sizeof( IO_LSS )-1;break;default:DevStrEndFlg = 0;}}else if( IO2Dev.RecvPtr<RECVBUF_LEN ){IO2Dev.RecvBuf[IO2Dev.RecvPtr++] = temp;}else  //接收数据溢出{DevStrEndFlg = 0;IO2Dev.RecvPtr = 0;}
//				flg = IO2Dev.RecvPtr;}}else{IO2Dev.Error.BIT.Even = 1;}}else if( S0STAT&0x08 )//Framing Error{S0STAT &= ~0x08;IO2Dev.Error.BIT.Framing = 1;}else if( S0STAT&0x04 )//Break Detect{S0STAT &= ~0x04;IO2Dev.Error.BIT.BreakDetect = 1;}else if( S0STAT&0x02 )//Overrun Error{S0STAT &= ~0x02;IO2Dev.Error.BIT.Overrun = 1;}
}//串行口0的发送中断程序
void IntUart0Tx( void ) interrupt 7
{Uart0SendData();
}

以指针提取数据
在这里插入图片描述

#include "Emm2IO.h"
#include "com.h"
#include "protocol.h"
#include "systemtask.h"
#include "IOCheck.h"IO_EMM_31 IOEmm31;
extern BUF_DEF Emm2IO;
extern IO_TMU IOTmu;
extern IO_TPS IOTps;
extern IO_CLS IOCls;
extern IO_LSS IOEntryLss;
extern IO_LSS IOExitLss;
extern BRIGHTNESS TpsBrightness,ClsBrightness,EntryLssBrightness,ExitLssBrightness;extern IO_CHECK_DEF IoCheck;
extern TIMER_DEF Timer[TIMER_NUM];
extern uchar flg;
void Emm2IOInit( void )
{//31IOEmm31.Stx = 0xaa;IOEmm31.Length = 0x18;IOEmm31.ID = 0x20;IOEmm31.ConStatus1.byte = 0;IOEmm31.ConStatus2.byte = 0x10;IOEmm31.TPS_CLSFaultStatus.byte = 0x11;IOEmm31.ExitLSSStatus.byte = 0x03;IOEmm31.EntryLSSStatus.byte = 0x00;IOEmm31.LocalIOInputStatus.byte = 0x00;IOEmm31.AutoTollInputStatus1.byte = 0x00;IOEmm31.AutoTollInputStatus2.byte = 0x00;IOEmm31.AutoTollInputStatus3.byte = 0x00;IOEmm31.Etx = 0xab;Emm2IO.Flg.byte = 0;Emm2IO.SendLen = 0;Emm2IO.RecvLen = 0;Emm2IO.SendPtr = 0;Emm2IO.RecvPtr = 0;Timer[TIMER_STOP].Flg.BIT.TimeOut = 0;Timer[TIMER_STOP].Tick = 500;Timer[TIMER_STOP].Flg.BIT.Enable = 1;
}
//从Emm2IOController31的接收数据中取出需要的内容放到设备缓冲区中
void CopyEmm31ToDev( IO_EMM_31 *IoEmm31Ptr )
{//TMUIOTmu.TollCollectorID[0] = IoEmm31Ptr->TollCollectorID[0];IOTmu.TollCollectorID[1] = IoEmm31Ptr->TollCollectorID[1];IOTmu.TollCollectorID[2] = IoEmm31Ptr->TollCollectorID[2];IOTmu.LoginDuration[0] = IoEmm31Ptr->LoginDuration[0];IOTmu.LoginDuration[1] = IoEmm31Ptr->LoginDuration[1];IOTmu.VehicleClass = IoEmm31Ptr->VehicleClass;IOTmu.AxlePaymentDisplay.byte = IoEmm31Ptr->AxlePaymentDisplay.byte;IOTmu.TMU_Control1.byte = IoEmm31Ptr->TMU_Control1.byte;IOTmu.TMU_Control2.byte = IoEmm31Ptr->TMU_Control2.byte;//TPSIOTps.TollFare.byte[0] = IoEmm31Ptr->TollFare.byte[0];IOTps.TollFare.byte[1] = IoEmm31Ptr->TollFare.byte[1];IOTps.LedDisplay.BIT.Glight = IoEmm31Ptr->SignageControl.BIT.TPS_Glight;IOTps.LedDisplay.BIT.Rlight = IoEmm31Ptr->SignageControl.BIT.TPS_Rlight;if( (((IoEmm31Ptr->TollFare.byte[0]&0xf0)>>4) == 0x000c) && (IoEmm31Ptr->AxlePaymentDisplay.BIT.Payment == 0x0b) ){IOTps.LedDisplay.BIT.DispPleasePaid = 1;IOTps.LedDisplay.BIT.DispThankyou = 0;}else if( (((IoEmm31Ptr->TollFare.byte[0]&0xf0)>>4) == 0x0000c) && (IoEmm31Ptr->AxlePaymentDisplay.BIT.Payment != 0x0b) ){IOTps.LedDisplay.BIT.DispPleasePaid = 0;IOTps.LedDisplay.BIT.DispThankyou = 1;}else if( ((IoEmm31Ptr->TollFare.byte[0]&0xf0)>>4) == 0x0000b ){IOTps.LedDisplay.BIT.DispPleasePaid = 0;IOTps.LedDisplay.BIT.DispThankyou = 0;}else{IOTps.LedDisplay.BIT.DispPleasePaid = 0;IOTps.LedDisplay.BIT.DispThankyou = 0;}//CLSIOCls.VehicleClass = IoEmm31Ptr->VehicleClass;if( IoEmm31Ptr->AxlePaymentDisplay.BIT.Axle>0 && IoEmm31Ptr->AxlePaymentDisplay.BIT.Axle<7 ){IOCls.AxleCounterDisplay.BIT.Axle = IoEmm31Ptr->AxlePaymentDisplay.BIT.Axle;}else{IOCls.AxleCounterDisplay.BIT.Axle = 0;}IOCls.AxleCounterDisplay.BIT.RelayContactClose = IoEmm31Ptr->SignageControl.BIT.CanopyBeacon;//EntryLSSIOEntryLss.SignalDisp.BIT.Rlight = IoEmm31Ptr->SignageControl.BIT.Entry_LSS_Rlight;if( IoEmm31Ptr->SignageControl.BIT.Entry_LSS_Glight && IOEmm31.LocalIOInputStatus.BIT.BarrierOpen &&!IOEmm31.LocalIOInputStatus.BIT.BarrierColse ){IOEntryLss.SignalDisp.BIT.Glight = 1;IOEntryLss.SignalDisp.BIT.Rlight = 0;}else{IOEntryLss.SignalDisp.BIT.Glight = 0;IOEntryLss.SignalDisp.BIT.Rlight = 1;}//ExitLSSif( IoEmm31Ptr->SignageControl.BIT.DimmingNormal ){IOTps.LedDisplay.BIT.BrightnessControl = TpsBrightness.Dimmer;IOCls.BrightnessControl.BIT.Brightness = ClsBrightness.Dimmer;IOEntryLss.Status1.BIT.BrightnessControl = EntryLssBrightness.Dimmer;IOExitLss.Status1.BIT.BrightnessControl = ExitLssBrightness.Dimmer;}else{IOTps.LedDisplay.BIT.BrightnessControl = TpsBrightness.Normal;IOCls.BrightnessControl.BIT.Brightness = ClsBrightness.Normal;IOEntryLss.Status1.BIT.BrightnessControl = EntryLssBrightness.Normal;IOExitLss.Status1.BIT.BrightnessControl = ExitLssBrightness.Normal;}
}
//从接收的Emm2IOController31的数据更新Emm31缓冲区
void CopyEmm31ToEmm31Buf( IO_EMM_31 *IoEmm31Ptr )
{uchar *Sptr,*Dptr,i;Sptr = (uchar*)IoEmm31Ptr;Dptr = (uchar*)&IOEmm31;for( i=0; i<11; i++ ){*(Dptr+i+3) = *(Sptr+i+3);}*(Dptr+16) = *(Sptr+16);
}
//更新各设备的亮度值
void CopyEmm32ToDev( IO_EMM_32 *IoEmm32Ptr )
{//TPSTpsBrightness.Dimmer = IoEmm32Ptr->TPSSetting.BIT.Dimmer;TpsBrightness.Normal = IoEmm32Ptr->TPSSetting.BIT.Normal;//CLSClsBrightness.Dimmer = IoEmm32Ptr->CLSSetting.BIT.Dimmer;ClsBrightness.Normal = IoEmm32Ptr->CLSSetting.BIT.Normal;//EntryLSSEntryLssBrightness.Dimmer = IoEmm32Ptr->EntryLSSSetting.BIT.Dimmer;EntryLssBrightness.Normal = IoEmm32Ptr->EntryLSSSetting.BIT.Normal;//ExitLSSExitLssBrightness.Dimmer = IoEmm32Ptr->ExitLSSSetting.BIT.Dimmer;ExitLssBrightness.Normal = IoEmm32Ptr->ExitLSSSetting.BIT.Normal;
}
//判断是否已从EMM接收完整的数据包,并进行处理
void Emm2IOMain( void )
{uchar ver,*ptr;IO_EMM_31 *IoEmm31Ptr;IO_EMM_32 *IoEmm32Ptr;if( Emm2IO.Flg.BIT.Recv ){Emm2IO.Flg.BIT.Recv = 0;Timer[TIMER_STOP].Tick = 500;Timer[TIMER_STOP].Flg.BIT.Enable = 1;if( Emm2IO.Error.byte == 0 ){ver = Checksum( &Emm2IO.RecvBuf[1],Emm2IO.RecvLen-3 );if( Emm2IO.ID==EMM_IO31_ID ){IoEmm31Ptr = (IO_EMM_31 *)Emm2IO.RecvBuf;if( ver==IoEmm31Ptr->Checksum ){CopyEmm31ToDev( IoEmm31Ptr );CopyEmm31ToEmm31Buf( IoEmm31Ptr );ptr = (uchar*)&IOEmm31;ptr++;
//					IOEmm31.AutoTollInputStatus3.byte = IoCheck.SaveState.byte[3];
//					IOEmm31.LocalIOInputStatus.byte = IoCheck.SaveState.byte[0];
//					IOEmm31.AutoTollInputStatus1.byte = IoCheck.SaveState.byte[1];
//					IOEmm31.AutoTollInputStatus2.byte = IoCheck.SaveState.byte[2];
//					IOEmm31.AutoTollInputStatus3.byte = IoCheck.SaveState.byte[3];ver = Checksum( ptr,sizeof(IO_EMM_31)-3 );IOEmm31.Checksum = ver;CopyToUart1SendBuf( (uchar*)&IOEmm31, sizeof(IO_EMM_31) );}}else if( Emm2IO.ID==EMM_IO32_ID ){IoEmm32Ptr = (IO_EMM_32 *)Emm2IO.RecvBuf;if( ver==IoEmm32Ptr->Checksum ){CopyEmm32ToDev( IoEmm32Ptr );CopyToUart1SendBuf( (uchar*)IoEmm32Ptr, sizeof(IO_EMM_32) );}}}else{Emm2IO.Error.byte = 0;}Emm2IO.RecvPtr = 0;Emm2IO.ID = 0;}//When no polling with EMM > 5 seconds.if( Timer[TIMER_STOP].Flg.BIT.TimeOut ){Timer[TIMER_STOP].Flg.BIT.TimeOut = 0;//TMUIOTmu.TollCollectorID[0] = 0x0b;IOTmu.TollCollectorID[1] = 0xbb;IOTmu.TollCollectorID[2] = 0xbb;IOTmu.LoginDuration[0] = 0xbb;IOTmu.LoginDuration[1] = 0xbb;IOTmu.VehicleClass = 0xbb;IOTmu.AxlePaymentDisplay.byte = 0xbb;IOTmu.TMU_Control1.byte = 0x00;IOTmu.TMU_Control2.byte = 0x40;//TPSIOTps.TollFare.word = 0xbbbb;IOTps.LedDisplay.BIT.Rlight = 1;IOTps.LedDisplay.BIT.Glight = 0;IOTps.LedDisplay.BIT.DispPleasePaid = 0;IOTps.LedDisplay.BIT.DispThankyou = 0;//CLSIOCls.VehicleClass = 0xbb;IOCls.AxleCounterDisplay.byte = 0x00;//Entry LssIOEntryLss.SignalDisp.byte = 0x01;//Exit LssIOExitLss.SignalDisp.byte = 0x01;}
}

主程序循环,
在这里插入图片描述
代码多年前写,基于飞利浦双串口51单片机,程序结构是大循环前后台标志,就算现在用上了linux、rtos等的方式,程序接收处理方式差别不大,只是实现起来更简单

下面是完整工程连接
链接:https://pan.baidu.com/s/1bXOrMRH6Gf7kcjra4uANtA?pwd=1234
提取码:1234

相关文章:

飞利浦双串口51单片机485网关

主要功能将PC端的数据接收下来&#xff0c;分发到不同的设备&#xff0c;也是轮询设备数据读取回来&#xff0c;打包回传到PC端&#xff0c;数据包包头包尾识别&#xff0c;数据校验&#xff0c;接收超时处理&#xff0c;将协议结构化处理&#xff0c;协议的改动不需要改动程序…...

生态扩展:Flink Doris Connector

生态扩展&#xff1a;Flink Doris Connector 官网地址&#xff1a; https://doris.apache.org/zh-CN/docs/dev/ecosystem/flink-doris-connector flink的安装&#xff1a; tar -zxvf flink-1.16.0-bin-scala_2.12.tgz mv flink-1.16.0-bin-scala_2.12.tgz /opt/flinkflink环境…...

HarmonyOS(二)—— 初识ArkTS开发语言(上)之TypeScript入门

前言 Mozilla创造了JS&#xff0c;Microsoft创建了TS&#xff0c;而Huawei进一步推出了ArkTS。因此在学习使用ArkTS前&#xff0c;需要掌握基本的TS开发技能。 ArkTS介绍 ArkTS是HarmonyOS优选的主力应用开发语言。它在TypeScript&#xff08;简称TS&#xff09;的基础上&am…...

从零开始实现神经网络(一)_NN神经网络

参考文章&#xff1a;神经网络介绍 一、神经元 这一神经网络的基本单元&#xff0c;神经元接受输入&#xff0c;对它们进行一些数学运算&#xff0c;并产生一个输出。 这里有三步。 首先&#xff0c;将每个输入&#xff08;X1&#xff09;乘以一个权重&#xff1a; 接下来&…...

C语言 每日一题 Day10

1.使用函数判断完全平方数 本题要求实现一个判断整数是否为完全平方数的简单函数。 函数接口定义&#xff1a; int IsSquare(int n); 其中n是用户传入的参数&#xff0c;在长整型范围内。如果n是完全平方数&#xff0c;则函数IsSquare必须返回1&#xff0c;否则返回0。 代码实…...

C++继承——矩形和长方体

Rectangle矩形类 /*矩形类*/ class Rectangle { private:double L 0;double W 0; public:Rectangle() default;Rectangle(double a, double b);double GetArea(); /*矩形面积*/double GetGirth(); /*矩形周长*/ }; /*构造函数*/ Rectangle::Rectangle(double a, double b) …...

代码随想录打卡第五十八天|● 583. 两个字符串的删除操作 ● 72. 编辑距离

583. 两个字符串的删除操作 题目&#xff1a; 给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 题目链接&#xff1a; 583. 两个字符串的删除操作 解题思路&#xff1a; dp数组的含义&am…...

面试流程之——程序员如何写项目经验

在简历中介绍IT项目经验&#xff0c;你可以遵循以下步骤&#xff1a; 明确项目目标&#xff1a;首先&#xff0c;清晰地阐述项目的目标。这可以是提升某个软件的性能&#xff0c;改进某个系统的用户界面&#xff0c;或者增加某款产品的功能。让读者了解你的工作与项目的整体目…...

框架安全-CVE 漏洞复现DjangoFlaskNode.jsJQuery框架漏洞复现

目录 服务攻防-框架安全&CVE复现&Django&Flask&Node.JS&JQuery漏洞复现中间件列表介绍常见语言开发框架Python开发框架安全-Django&Flask漏洞复现Django开发框架漏洞复现CVE-2019-14234&#xff08;Django JSONField/HStoreField SQL注入漏洞&#xff…...

基于SSM的理发店管理系统

基于SSM的理发店管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 公告信息 管理员界面 用户界面 摘要 基于SSM&#xff08;Spring、Spring MVC、…...

2.Spark的工作与架构原理

概述 目标&#xff1a; spark的工作原理spark数据处理通用流程rdd 什么是rddrdd 的特点 spark架构 spark架构相关进程spark架构原理 spark的工作原理 spark 的工作原理&#xff0c;如下图 图中中间部分是spark集群&#xff0c;也可以是基于 yarn 的&#xff0c;图上可以…...

qt-C++笔记之带有倒计数显示的按钮,计时期间按钮锁定

qt-C笔记之带有倒计数显示的按钮&#xff0c;计时期间按钮锁定 code review! 文章目录 qt-C笔记之带有倒计数显示的按钮&#xff0c;计时期间按钮锁定1.运行2.main.cc3.main.pro 1.运行 2.main.cc 代码 #include <QApplication> #include <QPushButton> #includ…...

HTML全局属性(global attribute)有哪些?

HTML全局属性是指在HTML元素上可用的基本属性&#xff0c;它们适用于所有HTML元素。以下是一些常见的HTML全局属性&#xff1a; 1&#xff1a;class&#xff1a;为元素指定一个或多个类名&#xff0c;用于与CSS样式表关联。 2&#xff1a;id&#xff1a;:为元素指定唯一的标识…...

MyBatis-Plus返回getOne返回null疑惑

getOne返回null 问题描述分析过程总结 问题描述 在数据库建了一张表主要包括两个字段master_id和slave_id;主要的额外字段max_lots 默认值是null&#xff1b; 当调用getOne进行查询结果是null&#xff0c;但实际情况是数据库时应该返回值的&#xff1b; AotfxMasterSlave ex…...

Physics2DPlugin3加载后会跳转gsap官网解决

因工作需要使用Physics2DPlugin3库&#xff0c;目标效果 加载他里面的在线js&#xff0c;使用效果正常&#xff0c;但是几秒会跳转官网&#xff0c;我们app内部、浏览器都会这样。 于是研究js代码&#xff0c;发现里面有setTimeout跳转。 删掉就好了 分享我改好的文件&#x…...

【AI视野·今日Sound 声学论文速览 第三十二期】Tue, 24 Oct 2023

AI视野今日CS.Sound 声学论文速览 Tue, 24 Oct 2023 Totally 20 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;nvas3d, 基于任意录音和室内3D信息合成重建不同听角&#xff08;位置&#xff09;处的新的声音。(from apple cmu) website: htt…...

在Linux上编译gdal3.1.2指南

作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> 以Ubuntu 18编译gdal3.1.2为例,编译gdal3.1.2需要先编译proj库和geos库(可选)。我选择的proj库版本为proj-7.1.0,编译proj-7.1.0需要先编译tiff库和sqlite3。我选择的sqlite3的版本为…...

73. 矩阵置零 --力扣 --JAVA

题目 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 解题思路 通过二层循环找出元素为0所在的行和列&#xff1b;设置标志位记录当前行是否存在元素为0的&#xff0c;设置列表存储列为0的列&#…...

(笔记)Kotlin——Android封装ViewBinding之二 优化

0. 在app模块的build.gradle文件中添加如下配置开启ViewBinding android {.......viewBinding {enabled true}} 1. 新建一个Ext.kt文件 添加两个扩展函数&#xff0c;分别对应Activity和Fragment inline fun <T : ViewBinding> AppCompatActivity.viewBinding(cross…...

MATLAB算法实战应用案例精讲-【图像处理】机器视觉(基础篇)(八)

目录 前言 几个高频面试题目 机器视觉如何获取到好图像 常见的视觉光源 各种视觉打光方式...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

热烈祝贺埃文科技正式加入可信数据空间发展联盟

2025年4月29日&#xff0c;在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上&#xff0c;可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞&#xff0c;强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...

内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献

Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译&#xff1a; ### 胃肠道癌症的发病率呈上升趋势&#xff0c;且有年轻化倾向&#xff08;Bray等人&#xff0c;2018&#x…...

EasyRTC音视频实时通话功能在WebRTC与智能硬件整合中的应用与优势

一、WebRTC与智能硬件整合趋势​ 随着物联网和实时通信需求的爆发式增长&#xff0c;WebRTC作为开源实时通信技术&#xff0c;为浏览器与移动应用提供免插件的音视频通信能力&#xff0c;在智能硬件领域的融合应用已成必然趋势。智能硬件不再局限于单一功能&#xff0c;对实时…...

工厂方法模式和抽象工厂方法模式的battle

1.案例直接上手 在这个案例里面&#xff0c;我们会实现这个普通的工厂方法&#xff0c;并且对比这个普通工厂方法和我们直接创建对象的差别在哪里&#xff0c;为什么需要一个工厂&#xff1a; 下面的这个是我们的这个案例里面涉及到的接口和对应的实现类&#xff1a; 两个发…...

LTR-381RGB-01RGB+环境光检测应用场景及客户类型主要有哪些?

RGB环境光检测 功能&#xff0c;在应用场景及客户类型&#xff1a; 1. 可应用的儿童玩具类型 (1) 智能互动玩具 功能&#xff1a;通过检测环境光或物体颜色触发互动&#xff08;如颜色识别积木、光感音乐盒&#xff09;。 客户参考&#xff1a; LEGO&#xff08;乐高&#x…...

Java高级 |【实验八】springboot 使用Websocket

隶属文章&#xff1a;Java高级 | &#xff08;二十二&#xff09;Java常用类库-CSDN博客 系列文章&#xff1a;Java高级 | 【实验一】Springboot安装及测试 |最新-CSDN博客 Java高级 | 【实验二】Springboot 控制器类相关注解知识-CSDN博客 Java高级 | 【实验三】Springboot 静…...

信息收集:从图像元数据(隐藏信息收集)到用户身份的揭秘 --- 7000

目录 &#x1f310; 访问Web服务 &#x1f4bb; 分析源代码 ⬇️ 下载图片并保留元数据 &#x1f50d; 提取元数据&#xff08;重点&#xff09; &#x1f464; 生成用户名列表 &#x1f6e0;️ 技术原理 图片元数据&#xff08;EXIF 数据&#xff09; Username-Anarch…...

Docker 镜像上传到 AWS ECR:从构建到推送的全流程

一、在 EC2 实例中安装 Docker&#xff08;适用于 Amazon Linux 2&#xff09; 步骤 1&#xff1a;连接到 EC2 实例 ssh -i your-key.pem ec2-useryour-ec2-public-ip步骤 2&#xff1a;安装 Docker sudo yum update -y sudo amazon-linux-extras enable docker sudo yum in…...