Ainx框架实现 一

ADS114S0x系列ADC引脚、布局与封装选型实战指南 模数转换器(ADC)是连接模拟世界与数字系统的核心器件,其精度直接影响测量与控制系统的性能。ADC的工作原理是将连续的模拟信号离散化并量化为数字代码,其技术价值在于实现高精度、低噪声的信号采集。在工业过程控制、传感器测量等应用场景中,高精度ADC是实现可靠数据采集的关键。本文聚焦于德州仪器ADS114S06/ADS114S08系列24位Δ-Σ ADC,深入剖析其引脚功能定义、PCB布局的噪声隔离艺术,以及TQFP与VQFN封装选型的工程考量。通过理解模拟输入、基准电压、电源地的处理以及封装特性,工程师可以规 阅读详情
在这里插入图片描述

📕作者简介: 过去日记,致力于Java、GoLang,Rust等多种编程语言,热爱技术,喜欢游戏的博主。
📗本文收录于Ainx系列,大家有兴趣的可以看一看
📘相关专栏Rust初阶教程、go语言基础系列、spring教程等,大家有兴趣的可以看一看
📙Java并发编程系列,设计模式系列、go web开发框架 系列正在发展中,喜欢Java,GoLang,Rust,的朋友们可以关注一下哦!


📙 本文大部分都是借鉴刘丹冰大佬的zinx框架和文章,更推荐大家去读大佬的原文,本文只是个人学习的记录

@[TOC]

初识Ainx框架

在这里插入图片描述
上图就显示了所有的ainx框架的模块,我们后来将会一一实现。

Ainx-V0.1 代码实现

为了更好的看到Ainx框架,首先Ainx构建Ainx的最基本的两个模块ainterface和anet。
ainterface主要是存放一些Ainx框架的全部模块的抽象层接口类,Ainx框架的最基本的是服务类接口iserver,定义在aiface模块中。
anet模块是ainx框架中网络相关功能的实现,所有网络相关模块都会定义在anet模块中。

创建ainx框架

创建zinx文件夹,然后创建go项目

mkdir ainx
cd ./ainx
go mod init ainx

创建ainterface、anet模块

在ainx/下 创建ainterface、znet文件夹, 使当前的文件路径如下:
注意:下图由tree自动生成,要查看自己的目录也可以在命令行输入tree

└── ainx
    ├── ainterface
    │  
    └── anet

ainterface下创建服务模块抽象层iserver.go

首先我们给服务器模块抽象一个接口,因为它决定了我们整个框架入口的结构。

ainx/ainterface/iserver.go

package ainterface

//定义服务器接口
type IServer interface{
    //启动服务器方法
    Start()
    //停止服务器方法
    Stop()
    //开启业务服务方法
    Serve()
}

在anet下实现服务模块server.go

我们接下来实现我们的服务器的实体类,暂时我们给给它添加Name,IPVersion,IP,Port 四个属性,分别代表服务器的名字,服务器连接使用的ip协议,服务器绑定的IP和绑定的端口号。

ainx/anet>sever.go

package anet

import (
	"ainx/ainterface"
	"fmt"
	"net"
	"time"
)

type Server struct {
	// 设置服务器名称
	Name string
	// 设置网络协议版本
	IPVersion string
	// 设置服务器绑定IP
	IP string
	// 设置端口号
	Port string
}

//============== 实现 ainterface.IServer 里的全部接口方法 ========

