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

【AT32】 AT32 移植 Freemodbus 主站

基于野火开发板 at32f437zgt6芯片 和at32 官方开发工具
移植了网上一套开源的freemodbus 主站
这里对modbus 协议不做过多的讲解 主要已实现代码为主

AT32 Work Bench

参考之前我之前的配置 与stm32cubemx软件差不多
注意485芯片的收发脚配置即可

AT32 IDE

说实话这软件太垃圾了 elf文件不能生成就 报错不能生成 具体原因都不能跳转过去 有的地方函数不存在 或者写错根本不提示 比stm32 cubeide差了不是一点半点

freemodbus 文件架构讲解 需要的文件如下
在这里插入图片描述
用户主要就是要修改port层 函数 任何一个中间件都是如此
先修改porttimer层 开启一个定时器将时钟设置为 20Khz

在这里插入图片描述
主要修改以下函数 我这里使用的tim6 这是第一个最简单的普通定时器

/** FreeModbus Libary: RT-Thread Port* Copyright (C) 2013 Armink <armink.ztl@gmail.com>** This library is free software; you can redistribute it and/or* modify it under the terms of the GNU Lesser General Public* License as published by the Free Software Foundation; either* version 2.1 of the License, or (at your option) any later version.** This library is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU* Lesser General Public License for more details.** You should have received a copy of the GNU Lesser General Public* License along with this library; if not, write to the Free Software* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA** File: $Id: porttimer_m.c,v 1.60 2013/08/13 15:07:05 Armink add Master Functions$*//* ----------------------- Platform includes --------------------------------*/
#include "port.h"
#include "wk_tmr.h"
#include <stdio.h>
/* ----------------------- Modbus includes ----------------------------------*/
#include "mb.h"
#include "mb_m.h"
#include "mbport.h"
#include "mbconfig.h"#define Modbus_TIM TMR6#if MB_MASTER_RTU_ENABLED > 0 || MB_MASTER_ASCII_ENABLED > 0
/* ----------------------- Variables ----------------------------------------*/
static USHORT usT35TimeOut50us;static void prvvTIMERExpiredISR(void);
static void timer_timeout_ind(void* parameter);/* ----------------------- static functions ---------------------------------*/
static void prvvTIMERExpiredISR(void);/* ----------------------- Start implementation -----------------------------*/
BOOL xMBMasterPortTimersInit(USHORT usTimeOut50us)
{usT35TimeOut50us = usTimeOut50us;tmr_cnt_dir_set(Modbus_TIM, TMR_COUNT_UP);tmr_period_buffer_enable(Modbus_TIM, FALSE);tmr_base_init(Modbus_TIM, usTimeOut50us, 14399); //初始化时钟频率为20Khz 288Mhz时钟tmr_counter_enable(Modbus_TIM, TRUE);tmr_primary_mode_select(Modbus_TIM, TMR_PRIMARY_SEL_RESET);tmr_interrupt_enable(Modbus_TIM, TMR_OVF_INT, TRUE);return TRUE;
}void vMBMasterPortTimersT35Enable()
{/* Set current timer mode, don't change it.*/vMBMasterSetCurTimerMode(MB_TMODE_T35);/* 设置T3.5超时时间 */tmr_period_value_set(Modbus_TIM, usT35TimeOut50us - 1);/* 清除计数器和标志位 */tmr_counter_value_set(Modbus_TIM, 0);tmr_flag_clear(Modbus_TIM, TMR_OVF_FLAG);/* 使能定时器 */tmr_counter_enable(Modbus_TIM, TRUE);
}void vMBMasterPortTimersConvertDelayEnable()
{/* Set current timer mode, don't change it.*/vMBMasterSetCurTimerMode(MB_TMODE_CONVERT_DELAY);/* 设置转换延时时间 */tmr_period_value_set(Modbus_TIM, MB_MASTER_DELAY_MS_CONVERT * 20 - 1);/* 清除计数器和标志位 */tmr_counter_value_set(Modbus_TIM, 0);tmr_flag_clear(Modbus_TIM, TMR_OVF_FLAG);/* 使能定时器 */tmr_counter_enable(Modbus_TIM, TRUE);
}void vMBMasterPortTimersRespondTimeoutEnable()
{/* Set current timer mode, don't change it.*/vMBMasterSetCurTimerMode(MB_TMODE_RESPOND_TIMEOUT);/* 设置响应超时时间 */tmr_period_value_set(Modbus_TIM, MB_MASTER_TIMEOUT_MS_RESPOND * 20 - 1);/* 清除计数器和标志位 */tmr_counter_value_set(Modbus_TIM, 0);tmr_flag_clear(Modbus_TIM, TMR_OVF_FLAG);/* 使能定时器 */tmr_counter_enable(Modbus_TIM, TRUE);
}void vMBMasterPortTimersDisable()
{/* 禁用定时器 */tmr_counter_enable(Modbus_TIM, FALSE);
}void prvvTIMERExpiredISR(void)
{(void) pxMBMasterPortCBTimerExpired();
}static void timer_timeout_ind(void* parameter)
{prvvTIMERExpiredISR();
}
/*** @brief This function handles TIM4 global interrupt.*/
void Modbus_TIM_GLOBAL_IRQHandler(void)
{if(tmr_flag_get(Modbus_TIM, TMR_OVF_FLAG) != RESET){/* 清除中断标志位 */tmr_flag_clear(Modbus_TIM, TMR_OVF_FLAG);//printf("TIM_OVER\r\n");gpio_bits_set(GPIOA, GPIO_PINS_11);/* 调用Modbus定时器超时处理函数 */prvvTIMERExpiredISR();}
}#endif

注意Modbus_TIM_GLOBAL_IRQHandler需要放在 tim6的中断服务函数中调用

然后修改 portserial_m.c文件 这个是串口端口的修改

/** FreeModbus Libary: RT-Thread Port* Copyright (C) 2013 Armink <armink.ztl@gmail.com>** This library is free software; you can redistribute it and/or* modify it under the terms of the GNU Lesser General Public* License as published by the Free Software Foundation; either* version 2.1 of the License, or (at your option) any later version.** This library is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU* Lesser General Public License for more details.** You should have received a copy of the GNU Lesser General Public* License along with this library; if not, write to the Free Software* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA** File: $Id: portserial_m.c,v 1.60 2013/08/13 15:07:05 Armink add Master Functions $*/#include "port.h"/* ----------------------- Modbus includes ----------------------------------*/
#include "mb.h"
#include "mbport.h"
#include "mbconfig.h"
#include "wk_usart.h"
#include "at32f435_437.h"
#include "at32f435_437_usart.h"
#include "wk_system.h"
#if MB_MASTER_RTU_ENABLED > 0 || MB_MASTER_ASCII_ENABLED > 0
/* ----------------------- Static variables ---------------------------------*/
/*    定义 485收发控制脚 */
#define MODBUS_MASTER_USE_CONTROL_PIN       TRUE
#define MODBUS_MASTER_GPIO_PORT		          GPIOB
#define MODBUS_MASTER_GPIO_PIN		          GPIO_PINS_3
/* ----------------------- Defines ------------------------------------------*/
/* serial transmit event */
#define EVENT_SERIAL_TRANS_START    (1<<0)/* ----------------------- static functions ---------------------------------*/
static void prvvUARTTxReadyISR(void);
static void prvvUARTRxISR(void);//static void serial_soft_trans_irq(void* parameter);/* ----------------------- Start implementation -----------------------------*/
BOOL xMBMasterPortSerialInit(UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits,eMBParity eParity)
{
#if 1/* 配置串口参数 */usart_type* rs485_port;if(ucPORT ==1)rs485_port = USART1;if(ucPORT ==2)rs485_port = USART2;if(ucPORT ==3)rs485_port = USART3;if(ucPORT ==4)rs485_port = UART4;/* 配置校验位 */switch(eParity){case MB_PAR_NONE:usart_parity_selection_config(rs485_port, USART_PARITY_NONE);usart_init(rs485_port, ulBaudRate, USART_DATA_8BITS, USART_STOP_1_BIT);break;case MB_PAR_ODD:usart_parity_selection_config(rs485_port, USART_PARITY_ODD);usart_init(rs485_port, ulBaudRate, USART_DATA_9BITS, USART_STOP_1_BIT);break;case MB_PAR_EVEN:usart_parity_selection_config(rs485_port, USART_PARITY_EVEN);usart_init(rs485_port, ulBaudRate, USART_DATA_9BITS, USART_STOP_1_BIT);break;default:return FALSE;}usart_transmitter_enable(rs485_port, TRUE);usart_receiver_enable(rs485_port, TRUE);/* 使能串口 */usart_enable(rs485_port, TRUE);
#endif    return TRUE;
}void vMBMasterPortSerialEnable(BOOL xRxEnable, BOOL xTxEnable)
{
/* If xRXEnable enable serial receive interrupts. If xTxENable enable* transmitter empty interrupts.*/if(xRxEnable){#if defined(MODBUS_MASTER_USE_CONTROL_PIN)	wk_delay_ms(1);gpio_bits_reset(MODBUS_MASTER_GPIO_PORT, MODBUS_MASTER_GPIO_PIN);wk_delay_ms(2);#endifusart_interrupt_enable(USART2,USART_RDBF_INT,TRUE);  //开启接收中断}else{#if defined(MODBUS_MASTER_USE_CONTROL_PIN)wk_delay_ms(1);gpio_bits_set(MODBUS_MASTER_GPIO_PORT, MODBUS_MASTER_GPIO_PIN);wk_delay_ms(2);#endifusart_interrupt_enable(USART2,USART_RDBF_INT,FALSE); //关闭接收中断}if(xTxEnable){#if defined(MODBUS_MASTER_USE_CONTROL_PIN)wk_delay_ms(1);gpio_bits_set(MODBUS_MASTER_GPIO_PORT, MODBUS_MASTER_GPIO_PIN);wk_delay_ms(2);#endifusart_interrupt_enable(USART2,USART_TDBE_INT,TRUE);}else{#if defined(MODBUS_MASTER_USE_CONTROL_PIN)	wk_delay_ms(1);gpio_bits_reset(MODBUS_MASTER_GPIO_PORT, MODBUS_MASTER_GPIO_PIN);wk_delay_ms(2);#endifusart_interrupt_enable(USART2,USART_TDBE_INT,FALSE);}
}void vMBMasterPortClose(void)
{/* 关闭串口 */usart_enable(USART2, FALSE);return;
}BOOL xMBMasterPortSerialPutByte(CHAR ucByte)
{/* 发送一个字节 */usart_data_transmit(USART2, (uint16_t) ucByte);//uart_data_tx(USART1,ucByte);return TRUE;
}BOOL xMBMasterPortSerialGetByte(CHAR * pucByte)
{/* 接收一个字节 */*pucByte = usart_data_receive(USART2);return TRUE;
}/* * Create an interrupt handler for the transmit buffer empty interrupt* (or an equivalent) for your target processor. This function should then* call pxMBFrameCBTransmitterEmpty( ) which tells the protocol stack that* a new character can be sent. The protocol stack will then call * xMBPortSerialPutByte( ) to send the character.*/
void prvvUARTTxReadyISR(void)
{/* 更新状态机 */pxMBMasterFrameCBTransmitterEmpty();
}/* * Create an interrupt handler for the receive interrupt for your target* processor. This function should then call pxMBFrameCBByteReceived( ). The* protocol stack will then call xMBPortSerialGetByte( ) to retrieve the* character.*/
void prvvUARTRxISR(void)
{/* 更新状态机 */pxMBMasterFrameCBByteReceived();
}/*** @brief This function handles USART4 global interrupt.*/
void Modbus_IRQHandler(void)
{//串口接收中断if(usart_interrupt_flag_get(USART2, USART_RDBF_FLAG) != RESET){prvvUARTRxISR(); //串口接收中断调用函数usart_flag_clear(USART2, USART_RDBF_FLAG);}//发送中断if(usart_interrupt_flag_get(USART2, USART_TDBE_FLAG) != RESET){prvvUARTTxReadyISR(); 	//串口发送中断调用函数usart_flag_clear(USART2, USART_TDBE_FLAG);}
}
#endif

同样的中断函数需要放在串口的中断调用

然后创建应用层调用初始化 和启动 函数
在这里插入图片描述
在这里插入图片描述

	for(;;){poll_status = eMBMasterPoll();//更新事件wk_delay_ms(5);printf_count = printf_count+5;if(poll_status != MB_ENOERR ){printf("Poll_ERROR Type %d ",poll_status);}//应用层事件switch(APP_RUN_STATE){case 0x03 : //读保持寄存器{eMBMasterReqErrCode status;status =  eMBMasterReqReadHoldingRegister(1,0,10 ,10);if(status==MB_MRE_NO_ERR){
//				__NOP;__asm__ volatile ("nop"); //调试点}APP_RUN_STATE =0;break;}case 0x10 : //写多个保持寄存器{eMBMasterReqWriteMultipleHoldingRegister( 1,0,10,rs485_write_data,10);APP_RUN_STATE =0;break;}default :break;}if(printf_count >= 1000) //每隔一s打印信息{for(int i = 0;i<10;i++){printf("%d",usMRegHoldBuf[0][i]);}printf("\n");APP_RUN_STATE = 0x03; //重新读取保持寄存器信息printf_count=0;}}

在主函数循环调用eMBMasterPoll函数
在这里要注意 调用一个请求函数后 必须释放线程给eMBMasterPoll函数
带调用否则会一直通讯失败 这是很多人失败的原因

实验效果

使用modbus slave 软件模拟一个从站 然后将收到的数据串口打印
在这里插入图片描述
可以看到通讯成功 而且可以修改寄存器的值 串口打印的也会改变

参考文件

代码仓库

相关文章:

【AT32】 AT32 移植 Freemodbus 主站

基于野火开发板 at32f437zgt6芯片 和at32 官方开发工具 移植了网上一套开源的freemodbus 主站 这里对modbus 协议不做过多的讲解 主要已实现代码为主 AT32 Work Bench 参考之前我之前的配置 与stm32cubemx软件差不多 注意485芯片的收发脚配置即可 AT32 IDE 说实话这软件太垃…...

内网环境下如何使用ntpdate实时同步时间

背景介绍 NTP&#xff08;Network Time Protocol&#xff09;是一种网络协议&#xff0c;用于同步计算机系统的时间。ntpdate是一个用于手动同步时间的命令行工具&#xff0c;它可以从指定的NTP服务器获取当前时间并更新本地系统时间。 ntpdate 服务介绍 功能&#xff1a;ntp…...

python版本管理工具-pyenv轻松切换多个Python版本

在使用python环境开发时&#xff0c;相信肯定被使用版本所烦恼&#xff0c;在用第三方库时依赖兼容的python版本不一样&#xff0c;有没有一个能同时安装多个python并能自由切换的工具呢&#xff0c;那就是pyenv&#xff0c;让你可以轻松切换多个Python 版本。 pyenv是什么 p…...

工商总局可视化模版 – 基于ECharts的大数据可视化HTML源码

概述 在大数据时代&#xff0c;数据可视化已成为各行各业进行数据分析和决策的重要工具。幽络源今天为大家带来一款基于ECharts的工商总局数据可视化HTML模版&#xff0c;帮助开发者快速搭建专业级工商广告数据展示平台。这款模版设计规范&#xff0c;功能完善&#xff0c;适合…...

计算机网络 : 网络基础

计算机网络 &#xff1a; 网络基础 目录 计算机网络 &#xff1a; 网络基础引言1. 网络发展背景2. 初始协议2.1 初始协议2.2 协议分层2.2.1 软件分层的好处2.2.2 OSI七层模型2.2.3 TCP/IP五层&#xff08;四层&#xff09;模型 2.3 TCP/IP协议2.3.1TCP/IP协议与操作系统的关系&…...

eSwitch manager 简介

eSwitch manager 的定义和作用 eSwitch manager 通常指的是能够配置和管理 eSwitch&#xff08;嵌入式交换机&#xff09;的实体或接口。在 NVIDIA/Mellanox 的网络架构中&#xff0c;Physical Function&#xff08;PF&#xff09;在 switchdev 模式下充当 eSwitch manager&am…...

物联网技术在银行安全用电系统中的应用与实践研究

摘要 随着金融科技的快速发展&#xff0c;银行业电子设备数量激增&#xff0c;用电安全管理问题日益突出。本文基于2019年农业银行与2020年中国邮政储蓄银行发布的安全用电相关政策&#xff0c;分析了银行场景下存在的五大用电安全隐患&#xff0c;提出以物联网技术为核心的安…...

589. N叉树的前序遍历迭代法:null指针与栈的巧妙配合

一、题目描述 给定一个N叉树的根节点&#xff0c;返回其节点值的前序遍历结果。前序遍历的定义是&#xff1a;先访问根节点&#xff0c;再依次遍历每个子节点&#xff08;从左到右&#xff09;。例如&#xff0c;对于如下N叉树&#xff1a; 1/ | \3 2 4 / \ 5 6前序遍历结果…...

【洗车店专用软件】佳易王洗车店多项目会员管理系统:一卡多用扣次软件系统实操教程 #扣次洗车管理软件

一、软件试用版资源文件下载说明 &#xff08;一&#xff09;若您想体验软件功能&#xff0c;可通过以下方式获取软件试用版资源文件&#xff1a; 访问头像主页&#xff1a;进入作者头像主页&#xff0c;找到第一篇文章&#xff0c;点击文章最后的卡片按钮&#xff0c;即可了解…...

小红书笔记详情接口如何调用?实操讲解。

调用小红书笔记详情接口通常需要经过申请权限、构建请求、发送请求并处理响应等步骤&#xff0c;以下是详细的实操讲解&#xff1a; 一、申请接口权限 注册小红书开放平台账号 访问小红书开放平台官网/第三方开放平台&#xff0c;按照提示完成注册流程&#xff0c;提供必要的…...

leetcode 57. Insert Interval

题目描述 代码&#xff1a;由于intervals已经按照左端点排序&#xff0c;并且intervals中的区间全部不重叠&#xff0c;那么可以断定intervals中所有区间的右端点也已经是有序的。先二分查找intervals中第一个其右端点>newInterval左端点的区间。然后按照类似于56. Merge In…...

杰理ac696配置mic

省电容mic有概率不出声解决办法如下...

COMSOL随机参数化表面流体流动模拟

基于粗糙度表面的裂隙流研究对于理解地下水的流动、污染物传输以及与之相关的地质灾害&#xff08;如滑坡&#xff09;等方面具有重要意义。本研究通过蒙特卡洛方法生成随机表面形貌&#xff0c;并利用COMSOL Multiphysics对随机参数化表面的微尺度流体流动进行模拟。 参数化…...

Linux远程连接服务

远程连接服务器简介 远程连接服务器通过文字或图形接口方式来远程登录系统&#xff0c;让你在远程终端前登录linux主机以取得可操作主机接口&#xff08;shell&#xff09;&#xff0c;而登录后的操作感觉就像是坐在系统前面一样。 远程连接服务器的功能 分享主机的运算能力 远…...

用Python绘制梦幻星空

用Python绘制梦幻星空 在这篇教程中&#xff0c;我们将学习如何使用Python创建一个美丽的星空场景。我们将使用Python的图形库Pygame和随机库来创建闪烁的星星、流星和月亮&#xff0c;打造一个动态的夜空效果。 项目概述 我们将实现以下功能&#xff1a; 创建深蓝色的夜…...

EWOMAIL

1、错误 Problem: problem with installed package selinux-policy-targeted-3.14.3-41.el8.noarch package fail2ban-server-1.0.2-3.el8.noarch requires (fail2ban-selinux if selinux-policy-targeted), but none of the providers can be installed - package fail2ban-…...

网安面试经(1)

1.说说IPsec VPN 答&#xff1a;IPsec VPN是利用IPsec协议构建的安全虚拟网络。它通过加密技术&#xff0c;在公共网络中创建加密隧道&#xff0c;确保数据传输的保密性、完整性和真实性。常用于企业分支互联和远程办公&#xff0c;能有效防范数据泄露与篡改&#xff0c;但部署…...

【每天一个知识点】意图传播(Intent Propagation)

在人工智能(AI)快速发展的背景下,自然语言处理(NLP)已成为推动智能系统理解与生成自然语言的核心技术。其中,“意图识别”作为人机交互的关键步骤,已被广泛应用于智能客服、对话系统、语音助手等场景。而“意图传播”(Intent Propagation)作为更深层的机制,逐渐成为当…...

【串流VR手势】Pico 4 Ultra Enterprise 在 SteamVR 企业串流中无法识别手势的问题排查与解决过程(Pico4UE串流手势问题)

写在前面的话 此前&#xff08;用Pico 4U&#xff09;接入了MRTK3&#xff0c;现项目落地需要部署&#xff0c;发现串流场景中&#xff0c;Pico4UE的企业串流无法正常识别手势。&#xff08;一体机方式部署使用无问题&#xff09; 花了半小时解决&#xff0c;怕忘&#xff0c;…...

工具:shell命令提示符自定义之显示GIT当前分支

1 背景 在命令行操作&#xff0c;每次想查看当前分支都要手动执行命令&#xff08;git branch&#xff09;太麻烦了&#xff0c;想着在命令提示符上面显示当前分支&#xff0c;很直观也很方便 2 实现 编辑 vim ~/.bashrc 文件&#xff0c;添加如下内容 function update_prom…...

现代计算机图形学Games101入门笔记(十四)

Irradiance 微小的能量/微小的面积 用Irradiance解释能量大小解释冬夏 Intensity没变&#xff0c;但是Irradiance是衰减的&#xff0c;外圈面积变大&#xff0c;单位面积上接受的能量就变小了。 入射进来 离开 这里就是从某个方向来了一个能量&#xff0c;经过反射&#xff0c…...

前端开发笔记与实践

一、Vue 开发规范与响应式机制 1. 组件命名规范 自定义组件使用大驼峰命名法&#xff08;如 MyComponent&#xff09;&#xff0c;符合 Vue 官方推荐&#xff0c;便于与原生 HTML 元素区分。 2. Proxy vs defineProperty 特性Proxy&#xff08;Vue3&#xff09;Object.defi…...

机器学习知识自然语言处理入门

一、引言&#xff1a;当文字遇上数学 —— 自然语言的数字化革命 在自然语言处理&#xff08;NLP&#xff09;的世界里&#xff0c;计算机要理解人类语言&#xff0c;首先需要将文字转化为数学向量。早期的 One-Hot 编码如同给每个词语分配一个唯一的 “房间号”&#xff0c;例…...

泰迪杯特等奖案例深度解析:基于多级二值化与CNN回归的车牌识别系统设计

(第八届泰迪杯数据挖掘挑战赛特等奖案例全流程拆解) 一、案例背景与核心挑战 1.1 行业痛点与场景需求 在智慧交通与无感支付场景中,车牌识别是核心环节。传统车牌识别系统在复杂光照、污损车牌、多角度倾斜等场景下存在显著缺陷。根据某智慧油站2024年运营数据显示,高峰期…...

ai agent(智能体)开发 python高级应用5:crawl4ai 如何建立一个全面的知识库 第一步找分类

让我们充分利用爬虫功能建立自己丰富的知识库&#xff0c; 第一步找分类 以下是一个层次分明、覆盖全面的知识库分类体系&#xff0c;分为9大主类、43个子类&#xff0c;并融入交叉学科和新兴领域设计&#xff1a; 一、经济与商业 宏观经济&#xff08;全球经济/国家政策&a…...

Solon Ai Flow 编排开发框架发布预告(效果预览)

Solon Ai 在推出 Solon Ai Mcp 后&#xff0c;又将推出 Solon Ai Flow。 1、Solon Ai Flow 是个啥&#xff1f; Solon Ai Flow 是一个智能体编排开发框架。它是框架&#xff01;不是工具&#xff0c;不是产品&#xff08;这与市面上流行的工具和产品&#xff0c;有较大差别&a…...

【言语】刷题5(填空)

front&#xff1a;刷题5 第一个词排除人迹罕至 人迹罕至&#xff1a;很少有人去的地方。指偏僻荒涼的地方。&#xff08;荒郊野岭既视感的一个词&#xff09; 第二个空锁定B&#xff0c;太贴合语义了 第三个空排除一文不值&#xff0c;百无一用&#xff0c;现在这题已经可以过了…...

技术解码 | 腾讯云SRT弱网优化

随着互联网基础设施和硬件设备的不断发展。广大直播观众对于直播观看的清晰度&#xff0c;延时等方面的体验要求越来越高&#xff0c;直播也随之进入了低延迟高码率的时代&#xff0c;直播传输技术也面临着越来越高的要求和挑战。 腾讯视频云为此在全链路上针对流媒体传输不断深…...

“分布形态“

一、分布形态的基础分类 1、正态分布(对称分布) (1)特征:钟型曲线,均值=中位数=众数;约68%数据在μσ范围内,95%在μ2σ内。 (2)应用:身高、体重、测量误差等自然现象。 (3)重要性:多数统计方法(如T检验、方差分析)假设数据正态性。 2、偏态分布 (1)左偏(负…...

Android minSdk从21升级24后SO库异常

问题 minSdk从21调整到24后&#xff1a; java.nio.file.NoSuchFileException: /data/app/~~Z9s2NfuDdclOUwUBLKnk0A/com.rs.unity- Bg31QvFwF4qsCwv2XCqT-w/split_config.arm64_v8a.apkjava.nio.file.NoSuchFileException: /data/app/~~Z9s2NfuDdclOUwUBLKnk0A/com.rs.unity-…...

C#进阶(2)stack(栈)

前言 我们前面介绍了ArrayList,今天就介绍另一种数据结构——栈。 这是栈的基本形式,博主简单画了一下,你看个意思就行,很明显,这种数据有一种特征:先进后出。因为先进来的数据会在下面,下面是密闭的,所以只能取后面进来的。 C#为我们封好了这种数据结构,我们不用担…...

Linux du 命令终极指南:从基础到精通

文章目录 Linux du 命令终极指南&#xff1a;从基础到精通du 命令简介常用参数详解常见用法示例查看当前目录总大小查看当前目录及其子目录占用空间只显示当前目录总占用空间查看目录下每个文件和子目录的大小查看某目录深度为 1 的大小分布查看某目录并排除日志文件查看多个目…...

【Linux网络】数据链路层

数据链路层 用于两个设备&#xff08;同一种数据链路节点&#xff09;之间进行传递。 认识以太网 “以太网” 不是一种具体的网络&#xff0c;而是一种技术标准&#xff1b;既包含了数据链路层的内容&#xff0c;也包含了一些物理层的内容。例如&#xff1a;规定了网络拓扑结…...

水库雨水情测报与安全监测系统解决方案

一、方案概述 本水库雨水情测报与安全监测解决方案的核心目标在于利用尖端的技术手段&#xff0c;确保对水库雨水情势以及大坝安全状况的持续监控和及时预警&#xff0c;从而为水库的稳定运行提供坚实的支持和保障。该方案严格遵循“统筹协调、因库制宜、实用有效、信息共享”的…...

Shotcut:免费开源的视频编辑利器

Shotcut是一款功能强大且完全免费的开源视频编辑软件&#xff0c;专为需要高效、灵活视频编辑的用户设计。它支持多种常见视频格式&#xff0c;如MP4、AVI、MOV等&#xff0c;并提供了丰富的视频编辑功能&#xff0c;满足用户在不同场景下的需求。无论是初学者还是专业人士&…...

学习海康VisionMaster之直方图工具

一&#xff1a;进一步学习了 今天学习下VisionMaster中的直方图工具&#xff1a;就是统计在ROI范围内进行灰度级分布的统计 二&#xff1a;开始学习 1&#xff1a;什么是直方图工具&#xff1f; 直方图工具针对输入灰度图像的指定ROI区域&#xff0c;输出该区域的图像灰度直方…...

AI 笔记 -基于retinaface的FPN上采样替换为CARAFE

上采样替换为CARAFE 引言内容感知特征重组&#xff08;CARAFE&#xff09;公式化核预测模块 引言 简介&#xff1a;CARAFE&#xff08;Content-Aware ReAssembly of FEatures&#xff09;&#xff0c;是用于增强卷积神经网络特征图的上采样方法&#xff0c;论文被 ICCV 2019 接…...

Visual Studio 2022 中添加“高级保存选项”及解决编码问题

文章目录 一、背景二、方法方法一&#xff1a;通过菜单栏手动添加&#xff08;推荐&#xff09;方法二&#xff1a;通过拖拽快速添加&#xff08;替代方案&#xff09; 三、验证与使用四、补充说明五、所能解决的问题 一、背景 VS 在开发cmake项目的过程中&#xff0c;可能会遇…...

SQLMesh 增量模型从入门到精通:5步实现高效数据处理

本文深入解析 SQLMesh 中的增量时间范围模型&#xff0c;介绍其核心原理、配置方法及高级特性。通过实际案例说明如何利用该模型提升数据加载效率&#xff0c;降低计算资源消耗&#xff0c;并提供配置示例与最佳实践建议&#xff0c;帮助读者在实际项目中有效应用这一强大功能。…...

嵌入式开发书籍推荐

嵌入式开发是将计算机技术、微电子技术与各行业应用相结合的综合技术&#xff0c;学习过程中需要多方面知识储备。以下精选书籍&#xff0c;从基础到进阶&#xff0c;助你系统掌握嵌入式开发知识。 基础理论类 《计算机组成原理》&#xff08;唐朔飞版&#xff09;&#xff1…...

实变函数 第二章 点集

2 点集 2.1 欧式空间 2.1.1 度量空间、欧式空间 Definition \textbf{Definition} Definition 度量空间 (距离空间) 若 ∀ x , y ∈ X : ∃ d : ( x , y ) → R \forall x,y\in X:\exists d:(x,y)\to\mathbb{R} ∀x,y∈X:∃d:(x,y)→R&#xff0c;满足&#xff1a; d ( x , y…...

国芯思辰| 轮速传感器AH741对标TLE7471应用于汽车车轮速度感应

在汽车应用中&#xff0c;轮速传感器可用于车轮速度感应&#xff0c;为 ABS、ESC 等安全系统提供精确的轮速信息&#xff0c;帮助这些系统更好地发挥作用&#xff0c;在紧急制动或车辆出现不稳定状态时&#xff0c;及时调整车轮的制动力或动力分配。 国芯思辰两线制差分式轮速…...

MySQL中innodb的ACID

一、什么ACID A&#xff1a;原子性&#xff0c;事务是一个不可分割的工作单位&#xff0c;事务中的操作要么全部成功&#xff0c;要么全部失败回滚&#xff1b;C&#xff1a;一致性&#xff0c;事务必须保证数据库从一个一致性的状态变换成另一个一致性的状态&#xff0c;如A给…...

基于对抗性后训练的快速文本到音频生成:stable-audio-open-small 模型论文速读

Fast Text-to-Audio Generation with Adversarial Post-Training 论文解析 一、引言与背景 文本到音频系统的局限性&#xff1a;当前文本到音频生成系统性能虽佳&#xff0c;但推理速度慢&#xff08;需数秒至数分钟&#xff09;&#xff0c;限制了其在创意领域的应用。 研究…...

java 使用zxing生成条形码(可自定义文字位置、边框样式)

最新工作中遇到生成条形码的需求&#xff0c;经过一番摸索之后找到了zxing这个工具类&#xff0c;实现效果如下&#xff1a; 首先引入依赖&#xff1a; <!-- 条形码生成器 --><dependency><groupId>com.google.zxing</groupId><artifactId&g…...

4.3/Q1,Charls最新文章解读

文章题目&#xff1a;Longitudinal trajectories of disability index and associated factors in Chinese older adults DOI&#xff1a;10.1016/j.jnha.2025.100530 中文标题&#xff1a;中国老年人残疾指数纵向轨迹及相关因素 发表杂志&#xff1a;J Nutr Health Aging 影响…...

CSS- 2.1 实战之图文混排、表格、表单、学校官网一级导航栏

本系列可作为前端学习系列的笔记&#xff0c;代码的运行环境是在HBuilder中&#xff0c;小编会将代码复制下来&#xff0c;大家复制下来就可以练习了&#xff0c;方便大家学习。 HTML系列文章 已经收录在前端专栏&#xff0c;有需要的宝宝们可以点击前端专栏查看&#xff01; 系…...

Android studio 实现弹出表单编辑界面

方法 1&#xff1a;使用 AlertDialog&#xff08;简单表单&#xff09; 适用于简单的表单场景。 1. 创建表单布局&#xff08;XML&#xff09; 在 res/layout 中新建 dialog_form.xml&#xff1a; <?xml version"1.0" encoding"utf-8"?> <L…...

涂色不踩雷:如何优雅解决 LeetCode 栅栏涂色问题

文章目录 摘要描述例子&#xff1a; 题解答案&#xff08;Swift&#xff09;题解代码分析动态规划核心思路初始条件 示例测试及结果示例 1&#xff1a;示例 2&#xff1a;示例 3&#xff1a; 时间复杂度空间复杂度总结实际场景联系 摘要 在用户体验和界面设计中&#xff0c;颜…...

WL-G4048 Multi-Port PCIe 4.0 Switch

系列文章目录 文章目录 系列文章目录《WL-G4048 Multi-Port PCIe 4.0 Switch数据手册》总结一、芯片介绍二、芯片规格介绍&#xff08;一&#xff09;功能指标&#xff08;二&#xff09;管理调试和监控&#xff08;三&#xff09;参考时钟&#xff08;四&#xff09;系统复位 …...