RK3506控制DSL200Summary

发布时间:2026/7/12 17:27:04

RK3506控制DSL200Summary
1.TCP/UDP通信部分TCP通信流程A 和 B 之间先建立一条稳定连接然后再传输数据。服务端创建 Socket (socket)准备一部“电话机”。绑定地址 (bind)给电话机分配一个固定的电话号码IP 地址和端口号以便客户端知道该打给谁。监听端口 (listen)接通电话线让电话处于“可以接听”的状态进入LISTEN状态。接受连接 (accept)阻塞等待原地待命。当客户端拨打电话并发起三次握手时服务端完成握手。关键点握手成功后服务端会为这个客户端生成一个全新的、专属的 Socket用于后续的数据传输而最初的那个 Socket 继续保持监听等待下一个客户。数据交互 (recv/send)通过专属 Socket 与客户端进行全双工双向的数据收发。关闭连接 (close)通信结束参与四次挥手回收系统资源。客户端创建 Socket (socket)准备一部“电话机”。(通常不需要手动绑定bind操作系统会随机分配一个本地端口)。.发起连接 (connect)拨打服务端的电话号码IP 和端口主动发送SYN报文触发三次握手。数据交互 (send/recv)连接建立ESTABLISHED状态后像读写本地文件一样向服务端发送请求并接收响应。关闭连接 (close)数据发完后主动发送FIN报文发起四次挥手断开连接。UDP通信流程UDP 的流程非常轻量没有连接建立和断开的过程服务端和客户端处于更加“平等”的数据收发状态。服务端创建 Socket (socket)准备一个“公共邮箱”。绑定地址 (bind)将邮箱设立在一个公开的地址IP 和端口号告诉所有人信件寄到这里。接收数据 (recvfrom)随时查看邮箱。收到客户端发来的数据报时不仅提取数据还会同时记录下发件人客户端的 IP 和端口。发送数据 (sendto)如果需要回复服务端会根据刚才记录下来的客户端地址直接将回信寄出。客户端创建 Socket (socket)准备信件和邮筒。发送数据 (sendto)只要知道服务端的 IP 和端口直接把数据打包发送出去。它不会管服务端是不是开机、是不是在监听发出去就不管了。接收数据 (recvfrom)如果业务逻辑需要服务端的响应就在这里等待接收回信。TCP和UDP核心区别对比项TCPUDP是否需要连接需要连接不需要连接socket 类型SOCK_STREAMSOCK_DGRAM服务端流程socket → bind → listen → accept → recv/sendsocket → bind → recvfrom/sendto客户端流程socket → connect → send/recvsocket → sendto/recvfrom数据形式字节流数据报是否保证到达保证丢了会重传不保证丢了就丢了是否保证顺序保证顺序不保证顺序是否可能粘包/拆包会需要自己处理包边界一次sendto对应一个 UDP 数据报速度和延迟稳定可靠但机制更重更轻量延迟低适合场景文件传输、控制命令、可靠通信丢包测试、视频流、实时数据、广播、多播在应用层编程层面除了通信流程不同更大的不同还在于数据格式不同UDP的数据格式是数据报一次sendto对应的就是一个UDP数据报所以不会存在粘包/拆包的情况而TCP的数据格式是字节流并不是分好的一个个包所以需要字节处理包边界防止粘包的情况。解决方案static ssize_t readn(int fd, void *buf, size_t len) { size_t left len; char *ptr (char *)buf; while (left 0) { ssize_t n recv(fd, ptr, left, 0); if (n 0) { if (errno EINTR) { continue; } return -1; } if (n 0) { return len - left; } left - n; ptr n; } return len; }代码意思是我要读 len 个字节。如果一次 recv 没读够就继续 recv。直到累计读够 len 个字节才返回成功。假设一个包是 52 字节。第一次调用left 52; ptr buf;第一次recv()只收到 20 字节n 20; left 52 - 20 32; ptr ptr 20;这时缓冲区里已经有前 20 字节了但还不完整所以继续循环。第二次recv()收到 10 字节n 10; left 32 - 10 22; ptr ptr 10;现在累计收到 30 字节还差 22 字节。第三次recv()收到 22 字节n 22; left 22 - 22 0;left 0说明已经读满 52 字节。函数返回return len;也就是返回 52。这时候外层代码才开始解析Packet。2. RK3506控制DSL200部分RK3506-USB转RS485-DSL2002.1 为什么要使用USB-RS485而不直接控制DSL200物理电平与信号类型的根本不匹配RK3506 (SoC侧)芯片直接输出的串口信号是 TTL 电平通常是 1.8V 或 3.3V 的单端信号。这种信号非常微弱只适合在同一块电路板上进行几厘米内的短距离通信。DSL200伺服 (设备侧)工业设备使用的是 RS485 电平标准。它不使用共地单根线传数据而是通过两根线A和B之间的电压差来表示逻辑 0 和 1。2.2 USB-RS485在RK3506的表达在RK3506以及绝大多数运行Linux系统的嵌入式板卡上接入USB转RS485模块后系统在底层会将其识别为USB设备但在应用层它会映射为一个串口TTY设备节点。由于RS485只是物理层的电平标准USB转RS485模块的内部核心其实是一颗“USB转UART串口”的芯片如CH340/CH341、CP2102、FT232等外加一个RS485的收发器PHY。因此Linux内核并不知道外部接的是RS485它只会把它当成普通的USB转串口来处理。应用层的表现形态/dev/ttyUSB*在你的应用程序中直接把它当作普通的串口如/dev/ttyUSB0进行打开、配置波特率和读写即可。2.3 Modbus RTU 一帧数据一般由哪些部分组成一般包括从站地址、功能码、寄存器地址、数据内容、CRC16 校验。比如写单个寄存器时功能码是0x06读保持寄存器时功能码是0x03。2.4 为什么 Modbus RTU 要加 CRC16因为 RS485 是工业现场常用总线可能存在电磁干扰、线缆接触不良、传输错误等问题。CRC16 用于判断接收到的数据帧是否被破坏。如果 CRC 不一致说明数据不可信程序就不能继续使用这帧数据。2.5 B_TCP开机自启是怎么做的可以用 systemd 服务实现。把B_TCP编译后放到固定路径比如/usr/local/bin/B_TCP然后写一个.service文件。3.问题排查部分3.1 如果开机后 A 端连接 B 端失败你怎么排查在我的实际过程中确实遇到过这个问题问题的大部分的原因是我的B板的TCP接收转发端的进程还没起来A端就开始发送数据了导致客户端服务端通信失败。理论上排查过程可以分为1.在B端检查自启服务有没有启动2.使用 ip addr查看ip是否正确查看AB端ip是否在同一个网段3.ping一下等3.2 电机不转怎么排查1.首先插拔一下USB-RS485模块检查一下有没有在 /dev下生成tty节点然后我会重新检查一下波特率。2.排除上述原因我会查看一下dsl200的status状态读取一下速度和模式以及警告码Alarm code对照用户手册查看一下问题。3.我还会测试一下是只有位置模式下有问题还是速度模式和位置模式下都有问题。4.BMI088驱动4.1.字符设备注册流程1.申请设备号 2.初始化字符设备并绑定file_operations 3.创建设备类 4.创建设备节点4.2 IIO注册流程分配 IIO 设备使用devm_iio_device_alloc分配一个 IIO 结构体实例附带分配私有数据空间iio_priv。填充 IIO 信息主要是设置回调函数类似file_operations)与设置channelsinfo结构体提供底层数据读取回调最核心的是read_raw函数。channels数组定义传感器有几个轴、什么类型如IIO_ANGL_VEL表示角速度、是否需要比例因子Scale等。modes设置为INDIO_DIRECT_MODE直接读取模式。注册 IIO 设备使用devm_iio_device_register向内核注册。4.2 BMI088通过SPI读取寄存器的流程是什么主机先发送一个寄存器地址并把最高位置 1 表示读操作。由因为SPI是全双工的所以后续读数据也需要主机一直向从机发一些无效数据产生时钟。4.3BMI088 陀螺仪初始化流程是什么配置 SPI 参数比如 mode、bits_per_word、max_speed_hz。向 soft reset 寄存器写入0xB6让芯片复位。延时等待芯片内部状态恢复。读取 CHIP ID判断是否等于0x0F测试SPI通信是否成功。配置陀螺仪量程比如 ±2000 dps。设置带宽比如2000HZ。注册字符设备或 IIO 设备。4.3.问题排查1.SPI通讯失败阶段1软件排查在接上BMI088模块后导入bmi088_gyro.ko驱动模块发现SPI通讯失败1.首先排查接线是否正确其次排查PS是否接地BMI088在SPI模式下要求PS接地发现购买的BMI088模块是开关模式开关已经打到SPI2.排除上述原因后我们取下BMI088短接开发板上MSIO和MISO引脚排查是BMI088模块的问题还是开发板的问题短接MOSI和MISO后依然SPI通讯失败那问题大概率就在开发板上大概率是设备树有问题3.查看设备树发现已设置引脚复用查看pinctrl子系统下的引脚cat /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins发现SPI0对应的pin口为 pin15pin16pin17pin18pin19对应的GPIO为GPIOB7,GPIOC0,GPIOC1,GPIOC2,GPIOC3然后我们查看原理图可以看到原理图中的SPI几个接口是GPIOB0-B3即接口对应错误。然后我们查看SDK中的设备树可以发现设备树的配置的确是GPIOC xx与原理图中的不同。然后我们按照原理图修改SPI 的pinctrl的引脚修改后查看发现pin789居然不是spi而是uart2说明这个引脚目前是被uart2占用了然后我们在设备树中将uart2的status设为disabled发现pin7-10变成spi了。这时我们以为应该可以了然后连接模块进行实验发现依然报错。阶段2示波器排查所以由此我们现在依然怀疑是开发板SPI输出有问题我们撰写一个持续发送消息的demo然后使用示波器查看CLK,MOSI,MISO波形。通过抓取CLK波形来看CLK无波形那么说明要么设备树依然有问题要么SPI控制器等坏掉了。阶段3继续排查设备树继续排查设备树我们发现编译设备树时除了rk3506-pinctrl.dtsi文件外还有一个rk3506-pinctrl-rmio.dtsi文件然后我们查看原理图发现的确是存在IO重映射机制然后观察rk3506-pinctrl-rmio.dtsi文件文件将所有引脚的重映射功能全部描述出来了如图哪怕GPIOA_0……并没有SPI功能他也描述出来了如果不理解可以打开一下这个文件然后输入 /spi0一直按n会发现有几百个spi的复用实则里面只有几个是我们需要的。最后我们修改板级设备树里面的io9io9io10根据原理图实际情况来就是GPIOB1,GPIOB2等。修改完设备树我们重新编译烧录运行cat /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins可以发现正确的引脚情况了。最后无论是示波器显示还是短接回环还是BMI088模块都没问题了。