// 开启网络服务
func (s *Server) Start() {
	fmt.Printf("[START] Server listenner at IP: %s, Port %s, is starting\n", s.IP, s.Port)

	// 开启一个go去做服务端的Listener业务
	go func() {
		// todo 未来目标是提供更多协议,可以利用if或者switch对IPVersion进行判断而选择采取哪种协议
		//1 获取一个TCP的Addr
		addr, err := net.ResolveTCPAddr(s.IPVersion, s.IP+":"+s.Port)
		if err != nil {
			fmt.Println("resolve tcp addr err: ", err)
			return
		}
		// 2 监听服务器地址
		listener, err := net.ListenTCP(s.IPVersion, addr)
		if err != nil {
			fmt.Println("listen", s.IPVersion, "err", err)
			return
		}
		//	  已经成功监听
		fmt.Println("start Ainx server  ", s.Name, " success, now listenning...")
		//3 启动server网络连接业务
		for {
			//3.1 阻塞等待客户端建立连接请求
			conn, err := listener.AcceptTCP()
			if err != nil {
				fmt.Println("Accept err ", err)
				continue
			}
			//3.2 TODO Server.Start() 设置服务器最大连接控制,如果超过最大连接,那么则关闭此新的连接

			//3.3 TODO Server.Start() 处理该新连接请求的 业务 方法, 此时应该有 handler 和 conn是绑定的

			//我们这里暂时做一个最大512字节的回显服务
			go func() {
				//不断的循环从客户端获取数据
				for {
					buf := make([]byte, 512)
					cnt, err := conn.Read(buf)
					if err != nil {
						fmt.Println("recv buf err ", err)
						continue
					}
					//回显
					if _, err := conn.Write(buf[:cnt]); err != nil {
						fmt.Println("write back buf err ", err)
						continue
					}
				}
			}()
		}
	}()
}
func (s *Server) Stop() {
	fmt.Println("[STOP] Zinx server , name ", s.Name)
	//TODO  Server.Stop() 将其他需要清理的连接信息或者其他信息 也要一并停止或者清理
}
func (s *Server) Serve() {
	s.Start()
	//TODO Server.Serve() 是否在启动服务的时候 还要处理其他的事情呢 可以在这里添加
	//阻塞,否则主Go退出, listenner的go将会退出
	for {
		time.Sleep(10 * time.Second)
	}
}

/*
创建一个服务器句柄
*/
func NewServer(name string) ainterface.IServer {
	s := &Server{
		Name:      name,
		IPVersion: "tcp4",
		IP:        "0.0.0.0",
		Port:      "8080",
	}
	return s
}

好了,以上我们已经完成了Ainx-V0.1的基本雏形了,虽然只是一个基本的回写客户端数据,那么接下来我们就应该测试我们当前的Ainx-V0.1是否可以使用了。

Ainx框架单元测试样例

理论上我们应该可以现在导入zinx框架,然后写一个服务端程序,再写一个客户端程序进行测试,但是我们可以通过Go的单元Test功能,进行单元测试

创建ainx/znet/server_test.go

package anet

import (
	"fmt"
	"net"
	"testing"
	"time"
)

/*
模拟客户端
*/
func ClientTest() {
	fmt.Println("Client Test ... start")
	// 3秒之后发起调用,让服务端有时间启动
	time.Sleep(3 * time.Second)
	conn, err := net.Dial("tcp", "127.0.0.1:8080")
	if err != nil {
		fmt.Println("client start err,exit")
		return
	}
	for {
		_, err := conn.Write([]byte("hello word"))
		if err != nil {
			fmt.Println("client start err,exit")
			return
		}
		buf := make([]byte, 520)
		cnt, err := conn.Read(buf)
		if err != nil {
			fmt.Println("Read buf error")
			return
		}
		fmt.Printf("Server call back : %s,cnt =%d \n ", buf[:cnt], cnt)
		time.Sleep(1 * time.Second)

	}
}

// Server 模块测试函数
func TestServer(t *testing.T) {
	/*
		服务端测试
	*/
	//
	s := NewServer("first")
	go ClientTest()
	s.Serve()
}

之后便可以运行测试程序程序进行测试
测试结果

=== RUN   TestServer
[START] Server listenner at IP: 0.0.0.0, Port 8080, is starting
Client Test ... start
start Ainx server   first  success, now listenning...
Server call back : hello word,cnt =10 
 Server call back : hello word,cnt =10 
 Server call back : hello word,cnt =10 
 Server call back : hello word,cnt =10 
【asrpro语音模块+语音控制小风扇】 智能语音控制小风扇,使用ASRPRO语音模块只要一句话就能设置小风扇不同挡位的风力。图形化编程简单有效的控制输出PWM的占空比。 阅读详情

相关推荐

传感器接口电路的PCB原理图硬件实现示例

以典型传感器为对象,详解接口电路从功能定义到PCB原理图落地的全过程,涵盖信号调理、电平匹配与抗干扰设计等关键环节,突出PCB原理图在硬件开发中的核心作用,强调元器件选型与布局布线对信号完整性的影响。

weixin_35749786的博客 438

Ainx框架基础路由模块

