活动介绍
file-type

N2ConfigApi:让配置文件管理更简单的Java解决方案

ZIP文件

下载需积分: 5 | 33KB | 更新于2025-08-11 | 52 浏览量 | 0 下载量 举报 收藏
download 立即下载
在这一部分中,我们将会深入解读标题为"N2Configuration"的文件所包含的IT知识点,这些信息主要涉及到Java编程语言以及软件配置管理方面的内容。以下是根据文件描述提炼出的相关知识点。 ### 知识点一:配置管理API的作用和设计初衷 - 文件标题中的"N2Configuration"暗示这是一个配置管理API(Application Programming Interface),即一种软件库或框架,其目的是为了使软件开发人员能够更容易地管理应用程序的配置文件。 - 描述中提到的“为什么Api for ConfigFiles”表明该API专门设计用来处理配置文件,而不是通常意义上的所有类型的API。API对于配置文件的管理提供了简化的接口。 - 描述中提到的“Forge”,指的是Minecraft的一个开源模组加载器和API框架,表明该API可能是在Minecraft模组开发的背景下创建的。"Age"可能是指一个模组,而该作者觉得Forge中的配置机制不够完善,因此自己动手开发了N2Config API。 - 作者在设计API时有意识地考虑了易用性,即希望配置文件对"每个人使用"都简单易懂。 ### 知识点二:教程与文档 - 文档中提到的"讲解api中包含3个教程"暗示N2Config API附带了一套用户指南或学习材料,这通常会包括一系列的示例代码和详细解释,帮助用户了解如何使用该API。 - 这些教程可能位于"地图文档"中,这可能是一个特定的术语,表示N2Config API的文档结构,也许是指在某种界面或网站上的布局,其中可能包含教程、示例和API的说明。 - API的机制摘要或说明部分,则是给开发者关于如何使用API的更深层次的技术细节。 ### 知识点三:错误报告和反馈机制 - 描述中提到的"错误报告/建议"部分表明,该API项目鼓励用户在发现错误或者认为API缺少某些功能时向开发者提供反馈。这种方式有助于API的持续改进和稳定。 - 用户可以通过两种主要方式提供反馈:一是发布到项目的GitHub上,二是通过论坛。这显示了项目维护者希望构建一个开放和协作的社区环境,使得API能够根据用户需求进行优化。 ### 知识点四:安装与使用 - 文件中说明了如何使用该API,即通过下载N2Config.zip文件,并将其解压到项目的资源文件夹中或Java文件夹中。这显示了安装步骤,同时也指出了一个不推荐的方式,即不将文件解压到Java文件夹中,这可能是为了避免某些潜在的冲突或者是为了保持项目的结构清晰。 - 文件名称" N2Configuration-master"表明这是一个主分支或者主要版本的压缩包,通常意味着用户下载的是该API的最新版本或者是稳定版本。 ### 知识点五:Java编程语言的运用 - 标签"Java"指明了该API是使用Java编程语言编写的。了解Java是使用该API的前提,因为API通常是通过编写代码来调用的。 - Java作为一门广泛使用的面向对象编程语言,经常被用来开发企业级应用、移动应用、服务器端应用等。在这个情境中,Java用于处理配置文件,这可能包括读取、写入、序列化和反序列化配置数据等操作。 ### 总结 综上所述,"N2Configuration"文件中所描述的API项目,是一个针对Java开发环境设计的配置管理解决方案。它旨在通过提供一套简便的接口,帮助开发者高效地管理配置文件,同时鼓励社区参与和反馈,以便API能够更好地满足用户的实际需求。通过上述知识点的梳理,我们可以看到一个典型的开源项目是如何构建和维护的,以及它如何与Java编程语言紧密相关联。

相关推荐

filetype