相关新闻

AI视频增强工具部署与实战:从环境配置到老视频修复全流程

AI视频增强工具部署与实战:从环境配置到老视频修复全流程

2026/7/11 15:52:29

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 这次我们来看一个名为“Dance”的项目。从标题“在网盘里发现了六年前跳舞的我!”来看,这很可能是一个与视频处…

2026 年最值得关注的千问 Qwen 大模型版本盘点

2026 年最值得关注的千问 Qwen 大模型版本盘点

2026/7/10 5:56:50

2026 年最值得关注的千问 Qwen 大模型版本盘点 大语言模型迭代速度惊人,尤其是阿里云推出的千问(Qwen)系列,凭借强大的推理能力和多模态支持,已成为开发者和企业的首选。截至 2026 年中,Qwen 已全面进化为“…

Python并发编程实战:多线程vs多进程性能对比,一篇文章让你彻底选对方案

Python并发编程实战:多线程vs多进程性能对比,一篇文章让你彻底选对方案

2026/7/10 17:25:36

引言 在Python开发中,当我们需要同时处理多个任务时,常常会面临一个经典的选择:使用多线程还是多进程?由于全局解释器锁(GIL)的存在,Python的多线程并不能真正利用多核CPU实现并行计算&#xf…

C++实现KD-Tree:从原理到实战,解决多维空间最近邻搜索难题