📕作者简介:过去日记,致力于Java、GoLang,Rust等多种编程语言,热爱技术,喜欢游戏的博主。📗本文收录于系列,大家有兴趣的可以看一看📘相关专栏系列、spring教程等,大家有兴趣的可以看一看📙系列,系列、系列正在发展中,喜欢Java,GoLang,Rust,的朋友们可以关注一下哦!📙 本文大部分都是借鉴刘丹冰大佬的zinx框架和文章,更推荐大家去读大佬的,本文只是个人学习的记录。

个人博客,记录了本人学习的各种有趣的技术。 1339

STM32驱动TB6612实现双电机PWM调速与刹车控制

H桥电机驱动是嵌入式运动控制系统的核心技术,其本质是通过逻辑电平组合与PWM占空比协同控制直流电机的转向、转速与制动状态。TB6612FNG作为高集成度双通道H桥芯片,支持正转、反转、刹车(Brake)和滑行(Coast)四种工作模式,其中刹车模式通过H桥上下臂同时导通实现快速能量耗散,在平衡车、智能小车等对动态响应要求严苛的场景中不可或缺。在STM32平台下,需结合定时器PWM输出配置、GPIO推挽输出寄存器级控制及方向-占空比解耦策略,确保电气时序可靠、逻辑状态原子更新。本文围绕TB6612与STM32

weixin_42452924的博客 128

Ainx的全局配置

📕作者简介:过去日记,致力于Java、GoLang,Rust等多种编程语言,热爱技术,喜欢游戏的博主。📗本文收录于系列,大家有兴趣的可以看一看📘相关专栏系列、spring教程等,大家有兴趣的可以看一看📙系列,系列、系列正在发展中,喜欢Java,GoLang,Rust,的朋友们可以关注一下哦!📙 本文大部分都是借鉴刘丹冰大佬的zinx框架和文章,更推荐大家去读大佬的,本文只是个人学习的记录。

个人博客,记录了本人学习的各种有趣的技术。 1251

UE5笔记【十二】蓝图函数BluePrint Function

蓝图函数BluePrint Function。蓝图类。蓝图变量。

xiaoyaolangwj的博客 4396

Matlab:imageDatastore() 高效读取图像数据集的实战技巧

本文详细介绍了Matlab中imageDatastore()函数的高效使用技巧,帮助用户从繁琐的手动读取图像数据集中解放出来。通过核心语法、关键参数(如IncludeSubfolders、LabelSource、ReadSize)的解析,以及数据集分割、打乱等进阶实战操作,指导读者构建稳定、高效的图像数据读取管道,特别适用于大型图像数据集处理和机器学习项目。

hill8的博客 1101

Nutainx接口的调用

Nutainx自动化脚本的编写

weixin_45294285的博客 496

关于光耦隔离与SP3485E芯片一起使用无法拉高485使能引脚问题

最近在做的一个项目,定制了一块STM32F407ZG的工控板,工控板载4个485接口全部都是只能接收数据,不能对外发送数据。1.接线不正确:接线不正确导致485收发出现问题。 2.程序端口初始化问题:控制光耦隔离的输入脚IO的初始化和置位状态有问题。 3.GPIO复用问题:控制对应串口的GPIO不是正点原子默认的GPIO,而是经过复用的其他IO,复用问题。 4.程序设置与485E芯片收发模式不对应:对于使能引脚的电平要根据光耦的输出情况确定输入IO与RE的关系,可能模式没有对应。 5.光耦隔离或者SP485

weixin_45862642的博客 2978

AVR单片机-代码配置器(MCC)配置ADC

本文简要并实用的讲述了如何使用MPLAB中的MCC(代码配置器)配置AVR芯片ADC并S使用

SjiaM的博客 700

pytest-bdd封装

简介 pytestbdd主要是用于代码封装 代码封装的好处: 1、提升代码复用率 2、提示测试效率 手工测试–使用框架0代码 流程+数据驱动 产品经理这样的不懂测试的人员–流程驱动 自动化测试–数据驱动 pytest-bdd:流程驱动封装 行为驱动–敏捷开发模式,消除开发/测试对需要了解的歧义 使用方式: 描述需求/用户场景 Feature(需求) Scenario(场景) Given(假设) When(操作步骤) Then(验证,清除) #新建feature 文件之前 需要提取安装支持featrue文.

liao_11的博客 2733

COLMAP生成MVSNet数据集

COLMAP生成MVSNet数据集