D:\5CTF\ruan jian\UsbKeyboardDataHacker-main>python UsbKeyboardDataHacker.py --input D:\金砖\网络安全防护治理\样题\流量分析\8c90b141-714a-4a34-8e30-5b1ecbcf328b\foremost_output\zip\key.pcap Traceback (most recent call last): File "D:\5CTF\ruan jian\UsbKeyboardDataHacker-main\UsbKeyboardDataHacker.py", line 121, in <module> main() File "D:\5CTF\ruan jian\UsbKeyboardDataHacker-main\UsbKeyboardDataHacker.py", line 113, in main for timestamp, press in parse_pcap_file(args.input): File "D:\5CTF\ruan jian\UsbKeyboardDataHacker-main\UsbKeyboardDataHacker.py", line 18, in parse_pcap_file for packet in cap: File "C:\Users\朱\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\pyshark\capture\capture.py", line 212, in _packets_from_tshark_sync tshark_process = existing_process or self.eventloop.run_until_complete( File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3568.0_x64__qbz5n2kfra8p0\lib\asyncio\base_events.py", line 647, in run_until_complete return future.result() File "C:\Users\朱\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\pyshark\capture\capture.py", line 340, in _get_tshark_process parameters = [self._get_tshark_path(), "-l", "-n", "-T", output_type] + \ File "C:\Users\朱\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\pyshark\capture\capture.py", line 315, in _get_tshark_path return get_process_path(self.tshark_path) File "C:\Users\朱\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\pyshark\tshark\tshark.py", line 70, in get_process_path raise TSharkNotFoundException( pyshark.tshark.tshark.TSharkNotFoundException: TShark not found. Try adding its location to the configuration file. Searched these paths: ['C:\\Program Files\\Wireshark\\tshark.exe', 'C:\\Program Files (x86)\\Wireshark\\tshark.exe', 'C:\\Program Files\\Wireshark\\tshark.exe']

filetype

ows PowerShell Copyright (C) Microsoft Corporation. All rights reserved. Install the latest PowerShell for new features and improvements! https://aka.ms/PSWindows PS E:\基于spark的空气质量数据分析可视化系统\基于spark的空气质量数据分析可视化系统\基于spark的空气质量数据分析可视化系统> pip show thrift Name: thrift Version: 0.13.0 Summary: Python bindings for the Apache Thrift RPC system Home-page: https://thrift.apache.org Author: Apache Thrift Developers Author-email: [email protected] License: Apache Software License, Version 2 Location: c:\users\小陈\appdata\local\packages\pythonsoftwarefoundation.python.3.10_qbz5n2kfra8p0\localcache\local-packages\python310\site-packages Requires: six Required-by: thrift-sasl PS E:\基于spark的空气质量数据分析可视化系统\基于spark的空气质量数据分析可视化系统\基于spark的空气质量数据分析可视化系统> pip install thrift==0.10.0 # 明确 兼容版本 Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple Collecting thrift==0.10.0 Downloading https://pypi.tuna.tsinghua.edu.cn/packages/a3/ea/84a41e03f1ab14fb314c8bcf1c451090efa14c5cdfb9797d1079f502b54e/thrift-0.10.0.zip (87 kB) Installing build dependencies ... done Getting requirements to build wheel ... done Successfully installed PyHive-0.6.1 thrift-0.10.0 PS E:\基于spark的空气质量数据分析可视化系统\基于spark的空气质量数据分析可视化系统\基于spark的空气质量数据分析可视化系统> python -c "import sys; print(sys.path)" ['', 'C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\\python310.zip', 'C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\\DLLs', 'C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\\lib', 'C:\\Users\\小陈\\AppData\\Local\\Microsoft\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0', 'C:\\Users\\小陈\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Pytho10_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python310\\site-packages', 'C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0', 'C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.10_3.10.3056.0_x64__qbz5n2kfra8p0\\lib\\site-packages'] PS E:\基于spark的空气质量数据分析可视化系统\基于spark的空气质量数据分析可视化系统\基于spark的空气质量数据分析可视化系统> pip show thrift pyhive django Name: thrift Version: 0.10.0 Summary: Python bindings for the Apache Thrift RPC system Home-page: http://thrift.apache.org Author: Thrift Developers Author-email: [email protected] License: Apache License 2.0 Location: c:\users\小陈\appdata\local\packages\pythonsoftwarefoundation.python.3.10_qbz5n2kfra8p0\localcache\local-packages\python310\site-packages Requires: six Required-by: thrift-sasl --- Name: PyHive Version: 0.6.1 Summary: Python interface to Hive Home-page: https://github.com/dropbox/PyHive Author: Jing Wang Author-email: [email protected] License: Apache License, Version 2.0 Location: c:\users\小陈\appdata\local\packages\pythonsoftwarefoundation.python.3.10_qbz5n2kfra8p0\localcache\local-packages\python310\site-packages Requires: future, python-dateutil Required-by: --- Name: Django Version: 5.2.3 Summary: A high-level Python web framework that encourages rapid development and clean, pragmatic design. Home-page: https://www.djangoproject.com/ Author: Author-email: Django Software Foundation <[email protected]> License: BSD-3-Clause Location: c:\users\小陈\appdata\local\packages\pythonsoftwarefoundation.python.3.10_qbz5n2kfra8p0\localcache\local-packages\python310\site-packages Requires: asgiref, sqlparse, tzdata Required-by: PS E:\基于spark的空气质量数据分析可视化系统\基于spark的空气质量数据分析可视化系统\基于spark的空气质量数据分析可视化系统> pip uninstall thrift -y Found existing installation: thrift 0.10.0 Uninstalling thrift-0.10.0: Successfully uninstalled thrift-0.10.0 PS E:\基于spark的空气质量数据分析可视化系统\基于spark的空气质量数据分析可视化系统\基于spark的空气质量数据分析可视化系统> pip install "thrift>=0.10.0,<0.14.0" Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple Collecting thrift<0.14.0,>=0.10.0 Using cached thrift-0.13.0-cp310-cp310-win_amd64.whl Requirement already satisfied: six>=1.7.2 in c:\users\小陈\appdata\local\packages\pythonsoftwarefoundation.python.3.10_qbz5n2kfra8p0\localcache\local-packages\python310\site-packages (from thrift<0.14.0,>=0.10.0) (1.17.0) Installing collected packages: thrift Successfully installed thrift-0.13.0 PS E:\基于spark的空气质量数据分析可视化系统\基于spark的空气质量数据分析可视化系统\基于spark的空气质量数据分析可视化系统> pip install --no-cache-dir pyhive Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple Requirement already satisfied: pyhive in c:\users\小陈\appdata\local\packages\pythonsoftwarefoundation.python.3.10_qbz5n2kfra8p0\localcache\local-packages\python310\site-packages (0.6.1) Requirement already satisfied: future in c:\users\小陈\appdata\local\packages\pythonsoftwarefoundation.python.3.10_qbz5n2kfra8p0\localcache\local-packages\python310\site-packages (from pyhive) (1.0.0) Requirement already satisfied: python-dateutil in c:\users\小陈\appdata\local\packages\pythonsoftwarefoundation.python.3.10_qbz5n2kfra8p0\localcache\local-packages\python310\site-packages (from pyhive) (2.9.0.post0) Requirement already satisfied: six>=1.5 in c:\users\小陈\appdata\local\packages\pythonsoftwarefoundation.python.3.10_qbz5n2kfra8p0\localcache\local-packages\python310\site-packages (from python-dateutil->pyhive) (1.17.0) PS E:\基于spark的空气质量数据分析可视化系统\基于spark的空气质量数据分析可视化系统\基于spark的空气质量数据分析可视化系统> 有没有问题

filetype

现在要求你熟悉一款简单的FPGA产品,其相关参数如下。本实验板采用Xilinx Artix-7系列XC7A35TCSG324 FPGA。6.通用I/O接口 TypeCUSB to JTAG/UART接口 Part Number XC7A12T XC7A15T XC7A25T XC7A35T Logic Cells 12,800 16,640 23,360 3,280 Logic Slices 2,000 2,600 3,650 5,200 Resources CLB Flip-Flops 16,000 20,800 29,200 41,600 Maximum Distributed RAM (Kb) 171 200 313 400 Memory 20 25 45 50 Resources Block RAM/FIFO w/ ECC (36 kb each) Total Block RAM (kb) 720 900 1,620 1,800 Clock Resources CMTs (1 MMCM+1 PLL Maximum Single-Ended I/0 150 250 150 250 V/O Resources Maximum Differential V/O Pairs 72 120 72 120 DSP Slices 40 45 80 90 PCle Gen20 Embedded Hard IP Analog Mixed Signal (AMS)/ XADC Resources Configuration AES /HMAC Blocks GTP Transceivers (6.6 Gb/s Max Rate)2) Commercial -1,-2 -1,-2 -1,-2 -1,-2 Speed Grades Extended -2L,-3 -2L,-3 -2L,-3 -2L,-3 Industrial 1,-2,-1L -1,-2,-1L -1,-2,-1L 1,-2,-1L 6.1按键 实验板上的5个通用按键输出全部连接到FPGA,初始状态默认为高电平,当按下按键时,输出电平为低电平。 管脚约束如下: 名称 原理图标号 FPGA IO PIN S0 button_0 M2 S1 button_1 N2 S2 button_2 M1 S3 button_3 L1 S4 button_4 N1 6.2拨码开关 实验板上设计有16个拨码开关,当开关处于on状态时,输出一个高电平到FPGA,,反之为低电平。 管脚约束如下: 名称 原理图标号 FPGA IO PIN SW1 SW1 R2 SW2 SW2 R3 SW3 SW3 M4 SW4 SW4 M3 SW5 SW5 P2 SW6 SW6 N4 SW7 SW7 N6 SW8 SW8 L4 SW9 SW9 J4 SW10 SW10 T3 SW11 SW11 T4 SW12 SW12 U3 SW13 SW13 U4 SW14 SW14 T5 SW15 SW15 J2 SW16 SW16 J5 6.3LED灯 FPGA输出高电平时,MOS管导通,LED被点亮。 管脚约束如下: 名称 原理图标号 FPGA IO PIN 颜色 D79 LED1 D4 Green D80 LED2 C5 Green D81 LED3 D5 Green D82 LED4 D7 Green D83 LED5 B7 Green D84 LED6 C7 Green D85 LED7 D8 Green D86 LED8 D9 Green D87 LED9 J3 Green D88 LED10 H2 Green D89 LED11 G4 Green D90 LED12 G2 Green D91 LED13 G3 Green D92 LED14 G6 Green D93 LED15 F5 Green D94 LED16 E5 Green 6.4七段数码管 数码管为共阴极数码管,即公共极输入低电平。共阴极由三极管驱动,FPGA 需要提供正向信号。同时段选端连接高电平,数码管上的对应位置才可以被点亮。 因此,FPGA 输出有效的片选信号和段选信号都应该是高电平。 管

filetype

我没有看到Ex的输入具体值:clear close all; clc; %% Define geomtry scale = 1/4; angle_all = -pi* 10/180; % 总弧度 discrete_num = 41; % 离散点数 NumberOfCurve = 3; % 总曲线数,不能等于1 rotate_angle = 0; % 旋转角度 [X,patch_vertices] = plotcurve(scale,angle_all,discrete_num,NumberOfCurve,rotate_angle); for strip = 1:NumberOfCurve-1 for i = 1:discrete_num-1 n1 = (strip-1)*discrete_num + i; n2 = (strip-1)*discrete_num + i+1; n3 = strip*discrete_num + i+1; n4 = strip*discrete_num + i; Panel{(strip-1)*(discrete_num-1)+i,1}= [n4, n3, n2, n1]; end end Node=X; %% Set up boundary conditions % 定义固定约束 n=discrete_num; for j=1:2:NumberOfCurve for i=n*(j-1)+2:j*n st(i-1-(n+1)*(j-1)/2)=i; end end stz=[st]'; m = size(Node,1); Suppz=[stz,zeros(length(stz),1),zeros(length(stz),1),ones(length(stz),1)]; % Supp = [ 1, 0, 0, 1; % (NumberOfCurve-1)*n+1,0,0,1; % n+1,1,1,0; % Suppz; % ]; for j=2:2:NumberOfCurve for i=n*(j-1)+2:j*n st1(i-1-n*(j-1))=i; end end stz1=st1'; Suppz1=[stz1,zeros(length(stz1),1),zeros(length(stz1),1),ones(length(stz1),1)]; Supp = [ 1,0,1,0; 2*n+1,0,1,0; n+1,1,1,1; Suppz1 ]; % for j=3:2:NumberOfCurve % for i=(j-2)*n+1:n*(j-1) % inp(i-n*(j-1)/2)=i; % end % end inp=[1,2*n+1]; % inp=[n+1]; %ff=-200*ones(length(inp),1); ff=1.48*ones(length(inp),1); Load = [ inp',zeros(length(inp),1),zeros(length(inp),1),ff;]; %% Adopt generalized N5B8 model % nL=(n-1)*NumberOfCurve+(NumberOfCurve-1)*n+(NumberOfCurve-1)*(n-1)+4*(n-1)*(NumberOfCurve-1); % % 折痕标记 % isCrease = false(nL,1); % I1=NumberOfCurve-2; % ver(1,:)=n:(I1+1)*(n-1);%竖直折痕 % for i=1:NumberOfCurve-1 % I=(n-1)*NumberOfCurve; % hor(1,(n-2)*(i-1)+1:i*(n-2))=(I+2)+n*(i-1):(I+2)+n*(i-1)+n-3;%水平折痕 % end % crease_ids = [hor(1:n-2)]; % for i=2:n-1 % and(i,:)=[ver(i),hor(n-2+i-1)]; % end % and=and(2:end,:); % and=reshape(and',1,[]); % and=[ver(1),and]; % crease_ids=[crease_ids,and]; % isCrease(crease_ids) = true; % % 定义折痕旋转刚度 % K_theta=zeros(nL,1); % for i=ver(:) % K_theta(i)=0.1; % 竖直折痕刚度 % end % for i=hor(:) % K_theta(i)=0.1; % 横向折痕刚度 % end % K_theta=(K_theta(crease_ids)); % AnalyInputOpt = struct(... % 'ModelType','N5B8',... % 'MaterCalib','manual',... % 'manual' % 'LoadType','Force',... % 'InitialLoadFactor', 0.00001,... % 'MaxIcr', 200,... % 'StopCriterion',@(Node,U,icrm)(abs(U(5*3))>12),... % 'Kf',0.1,... % 'Kb',1 ... % ); AnalyInputOpt = struct(... 'ModelType','N5B8',... 'MaterCalib','manual',... % 'manual' 'LoadType','Displacement',... 'InitialLoadFactor', 0.00001,... 'DispStep', 100,... 'StopCriterion',@(Node,U,icrm)(abs(U(5*3))>12),... 'BarCM', @(Ex)Ogden(Ex, 5e3),... 'Kf',0,... 'Kb',1 ... ); %% Adopt generalized N4B5 model % AnalyInputOpt = struct(... % 'ModelType','N4B5',... % 'MaterCalib','manual',... % 'manual' % 'BarCM', @(Ex)Ogden(Ex, 5e3),... % 'Abar', 2.4652,... % 'Kb',0.9726*([38.4187;38.4187;41.7612]/0.127).^(1/3)./[38.4187;38.4187;41.7612],... % 'Kf',1,... % 'RotSprBend', @SuperLinearBend,... % 'RotSprFold', @(he,h0,Kf,L0)EnhancedLinear(he,h0,Kf,L0,15,345),... % 'LoadType','Force',... % 'InitialLoadFactor', 0.00001,... % 'MaxIcr', 100,... % 'StopCriterion',@(Node,U,icrm)(abs(U(5*3))>12)); %% Perform analysis % Assemble input data [truss, angles, AnalyInputOpt,Fold] = PrepareData(Node,Panel,Supp,Load,AnalyInputOpt); % Specify initial deformation state truss.U0 = zeros(3*size(truss.Node,1),1); % Perform path-following analysis using MGDCM [Uhis,Fhis] = PathAnalysis(truss,angles,AnalyInputOpt); % Clean output data Uhis = real(Uhis); Fhis = real(Fhis); STAT = PostProcess(Uhis,truss,angles); %% Visualize simulation instdof = [2*n+1,3]; interv = 1; endicrm = size(Uhis,2); VisualFold(Uhis(:,1:interv:endicrm),truss,angles,Fhis(1:interv:endicrm,:),instdof,'Recordtype','imggif','filename','Curve6','pausetime',0,'showinitial','off') % VisualFold(Uhis(:,1:interv:endicrm),truss,angles,Fhis(1:interv:endicrm,:),instdof) % If do not need load-displacement diagram: % VisualFold(Uhis(:,1:interv:endicrm),truss,angles,[],[]) % To visualize the strains in bars: %VisualFold(Uhis(:,1:interv:endicrm),truss,angles,[],[],'IntensityMap','Edge','IntensityData',STAT.bar.Sx(:,1:interv:endicrm),'ShowInitial','off','Recordtype','imggif','filename','Curve3','pausetime',0) %% Plot diagrams % Force vs Displacement figure() dsp = sign(instdof(2))*Uhis((instdof(1)*3-(3-abs(instdof(2)))),:); plot(dsp,Fhis) hold on axis tight xlabel('Displacement','fontsize',14); ylabel('Force','fontsize',14); % Strain energy vs Displacement figure() plot(dsp,STAT.fold.UF,'r-','linewidth',1);hold on plot(dsp,STAT.bar.US,'b-','linewidth',1);hold on plot(dsp,STAT.bend.UB,'g-','linewidth',1);hold on plot(dsp,STAT.PE,'y-','linewidth',1); legend('STAT.fold.UF','STAT.bar.US','STAT.bend.UB','STAT.PE','Location', 'North') xlim([0 ,1.5]) axis tight xlabel('Reddot-Displacement','fontsize',14); ylabel('Stored Energy','fontsize',14); STAT.fold.Angle1=STAT.fold.Angle; STAT.fold.Angle1(1:n-2,:)=2*pi-STAT.fold.Angle1(1:n-2,:); figure() for i=1:size(STAT.fold.Angle,1) plot(dsp,STAT.fold.Angle1(i,:),'linewidth',1);hold on end axis tight xlabel('Displacement','fontsize',14); ylabel('Crease dihedral angle','fontsize',14); %% Plot final configuration Ux = Uhis(:,endicrm); Nodew = truss.Node; Nodew(:,1) = truss.Node(:,1)+Ux(1:3:end); Nodew(:,2) = truss.Node(:,2)+Ux(2:3:end); Nodew(:,3) = truss.Node(:,3)+Ux(3:3:end); figure() % PlotOri(truss.Node,angles.Panel,truss.Trigl,'FoldEdgeStyle','-','EdgeShade',0.3,'PanelColor','none'); PlotOri(Nodew,angles.Panel,truss.Trigl,'PanelColor','g'); axis equal; axis off; camproj('perspective') light % view(-2,16) view(0,90) rotate3d on save('matlab1.mat','Nodew');

filetype

import os import json import time import threading import schedule import pandas as pd import yfinance as yf import ta import requests from flask import Flask, request, jsonify, render_template_string from openai import OpenAI # === CONFIGURATION === OPENAI_API_KEY = "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" # Your OpenAI API key here POSTMARK_API_KEY = "de346089-6d44-4331-97fd-46c5101d3c88" POSTMARK_SENDER_EMAIL = "[email protected]" RECIPIENT_EMAIL = "[email protected]" HISTORY_FILE = "chat_history.json" FAVORITES_FILE = "favorite_stocks.json" MAX_HISTORY = 20 # === OpenAI client === client = OpenAI(api_key=OPENAI_API_KEY) # === Flask app === app = Flask(__name__) # === Load favorite stocks === def load_favorite_stocks(): if os.path.exists(FAVORITES_FILE): with open(FAVORITES_FILE, "r") as f: return json.load(f) return [] # === Save favorite stocks === def save_favorite_stocks(stocks): with open(FAVORITES_FILE, "w") as f: json.dump(stocks, f) # === Load chat history === def load_chat_history(): if os.path.exists(HISTORY_FILE): with open(HISTORY_FILE, "r") as f: return json.load(f) return [] # === Save chat history === def save_chat_history(history): with open(HISTORY_FILE, "w") as f: json.dump(history[-MAX_HISTORY:], f) # === Data Fetching === def get_stock_data(ticker): df = yf.download(ticker, period="3mo", progress=False) if df.empty or 'Close' not in df: raise ValueError(f"No data returned for {ticker}") df = df.reset_index() close = df['Close'] volume = df['Volume'] df['RSI'] = ta.momentum.RSIIndicator(close=close).rsi() df['SMA_20'] = ta.trend.SMAIndicator(close=close, window=20).sma_indicator() df['SMA_50'] = ta.trend.SMAIndicator(close=close, window=50).sma_indicator() macd = ta.trend.MACD(close=close) df['MACD'] = macd.macd() df['MACD_signal'] = macd.macd_signal() bb = ta.volatility.BollingerBands(close=close) df['BB_upper'] = bb.bollinger_hband() df['BB_lower'] = bb.bollinger_lband() return df[['Close', 'Volume', 'RSI', 'SMA_20', 'SMA_50', 'MACD', 'MACD_signal', 'BB_upper', 'BB_lower']].tail(1) def get_fundamentals(ticker): stock = yf.Ticker(ticker) info = stock.info return { "PE_ratio": info.get("trailingPE"), "EPS": info.get("trailingEps"), "Market_cap": info.get("marketCap"), "Dividend_yield": info.get("dividendYield"), "PEG_ratio": info.get("pegRatio") } # === Report Generator === def generate_report(): favorite_list = load_favorite_stocks() market_data = {} for ticker in favorite_list: try: technical = get_stock_data(ticker).to_dict(orient='records')[0] fundamental = get_fundamentals(ticker) market_data[ticker] = {**technical, **fundamental} except Exception as e: market_data[ticker] = {"error": str(e)} prompt = f""" You are a personal stock advisor bot. The user's favorite stock list is: {favorite_list} The market data is: {market_data} 跟我說大盤趨勢跟買或賣的建議。請根據以下格式回答: 大盤趨勢:<大盤趨勢> 買或賣建議:根據favorite stocks的市場數據,分別給出每支股票的買或賣建議,並且在最後給出建倉分配的比例。 格式如下: 大盤趨勢:<大盤趨勢> 股票代碼:<買或賣建議> <建倉比例分配> 資金: <剩餘資金比例分配> 資金加碼或減碼的建議:<加碼或減碼建議> 預測來源:<預測來源> """ chat_history = load_chat_history() chat_history.append({"role": "user", "content": prompt}) chat_history = chat_history[-MAX_HISTORY:] response = client.chat.completions.create( model="gpt-4.1-mini", messages=[ {"role": "system", "content": "You are a helpful financial advisor."} ] + chat_history ) report = response.choices[0].message.content chat_history.append({"role": "assistant", "content": report}) save_chat_history(chat_history) send_email("Daily Stock Report", report, RECIPIENT_EMAIL) # === Send email with Postmark === def send_email(subject, body, to_email): headers = { "Accept": "application/json", "Content-Type": "application/json", "X-Postmark-Server-Token": POSTMARK_API_KEY } data = { "From": POSTMARK_SENDER_EMAIL, "To": to_email, "Subject": subject, "TextBody": body, "MessageStream": "outbound" } response = requests.post("https://api.postmarkapp.com/email", headers=headers, json=data) if response.status_code == 200: print("✅ Email sent successfully.") else: print(f"❌ Failed to send email: {response.status_code} - {response.text}") # === Scheduler thread === def run_scheduler(): schedule.every().day.at("21:00").do(generate_report) schedule.every().day.at("12:00").do(generate_report) while True: schedule.run_pending() time.sleep(30) # === Flask routes === HTML_TEMPLATE = """ <!DOCTYPE html> <html> <head><title>Favorite Stocks</title></head> <body>

Favorite Stocks

<form method="POST"> <textarea name="stocks" rows="10" cols="30">{{ stocks_text }}</textarea>
<button type="submit">Update</button> </form> </body> </html> """ @app.route('/', methods=['GET', 'POST']) def index(): if request.method == 'POST': stocks_text = request.form.get('stocks', '') stocks = [s.strip().upper() for s in stocks_text.splitlines() if s.strip()] save_favorite_stocks(stocks) current_stocks = load_favorite_stocks() return render_template_string(HTML_TEMPLATE, stocks_text="\n".join(current_stocks)) # === Run Flask app and scheduler === if __name__ == '__main__': generate_report() # Initial report generation threading.Thread(target=run_scheduler, daemon=True).start() app.run(host='0.0.0.0', port=6837)
filetype

任务描述 本关任务:在已安装Hadoop的基础上安装配置好Hive并运行。 相关知识 为了完成本关任务,你需要掌握: 1.Hive的基本安装; 2.Mysql的安装与设置; 3.Hive 的配置。 注意:本关实训Hive的安装与配置建立在Hadoop已安装配置好的情况下。 Hive 的基本安装 从 官网 下载Hive二进制包,不过这里你无须再从网上下载,我已经帮你下载好了放在/opt目录下。 进入/opt目录,解压apache-hive-3.1.0-bin.tar.gz到该目录下,并将解压的文件重命名为hive; ``` cd /opt tar -zxvf apache-hive-3.1.0-bin.tar.gz mv apache-hive-3.1.0-bin hive - 设置环境变量,编辑`vi /etc/profile`,在末尾添加以下两行代码; export HIVE_HOME=/opt/hive export PATH=$HIVE_HOME/bin:$PATH - `source /etc/profile`使环境生效; - 查看`hive`是否安装成功:`hive --version`。 ![](https://data.educoder.net/api/attachments/eUxxcWwvZHg5N2t5cDc3TXd1VHQ2QT09) 出现`hive`版本就说明安装成功,但是可以看到其中有一些警告信息,是由于包的冲突引起的。我们只需删除掉引起冲突的包即可:`rm /opt/hive/lib/log4j-slf4j-impl-2.10.0.jar`。 ![](https://data.educoder.net/api/attachments/Vlk5dFNnc0xBK0svNzR5TjdEV243Zz09) #####Mysql 的安装与设置 平台已安装`MySQL`数据库,同学们在本地没有安装可以采用以下命令进行安装: sudo apt-get install mysql-server #安装mysql服务 apt-get install mysql-client #安装mysql客户端 sudo apt-get install libmysqlclient-dev #安装相关依赖环境 *注意:安装过程中会提示设置密码什么的,不要忘了设置。* 安装完成之后可以使用如下命令来检查是否安装成功。 `sudo netstat -tap | grep mysql` 通过上述命令检查之后,如果看到有`MySQL`的`socket`处于`listen` 状态则表示安装成功。 `Hive`需要数据库来存储`metastore`的内容,因此我们需要配置一下`MySQL`数据库。 - 下载`mysql`驱动; 我已经帮你下载好放在`/opt`目录下,进入该目录并进行以下操作: tar -zxvf mysql-connector-java-5.1.45.tar.gz cd mysql-connector-java-5.1.45 cp mysql-connector-java-5.1.45-bin.jar /opt/hive/lib/ 接下来介绍`MySQL`为`Hive`做的设置。 - 使用`root`用户登录`MySQL`数据库; mysql -uroot -p123123 -h127.0.0.1 - 创建数据库实例`hiveDB`; create database hiveDB; - 创建用户`bee`,密码为`123123`; create user 'bee'@'%' identified by '123123'; - 授权用户`bee`拥有数据库实例`hiveDB`的所有权限; grant all privileges on hiveDB.* to 'bee'@'%' identified by '123123'; - 刷新系统权限表。 flush privileges; #####Hive 的配置 在`/opt/hive/conf`目录下,修改`hive-site.xml`和`hive-env.sh`两个文件。 ######hive-site.xml `hive-site.xml`保存`Hive`运行时所需要的相关配置信息。 - 如果目录下没有该文件,我们直接创建一个:`vi hive-site.xml`,将以下内容复制到其中(按`i`进入编辑模式后再进行粘贴)。 hive.metastore.warehouse.dir /opt/hive/warehouse hive.exec.scratchdir /opt/hive

filetype

如果同一上位机通过ttl同样的方式向下面两个串口写入相同数据写入后有什么区别#include “main.h” uint8_t uart2_rx_over_time; uint8_t uart2_rx_time_start; uint8_t uart2_rx_finish_ifg; uint8_t *uart2_tx_p; //UART发送指针 uint16_t uart2_rx_len=0; uint16_t uart2_tx_len; uint8 Rx2_Frame[URRT2_RX_SIZE]; uint8 Tx2_Frame[URRT2_TX_SIZE]; //uart2 开启超时判断 void uart2_start_time(void) { uart2_rx_over_time=50; //5mS超时判断 超过10ms未接收到数据表示接收完成 放在滴答中断中0.1ms uart2_rx_time_start=1; } //判断串口是否接收完成 void uart_rx_finish_check(void) { if(uart2_rx_time_start==1) { if(uart2_rx_over_time>0) { uart2_rx_over_time–; } else { uart2_rx_finish_ifg =1; uart2_rx_time_start =0; } } } /************************************************ 函数名称 : USART_GPIO_Configuration 功 能 : USART所使用管脚输出输入定义 参 数 : 无 OUT通用输出模式 IN输入模式 AF复用功能模式 AN模拟模式 PP复用推挽 OD复用开漏 UP上拉 down下拉 nopull浮空 *************************************************/ void USART2_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_1); GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_1); //定义USART TX_RX 引脚为复用输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); //Usart1 NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //IRQ通道:串口1 NVIC_InitStructure.NVIC_IRQChannelPriority = 0; //优先级 :1级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能IRQ通道 NVIC_Init(&NVIC_InitStructure); //USART 初始化设置 USART_InitStructure.USART_BaudRate = 2400<<(prd_info.baud_rate-1); //设定传输速率 USART_InitStructure.USART_WordLength = (prd_info.Parity==0)?USART_WordLength_8b:USART_WordLength_9b; //设定传输数据位数 USART_InitStructure.USART_StopBits = USART_StopBits_1; //设定停止位个数 USART_InitStructure.USART_Parity = (prd_info.Parity==0)?(USART_Parity_No):((prd_info.Parity>1)?(USART_Parity_Even):(USART_Parity_Odd)); //不用校验位 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //不用流量控制 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //使用接收和发送功能 USART_Init(USART2, &USART_InitStructure); //初始化USART1 USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //使能USART1接收中断 USART_Cmd(USART2, ENABLE); } void RS485_SendByte(uint8 Data) { USART2->TDR = (Data & (uint16_t)0x01FF); while((USART2->ISR & USART_FLAG_TC) == RESET); } /************************************************ 函数名称 : RS485_Send_Data 功 能 : 串口1 RS485发送N个字符 参 数 : pData ----- 字符串 Length — 长度 *************************************************/ void RS485_Send_Data(uint8 *buf,uint8 len) { while(len–) { USART2->TDR = (*buf & (uint16_t)0x01FF); while((USART2->ISR & USART_FLAG_TC) == RESET); while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET); buf++; } } void USART2_Send(uint8 *buf,uint8 len) { USART2->CR1&=~(USART_CR1_RXNEIE|USART_CR1_RE); //不允许接收 //D_485_TXD; uart2_tx_p = buf; uart2_tx_len = len; uart2_rx_len = 0; while(!((USART2->ISR ) & USART_ISR_TXE)); //发送寄存器为空 USART2->TDR= *buf; //发送 USART2->CR1|=(USART_CR1_TE+USART_CR1_TCIE); //允许发送 } void USART2_IRQHandler(void) { // uint8 USART_data; //单个数据 if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) { USART_ClearITPendingBit(USART2,USART_IT_RXNE); Rx2_Frame[uart2_rx_len] = USART2->RDR;//读取接收到的数据 if(uart2_rx_len ==0) { if(Rx2_Frame[0] == prd_info.product_addr || Rx2_Frame[0] == 0xFA || Rx2_Frame[0] == 0xF1) { uart2_rx_len++; uart2_start_time(); } } else { if(Rx2_Frame[1] == 0x03 || Rx2_Frame[1] == 0x06 || Rx2_Frame[1] == 0x01) { uart2_rx_len++; uart2_start_time(); } else { uart2_rx_len =0; } } if(uart2_rx_len >=40) { uart2_rx_len=39; } } if(USART_GetITStatus(USART2, USART_IT_TC) != RESET) { if(uart2_tx_len>1) { uart2_tx_p++; uart2_tx_len--; USART2->TDR= *uart2_tx_p; //发送 } else { USART2->CR1&=~(USART_CR1_TCIE); //禁止发送 加上这个会通讯失败USART_CR1_TE+ // D_485_RXD; USART2->CR1 |= USART_CR1_RXNEIE | USART_CR1_RE | USART_CR1_UE; //使能USART2接收中断 允许接收 使能USART2 uart2_tx_len=0; } } else { USART_ClearFlag(USART2,0xFFFF); //产生错误中断后,全部清除中断 } } #if 1 #pragma import(__use_no_semihosting) //标准库需要的支持函数 struct __FILE { int handle; }; FILE __stdout; //定义_sys_exit()以避免使用半主机模式 void _sys_exit(int x) { x = x; } //重定义fputc函数 int fputc(int ch, FILE *f) { while((USART1->ISR&0X40)==0);//循环发送,直到发送完毕 USART1->TDR = (uint8) ch; return ch; } #endif void RS485_printf (char *fmt, …) { char buffer[64]; // 数据长度 uint8 i = 0; va_list arg_ptr; va_start(arg_ptr, fmt); vsnprintf(buffer,64, fmt, arg_ptr); while ((i < 64) && (i < strlen(buffer))) { RS485_SendByte(buffer[i++]); while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET); } va_end(arg_ptr); } #include “User_Cfg.h” /* 串口通讯数据结构定义 */ ComSetTypeDef ComSet; //通讯配置 ComBuffTypeDef ComBuff; //通讯数据缓冲区 /*************************************************************************************************** 函数名称: InitUSART1 函数功能: PY32 USART1设置 入口参数: 无 出口参数: 无 使用说明:初始化USARTx相关寄存器 创建日期: 2024年03月01日 修改日期: 修改原因: ***************************************************************************************************/ void InitUSART1( void ) { LL_APB1_GRP2_EnableClock(LL_APB1_GRP2_PERIPH_USART1); // 使能USART1的时钟 InitUSART1_GPIO(); // 串口引脚初始化 // R_RS485(); // 485读使能 WRITE_REG(UART1->CR1,0x00000000U); // UART1寄存器初始化 WRITE_REG(UART1->CR2,0x00000000U); WRITE_REG(UART1->CR3,0x00000000U); MCAL_UART_SetBaud(__UART1_BAUD,__UART1_BIT_MOD); // 设置波特率、比特率格式,默认9600、N、8、1 SET_BIT(UART1->CR1,USART_CR1_RE); // UART1接收使能 SET_BIT(UART1->CR1,USART_CR1_TE); // UART1发送使能 SET_BIT(UART1->CR1,USART_CR1_RXNEIE); // 使能UART1接收中断 SET_BIT(UART1->CR1,USART_CR1_UE); // 使能UART1模块 NVIC_SetPriority(USART1_IRQn,IPR_USART1); // 配置串口中断优先级配置 NVIC_EnableIRQ(USART1_IRQn); // 串口中断使能 ComBuff.Flag = USART_FREE; ComBuff.TxLen = 0; ComBuff.RxLen = 0; ComBuff.TxPoint = 0; ComBuff.RxPoint = 0; ComSet.bit_mod = __UART1_BIT_MOD; ComSet.BaudRate = __UART1_BAUD; } /*************************************************************************************************** 函数名称: InitUSART1_GPIO 函数功能: PY32 USART1的引脚配置设置 入口参数: 无 出口参数: 无 使用说明:初始化串口引脚需要的相关寄存器 创建日期: 2024年03月01日 修改日期: 修改原因: **************************************************************************************************/ //void InitUSART1_GPIO( void ) //{ // / 使能GPIOB时钟 */ // LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA); // /* 创建串口需要的引脚初始化结构体 */ //// LL_GPIO_InitTypeDef GPIO3_InitStruct = {0}; // PB3: RS485_C // LL_GPIO_InitTypeDef GPIO3_InitStruct = {0}; // PA3: RS485_Tx // LL_GPIO_InitTypeDef GPIO4_InitStruct = {0}; // PA4: RS485_Rx //// GPIO3_InitStruct.Pin = LL_GPIO_PIN_3; // 选择3号引脚 //// GPIO3_InitStruct.Mode = LL_GPIO_MODE_OUTPUT; // 通用输出模式 //// GPIO3_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH; // 高速 //// GPIO3_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; // 推挽输出 //// GPIO3_InitStruct.Pull = LL_GPIO_PULL_NO; // 即不上拉也不下拉 //// LL_GPIO_Init(GPIOB,&GPIO3_InitStruct); // 初始化 // GPIO3_InitStruct.Pin = LL_GPIO_PIN_3; // 选择3号引脚 // GPIO3_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; // 开启复用功能 // GPIO3_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH; // 高速 // GPIO3_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; // 推挽输出 // GPIO3_InitStruct.Pull = LL_GPIO_PULL_NO; // 即不上拉也不下拉 // GPIO3_InitStruct.Alternate = LL_GPIO_AF1_USART1; // 复用为串口USART1功能 // LL_GPIO_Init(GPIOA,&GPIO3_InitStruct); // 初始化 // GPIO4_InitStruct.Pin = LL_GPIO_PIN_4; // 选择4号引脚 // GPIO4_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; // 开启复用功能 // GPIO4_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH; // 高速 // GPIO4_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; // 推挽输出 // GPIO4_InitStruct.Pull = LL_GPIO_PULL_NO; // 即不上拉也不下拉 // GPIO4_InitStruct.Alternate = LL_GPIO_AF1_USART1; // 复用为串口USART1功能 // LL_GPIO_Init(GPIOA,&GPIO4_InitStruct); // 初始化 //} void InitUSART1_GPIO(void) { LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA); // 使能GPIOA时钟 LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; // 配置PA3为USART1_TX GPIO_InitStruct.Pin = LL_GPIO_PIN_3; GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; GPIO_InitStruct.Alternate = LL_GPIO_AF1_USART1; // 复用为USART1功能 LL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 配置PA4为USART1_RX GPIO_InitStruct.Pin = LL_GPIO_PIN_4; GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; GPIO_InitStruct.Alternate = LL_GPIO_AF1_USART1; // 复用为USART1功能 LL_GPIO_Init(GPIOA, &GPIO_InitStruct); } /*************************************************************************************************** 函数名称:UARTx_BitModeSet() 函数功能:STM32 UART位模式设置 入口参数:UARTx :UART外设 com_bps :最大为115200BPS parity :UART_PARITY_NONE、UART_PARITY_EVEN、UART_PARITY_ODD stop :UART_STOPBITS_1、UART_STOPBITS_2 出口参数:无 使用说明:初始化UARTx相关寄存器 创建日期:2020年01月01日 ***************************************************************************************************/ void UARTx_BitModeSet(USART_TypeDef *UARTx,uint32 com_bps,uint32 parity,uint32 stop) { uint32 temp_cr1_ue; uint32 uart_freq = SystemCoreClock >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE) >> RCC_CFGR_PPRE_Pos]; // UART总线频率 uint32 uart_brr,div_mant,div_fraq; div_mant = uart_freq / (16 * com_bps); div_fraq = uart_freq / com_bps - div_mant * 16; uart_brr = div_mant * 16 + div_fraq; temp_cr1_ue = READ_BIT(UARTx->CR1,USART_CR1_UE); // 获取当前CR1_UE状态 CLEAR_BIT(UARTx->CR1,USART_CR1_UE); // 清零CR1_UE位 MODIFY_REG(UARTx->CR1,(USART_CR1_PS | USART_CR1_PCE),parity); // 设置奇偶校验位 MODIFY_REG(UARTx->CR2,USART_CR2_STOP,stop); // 设置停止位 WRITE_REG (UARTx->BRR,uart_brr); // 设置波特率 if(parity == UART_PARITY_EVEN || parity == UART_PARITY_ODD) // 奇偶校验,字长设为9 { MODIFY_REG(UARTx->CR1,USART_CR1_M,UART_WORDLENGTH_9B); } else // 无校验,字长设为8 { MODIFY_REG(UARTx->CR1,USART_CR1_M,UART_WORDLENGTH_8B); } UARTx->CR1 |= temp_cr1_ue; // 恢复CR1_UE状态 } /*************************************************************************************************** 函数名称:MCAL_UART_SetBaud() 函数功能:串口设置波特率 入口参数:com_bps :最大为115200BPS com_mod :比特率格式(COM_MODE_8N1、COM_MODE_8N2、COM_MODE_8O1、COM_MODE_8E1) 出口参数:无 使用说明:无 创建日期:2020年01月01日 ***************************************************************************************************/ void MCAL_UART_SetBaud(uint32 com_bps,uint08 com_mod) { if((com_bps % 600 != 0) || (com_mod >= 4)) // 参数合理性检查 { return; } USART_TypeDef *UARTx = USART1; // 只有一个串口 MCAL_UART_TimeoutCfg(com_bps); // 重新计算通信超时时间 if(com_mod == 0) // 无校验、1停止位 { UARTx_BitModeSet(UARTx,com_bps,UART_PARITY_NONE,UART_STOPBITS_1); } else if(com_mod == 1) // 无校验、2停止位 { UARTx_BitModeSet(UARTx,com_bps,UART_PARITY_NONE,UART_STOPBITS_2); } else if(com_mod == 2) // 奇校验、1停止位 { UARTx_BitModeSet(UARTx,com_bps,UART_PARITY_ODD,UART_STOPBITS_1); } else if(com_mod == 3) // 偶校验、1停止位 { UARTx_BitModeSet(UARTx,com_bps,UART_PARITY_EVEN,UART_STOPBITS_1); } } /*************************************************************************************************** 函数名称:MCAL_UART_UpdateBaud() 函数功能:串口更新波特率 入口参数:com_bps:最大为115200BPS com_mod:比特率格式(COM_MODE_8N1、COM_MODE_8N2、COM_MODE_8O1、COM_MODE_8E1) 出口参数:无 使用说明:无 创建日期:2020年01月01日 ***************************************************************************************************/ void MCAL_UART1_UpdateBaud(uint32 com_bps,uint08 com_mod) { if((com_bps != ComSet.BaudRate) || (com_mod != ComSet.BaudRate)) { ComSet.BaudRate = com_bps; ComSet.bit_mod = com_mod; #if(__UARTx_SETUP) MCAL_UART_SetBaud(com_bps,com_mod); // 设置波特率和通信格式 MCAL_UART_TimeoutCfg(com_bps); // 重新计算通信超时时间 #endif } } /*************************************************************************************************** 函数名称: USART1Rst 函数功能: PY32 USART1设置 入口参数: 无 出口参数: 无 使用说明:初始化USARTx相关寄存器 创建日期: 2024年03月01日 修改日期: 修改原因: ***************************************************************************************************/ void USART1Rst(void) { uint08 IIR; // R_RS485(); IIR = USART1->DR; IIR = IIR; USART1->SR = 0; ComBuff.Flag = USART_FREE; ComBuff.TxLen = 0; ComBuff.RxLen = 0; ComBuff.TxPoint = 0; ComBuff.RxPoint = 0; WRITE_REG(UART1->CR1,0x00000000U); // UART1寄存器初始化 WRITE_REG(UART1->CR2,0x00000000U); WRITE_REG(UART1->CR3,0x00000000U); MCAL_UART_SetBaud(ComSet.BaudRate,ComSet.bit_mod); // 重新配置 SET_BIT(UART1->CR1,USART_CR1_RE); // UART1接收使能 SET_BIT(UART1->CR1,USART_CR1_TE); // UART1发送使能 SET_BIT(UART1->CR1,USART_CR1_RXNEIE); // 使能UART1接收中断 SET_BIT(UART1->CR1,USART_CR1_UE); // 使能UART1模块 StopUSART1Timer(); } /*************************************************************************************************** 函数名称:MCAL_UART_WaitTxdIdle() 函数功能:等待UART发送完成 入口参数:无 出口参数:无 使用说明:无 创建日期:2020年01月01日 ***************************************************************************************************/ void UART1_WaitTxdIdle(void) { // for(uint32 cnt = 0;cnt < 500;cnt ++) // 等待UART发送完成 // { // if( (ComBuff.Flag != USART_RECEIVING) && (ComBuff.Flag != USART_SENDING) ) // { // break; // } // FeedIWG(); // 清除看门狗 // MCAL_DelaymS(2); // 延时2mS // } } /*************************************************************************************************** 函数名称:MCAL_UART_TimeoutCfg() 函数功能:计算串口通信超时时间 入口参数:com_bps:通信波特率 出口参数:无 使用说明:无 创建日期:2020年01月01日 *************************************************************************************************/ void MCAL_UART_TimeoutCfg(uint32 com_bps) { ComSet.ComTimer = 1000001135/com_bps; } /*************************************************************************************************** 函数名称: USART1_IRQHandler 函数功能: PY32 USART1的全局中断服务程序 入口参数: 无 出口参数: 无 使用说明:无 创建日期: 2024年03月01日 修改日期: 修改原因: ***************************************************************************************************/ void APP_Usart1IRQ_Callback(void) { volatile uint32 IIR; IIR = USART1->SR & USART1->CR1; /* 清除中断标志位 */ USART1->SR = 0; StopUSART1Timer();//停止3.5T定时器? // 读寄存器非空 if( IIR & USART_SR_RXNE ) { RstUSART1Timer(); // ComBuff.RxBuff[ ComBuff.RxPoint ] = LL_USART_ReceiveData8(USART1); ComBuff.RxPoint++; ComBuff.RxLen++; ComBuff.Flag = USART_RECEIVING; if( ComBuff.RxPoint >= USART_BUFF_LEN ) { ComBuff.RxPoint = 0; ComBuff.RxLen = 0; } } // 发送寄存器空 else if( IIR & USART_SR_TXE ) { if( ComBuff.TxPoint < ComBuff.TxLen ) { USART1->DR = ComBuff.TxBuff[ ComBuff.TxPoint ]; ComBuff.TxPoint++; ComBuff.Flag = USART_SENDING; } else { USART1->CR1 &= ~USART_CR1_TXEIE;//OFF TXE INT USART1->CR1 |= USART_CR1_TCIE ;//ON TC INT } } // 发送完成 else if( IIR & USART_SR_TC ) { USART1Rst(); ComBuff.Flag = USART_SEND_ACHIEVE; // R_RS485(); } // 其他情况 else { USART1Rst(); } } /*************************************************************************************************** 函数名称: USART1_Send 函数功能: PY32 USART1起始发送函数 入口参数: 无 出口参数: 无 使用说明:无 创建日期: 2024年03月04日 ***************************************************************************************************/ void USART1_Send( sint32 Len ) { //// W_RS485(); if( Len>USART_BUFF_LEN ) Len = USART_BUFF_LEN; USART1->CR1 &= ~USART_CR1_RE; // USART串口接收禁止 USART1->DR = ComBuff.TxBuff[0]; // 发送第一个数据 ComBuff.TxLen = Len; ComBuff.TxPoint = 1; ComBuff.Flag = USART_SENDING; USART1->CR1 |= USART_CR1_TXEIE; // 发送完成中断使能 } // /* CRC16校验 */ // const uint08 auchCRCHi[] = { }; const uint08 auchCRCLo[] = { }; /*************************************************************************************************** 函数名称:CRC16() 函数功能:计算指定长度数据的CRC校验码 入口参数:*dat:数据起始地址 len :数据长度 出口参数:CRC校验码 使用说明:无 创建日期:2020年01月01日 ***************************************************************************************************/ uint16 CRC16(const uint08 *dat,uint32 len) { uint08 uchCRCHi = 0xFF,uchCRCLo = 0xFF; uint16 cnt = 0; while(len --) { cnt = uchCRCLo ^ *dat ++; uchCRCLo = uchCRCHi ^ auchCRCHi[cnt]; uchCRCHi = auchCRCLo[cnt]; } return (uchCRCHi | ((uint16)uchCRCLo << 8)); } /*************************************************************************************************** 函数名称:CRC16_Load() 函数功能:计算指定长度数据的CRC校验码 入口参数:*dat:数据起始地址 len :数据长度 出口参数:CRC校验码 使用说明:无 创建日期:2020年01月01日 ***************************************************************************************************/ void CRC16_Load(uint08 *dat,uint32 len) { uint08 uchCRCHi = 0xFF,uchCRCLo = 0xFF; uint16 cnt = 0; while(len --) { cnt = uchCRCLo ^ *dat ++; uchCRCLo = uchCRCHi ^ auchCRCHi[cnt]; uchCRCHi = auchCRCLo[cnt]; } *dat ++ = uchCRCLo; *dat ++ = uchCRCHi; }

步衫
  • 粉丝: 43
上传资源 快速赚钱