C++实现KD-Tree:从原理到实战,解决多维空间最近邻搜索难题

2026/7/13 5:55:47

1. 项目概述:从“最近邻”问题到KD-Tree如果你写过游戏,或者处理过地图数据、图像特征匹配,大概率会遇到一个经典问题:给定一个二维(或更高维)空间里的一大堆点,如何快速找到离某个目标点最近的…

无血性者,难以为领

无血性者,难以为领

2026/7/13 5:55:47

常有人说,领导力看能力、看格局、看人脉,可历经世事才渐渐明白:一个人到底能不能做领导,藏在最直白的脾气里,刻在骨子里的血性中。没有锋芒的温顺,撑不起团队的脊梁;没有底线的妥协,…

HarmonyOS7 多线程:Worker 让耗时任务不再卡 UI

HarmonyOS7 多线程:Worker 让耗时任务不再卡 UI

2026/7/13 5:55:47

文章目录前言为什么需要多线程Worker vs TaskPoolWorker 创建与通信耗时计算实战线程间数据传递(序列化)线程池管理写在最后前言 你有没有遇到过这种情况:列表页加载 5000 条数据,排序逻辑一跑,整个页面直接冻住&…

5分钟学会QMK Toolbox:机械键盘固件刷写的终极免费解决方案

5分钟学会QMK Toolbox:机械键盘固件刷写的终极免费解决方案