qq_43307074的博客 5638

【STC单片机学习】第十六课:AD和DA转换

【朱老师课程总结 侵删】 第一部分、章节目录 1.16.1_2.AD转换及其相关背景知识1_2 1.16.3.原理图和数据手册 1.16.4.结合例程分析时序 1.16.5.代码实践 1.16.6.串口直接显示电压值 1.16.7.DA转换 第二部分、章节介绍 1.16.1.AD转换及其相关背景知识1 本节对整个课程做介绍,并且主要讲了模拟量和数字量这两个概念。1.16.2.AD转换及其相关背景知识2 本节接上节继续讲AD转换相关概念,主要是量程、精确度、分辨率、位...

搞IC的小冯 7252

安卓逆向实战:用Batch Apktool 3.8.0快速汉化APK的完整流程

本文详细解析了如何使用Batch Apktool 3.8.0进行安卓APK汉化的完整流程,包括环境配置、反编译、资源解析、深度汉化、重构建与签名优化等关键步骤。通过这款集成化逆向工具,开发者可以高效完成APK汉化,提升工作效率。

s1t2u3的博客 1103

Ainx的消息封装

📕作者简介:过去日记,致力于Java、GoLang,Rust等多种编程语言,热爱技术,喜欢游戏的博主。📗本文收录于系列,大家有兴趣的可以看一看📘相关专栏系列、spring教程等,大家有兴趣的可以看一看📙系列,系列、系列正在发展中,喜欢Java,GoLang,Rust,的朋友们可以关注一下哦!📙 本文大部分都是借鉴刘丹冰大佬的zinx框架和文章,更推荐大家去读大佬的,本文只是个人学习的记录。

个人博客,记录了本人学习的各种有趣的技术。 898

FPGA资料分享——FPGA开发板入手指南

FPGA学习,开发板怎么选,看这里,就一个通透

weixin_51627076的博客 7301

大数据利器Hadoop:从基础到实战,一篇文章掌握大数据处理精髓!

在当今大数据时代,数据量的爆炸式增长对企业和技术提出了前所未有的挑战。如何高效地存储、处理和分析这些庞大的数据集,成为了亟待解决的问题。Hadoop作为一种分布式计算框架,应运而生,为大数据处理提供了有效的解决方案。Hadoop是一个由Apache软件基金会维护的开源项目,它基于Google的分布式文件系统(Google File System,GFS)和MapReduce计算模型设计。Hadoop的主要目标是处理大规模数据集,它可以在普通硬件集群上运行,从而降低了大数据处理的成本。

邓邓子的博客 8288

Ainx的多路由模式

📕作者简介:过去日记,致力于Java、GoLang,Rust等多种编程语言,热爱技术,喜欢游戏的博主。📗本文收录于系列,大家有兴趣的可以看一看📘相关专栏系列、spring教程等,大家有兴趣的可以看一看📙系列,系列、系列正在发展中,喜欢Java,GoLang,Rust,的朋友们可以关注一下哦!📙 本文大部分都是借鉴刘丹冰大佬的zinx框架和文章,更推荐大家去读大佬的,本文只是个人学习的记录。

个人博客,记录了本人学习的各种有趣的技术。 919

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Ainx-V0.2-简单的连接封装与业务绑定

📕作者简介:过去日记,致力于Java、GoLang,Rust等多种编程语言,热爱技术,喜欢游戏的博主。📗本文收录于系列,大家有兴趣的可以看一看📘相关专栏系列、spring教程等,大家有兴趣的可以看一看📙系列,系列、系列正在发展中,喜欢Java,GoLang,Rust,的朋友们可以关注一下哦!📙 本文大部分都是借鉴刘丹冰大佬的zinx框架和文章,更推荐大家去读大佬的,本文只是个人学习的记录。

个人博客,记录了本人学习的各种有趣的技术。 1360

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Keil µVision调试器中AINx VTRegs的应用与信号模拟技巧

虚拟目标寄存器(VTRegs)是嵌入式开发中模拟调试的核心技术之一,它通过软件模拟硬件寄存器的行为,使开发者能在无物理硬件的情况下验证功能。AINx系列VTRegs专门用于模拟ADC输入信号,其工作原理是通过调试环境直接控制模拟输入引脚的电压值。这项技术的工程价值在于能显著缩短开发周期,特别适用于ADC采样算法验证、传感器信号模拟等场景。在Keil µVision环境中,开发者可以静态设置固定电压,动态调整信号波形,甚至生成复杂的正弦波、方波等测试信号。结合模拟器调试与信号注入技术,能够高效测试温度传感器、

weixin_29735807的博客 355

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

深入解析ADS816x ADC自动序列与窗口比较器寄存器配置

在嵌入式数据采集系统设计中,模数转换器(ADC)是实现模拟信号数字化的核心器件。其工作原理是将连续的模拟电压信号,通过采样、量化和编码,转换为微处理器可处理的数字代码。为了提升系统效率与智能化水平,现代高性能ADC普遍集成了可编程寄存器,允许开发者配置复杂的采样序列和实时监控逻辑。这种硬件级的可编程性,其技术价值在于能将主控制器从繁琐的时序调度和实时判断任务中解放出来,实现更高效、更可靠的数据采集。这在多通道传感器巡检、实时控制系统和状态监控等应用场景中尤为重要。以TI ADS816x系列ADC为例,其自动

weixin_29189003的博客 240

一、stm32+TB6612+PWM+电机驱动

首先stm32由于引脚耐压特性等缘故,标准IO引脚的输入电压的输入范围为-0.3v-4.3v(VDD的最大电压为4v)、而其实耐压引脚的电压最高值也仅仅是5.5v,而一般stm32使用VDD引脚向内部供电、供电电压也一般小于或等于3.6v,目前大多数的系统板都是3.3v(这个数字是有说法的,感兴趣可以去查),即使使用5v引脚供电,在引脚真实进行负载时,实际电压可能下降至2、3v,这个驱动能力对于直流电机而言是远远不够的,目前一般的电机(做小实验等级)的电压大多是5v、12v、24、36v等,也因此想要让电机

m0_52779966的博客 6427

每日一个好用的软件或网站,今天是免费chantgpt

hello大家好,不记得之前大家是否记得我发布过一个chantgpt,不过一段时间就收费啦,今天我又给大家带来一个免费的chantgpt。它的使用次数3.5是完全免费的,但是4.0就会有些限制,但是不要担心,也是完全免费的,这个是个文本模型,可以帮助我们查询资料,查文档,帮助我们写作等等,所以你还在等什么呢。

2302_76160310的博客 611

关于AD7124的应用

我看到AD7124用作PT100采集,我很好奇的是这个芯片的AINx在输出电流的同时也可以作为模拟输入通道吗?否则怎么可能这么用。

chungle2011的专栏 1279

(合泰杯)HT32F52352通过TB6612实现直流减速电机PWM调速与正反转控制(附完整代码)

本文详细介绍了基于合泰杯HT32F52352单片机与TB6612驱动芯片的直流减速电机PWM调速与正反转控制方案。通过硬件连接详解、PWM配置代码实现及完整控制逻辑,解决了电机驱动电流不足问题,并提供实际可用的代码示例与调试技巧。

motor的博客 967

音诺ai翻译机利用PCM1863完成立体声ADC采样

本文深入解析PCM1863立体声ADC在音诺AI翻译机中的应用,涵盖硬件设计、驱动开发、性能优化及与AI语音链路的协同机制,系统阐述其在高质量音频采集与智能处理中的关键技术实现。

weixin_30798867的博客 1031

【STM32G431实战】模拟SPI驱动ADS1118实现四通道电压采集(附代码)

本文介绍了基于STM32G431和ADS1118芯片实现四通道电压轮询采集的方案。ADS1118是TI推出的16位高精度ADC,支持4路单端/2路差分输入,内置PGA和温度传感器。文章详细解析了芯片的寄存器配置、数据格式和SPI通信特性,并给出了硬件连接方案。软件实现部分通过GPIO模拟SPI协议,提供了初始化函数、配置字写入函数和通道读取函数的具体实现代码,重点解决了多通道采集时数据错位的问题。该方案在工业传感应用中具有实用价值,为类似项目开发提供了参考。

qq_46671207的博客 1553
上一篇: 打造个性化github主页 二 WakaTime - 动态统计你的工作量
下一篇: 小程序 自定义组件和生命周期
过去日记
过去日记 新星创作者: 后端开发技术领域 新星创作者: 后端开发技术领域
博客等级 码龄3年 5343粉丝 225原创
评论 19
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

过去日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值