2026/7/13 5:55:47

5分钟学会QMK Toolbox:机械键盘固件刷写的终极免费解决方案 【免费下载链接】qmk_toolbox A Toolbox companion for QMK Firmware 项目地址: https://gitcode.com/gh_mirrors/qm/qmk_toolbox 想让你的机械键盘拥有个性化按键布局和强大功能吗?QMK…

【开源】跨语言·跨平台·跨数据库(2) —— 用宝轻量框架设计必读

【开源】跨语言·跨平台·跨数据库(2) —— 用宝轻量框架设计必读

2026/7/13 5:55:47

【开源】跨语言跨平台跨数据库 (2)—— 用宝轻量框架设计必读 从“数组返回太土”说起:六个设计原则,看懂真正的跨语言架构 咏方舟-长江支流 2026-07-13 用宝框架 拥抱第一 一次书写 三端复用 C# / Java / ArkTS 直接使用,不用重写 ——…

九大网盘直链下载助手:一键解锁百度、阿里云盘等平台下载权限的完整指南

九大网盘直链下载助手:一键解锁百度、阿里云盘等平台下载权限的完整指南

2026/7/13 5:45:47

九大网盘直链下载助手:一键解锁百度、阿里云盘等平台下载权限的完整指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中…

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

2026/7/12 0:03:42

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator作为Unity游戏社区中最成熟的文本翻译解决方…

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

2026/7/12 0:03:42

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持 【免费下载链接】raspberrypi-kernel It provides openEuler kernel source for Raspberry Pi 项目地址: https://gitcode.com/openeuler/raspberrypi-kernel 前往项目官网免费下载&…

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

2026/7/12 0:03:42

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧 【免费下载链接】integration-test The repo contains test suits for system integration test 项目地址: https://gitcode.com/openeuler/integration-test 前往项目官网免费下载:…

卡梅德生物技术快报|纯化重组蛋白:变异链球菌 SepM 截短蛋白载体构建、诱导优化与纯化重组蛋白全套参数方案

卡梅德生物技术快报|纯化重组蛋白:变异链球菌 SepM 截短蛋白载体构建、诱导优化与纯化重组蛋白全套参数方案

2026/7/13 0:05:25

1 研究背景与现存技术痛点(提出问题)在口腔微生物分子机制研究中,SepM 蛋白酶是调控变异链球菌群体感应、致龋菌素合成的核心功能蛋白,体外功能验证、抗体开发均依赖高纯度可溶性 SepM 蛋白。当前原核表达体系针对 SepM 存在三大技…

卡梅德生物技术快报|重组蛋白的表达和纯化:IMAC 金属螯合色谱全流程工艺手册|基质 - 配基 - 金属离子匹配与蛋白质分离纯化参数优化

卡梅德生物技术快报|重组蛋白的表达和纯化:IMAC 金属螯合色谱全流程工艺手册|基质 - 配基 - 金属离子匹配与蛋白质分离纯化参数优化

2026/7/13 0:05:25

1 研究背景与现存技术痛点(提出问题)基因工程、蛋白质组学、生物制药研发流程中,蛋白质分离纯化是决定下游实验成败的关键环节。当前实验室常规蛋白质分离纯化工艺存在三类难以标准化的技术瓶颈:传统离子交换、分子筛层析无特异性…

卡梅德生物技术快报|蛋白质分离纯化:肠激酶可溶性原核表达 + 两步层析全参数|标准化蛋白质分离纯化 SOP

卡梅德生物技术快报|蛋白质分离纯化:肠激酶可溶性原核表达 + 两步层析全参数|标准化蛋白质分离纯化 SOP

2026/7/13 0:05:25

研究痛点提出(提出问题)重组肠激酶是融合标签切除核心工具酶,当前原核表达体系存在三大标准化难题,直接阻碍可复现的蛋白质分离纯化流程搭建:Trx、GST、单 SUMO 标签融合产物绝大多数为包涵体,沉淀占比超 9…