【以太网通信】RS232 串口转以太网
最近和 RK 研发同事在调试通信接口,排查与定位 RK3399 接收数据出错的问题。FPGA 与 RK3399 之间使用一路 RS232 串口进行通信,由于串口数据没有分包,不方便排查问题,想到可以开发一个 RS232 串口转以太网的工具,将串口接收到的数据封装为 UDP 数据报文,并通过网线传输到电脑,再进行后续问题的定位。
以下是串口转以太网工具,调试的效果图。

目录
1 模块设计
1.1 串口接收模块
1.2 以太网发送模块
2 上板调试
1 模块设计
1.1 串口接收模块

串口接收模块电路需要实现的功能包括:
(1)串口数据接收;
(2)串口数据缓存。
uart_rx_slice 是串口底层模块,负责接收单个 byte 数据。规定串口每帧传输的数据长度不超过 2048,需要例化一个深度为 4096,位宽为 8bit 的 Block RAM,并实现串口数据的乒乓缓存。

top_uart 模块代码:
`timescale 1ns / 1psmodule top_uart #(parameter FREQ_SYS_CLK = 32'd200_000_000,parameter BAUD_RATE = 32'd256_000
)(// System levelinput sys_rst ,input sys_clk ,// Uart received data flowoutput [7:0] uart_rcv_data ,output uart_rcv_valid ,// Uart Interfaceinput uart_rxd ,output uart_txd
);wire frame_ss ;
wire [7:0] rcv_data ;
wire rcv_valid ;reg frame_ss_r1 ;
reg frame_ss_r2 ;
reg [7:0] blk_mem_wdata ;
reg [11:0] blk_mem_waddr ;
reg [11:0] blk_mem_waddr_r ;
reg [0:0] blk_mem_wren ;
reg blk_mem_rd_busy ;
reg [11:0] blk_mem_raddr ;
wire [7:0] blk_mem_rdata ;
reg blk_mem_rdvld ;// uart_rx_slice: Uart receive module
uart_rx_slice uart_rx_slice_inst (.sys_rst (sys_rst ), // input.sys_clk (sys_clk ), // input.frame_ss (frame_ss ), // output.rcv_data (rcv_data ), // output.rcv_valid (rcv_valid ), // output.uart_rxd (uart_rxd ) // input
);defparam uart_rx_slice_inst.FREQ_SYS_CLK = FREQ_SYS_CLK;
defparam uart_rx_slice_inst.BAUD_RATE = BAUD_RATE;
// End of uart_rx_slice instantiation// blk_mem_4096x8b: Block Memory generator
blk_mem_4096x8b blk_mem_4096x8b_inst (.clka (sys_clk ), // input.ena (1'b1 ), // input.wea (blk_mem_wren ), // input.addra (blk_mem_waddr ), // input.dina (blk_mem_wdata ), // input.clkb (sys_clk ), // input.rstb (sys_rst ), // input.enb (1'b1 ), // input.addrb (blk_mem_raddr ), // input.doutb (blk_mem_rdata ), // output.rsta_busy ( ), // output.rstb_busy ( ) // output
);
// End of blk_mem_4096x8b_inst instantiationalways @(posedge sys_rst or posedge sys_clk) beginif (sys_rst == 1'b1) beginframe_ss_r1 <= 1'b0;frame_ss_r2 <= 1'b0;endelse beginframe_ss_r1 <= frame_ss;frame_ss_r2 <= frame_ss_r1;end
endalways @(posedge sys_rst or posedge sys_clk) beginif (sys_rst == 1'b1) beginblk_mem_waddr <= 12'd0;blk_mem_wdata <= 8'd0;blk_mem_wren <= 1'b0;endelse beginblk_mem_wdata <= rcv_data;blk_mem_wren[0] <= rcv_valid;if (frame_ss_r2 == 1'b1 && frame_ss_r1 == 1'b0) beginblk_mem_waddr[11] <= ~blk_mem_waddr[11];blk_mem_waddr[10:0] <= {11{1'b0}};endelse if (blk_mem_wren[0] == 1'b1) beginblk_mem_waddr[11] <= blk_mem_waddr[11];blk_mem_waddr[10:0] <= blk_mem_waddr[10:0] + 1'b1;endend
endalways @(posedge sys_rst or posedge sys_clk) beginif (sys_rst == 1'b1) beginblk_mem_waddr_r <= 12'd0;blk_mem_raddr <= 12'd0;blk_mem_rd_busy <= 1'b0;blk_mem_rdvld <= 1'b0;endelse beginif (blk_mem_rd_busy == 1'b0 && frame_ss_r2 == 1'b1 && frame_ss_r1 == 1'b0) beginblk_mem_waddr_r <= blk_mem_waddr - 1'b1;blk_mem_rd_busy <= 1'b1;endelse if (blk_mem_rd_busy == 1'b1) beginif (blk_mem_raddr == blk_mem_waddr_r) beginblk_mem_raddr[11] <= ~blk_mem_raddr[11];blk_mem_raddr[10:0] <= {11{1'b0}};blk_mem_rd_busy <= 1'b0;endelse beginblk_mem_raddr[11] <= blk_mem_raddr[11];blk_mem_raddr[10:0] <= blk_mem_raddr[10:0] + 1'b1;endendblk_mem_rdvld <= blk_mem_rd_busy;end
endassign uart_rcv_data = blk_mem_rdata;
assign uart_rcv_valid = blk_mem_rdvld;endmodule
1.2 以太网发送模块

以太网网络层使用 IPv4 协议,传输层使用 UDP 协议。
以太网发送模块电路需要实现的功能包括:
(1)IPv4 与 UDP 协议校验;
(2)以太网帧组帧(包括 CRC 校验);
(3)GMII 与 RGMII 桥接。
同样例化一个深度为 4096,位宽为 8bit 的 Block RAM,实现以太网帧数据的乒乓缓存,在初始化文件中写入以太网帧头,MAC 地址等信息。
使用 Python 代码生成 coe 文件,代码如下:
# 以太网帧头数据
f = b'\x55\x55\x55\x55\x55\x55\x55\xd5\xd4\x5d\x64\xad\x16\x47\x11\x22\x33\x44\x55\x66\x08\x00\x45\x00\x00\x00\x00\x00\x40\x00\x40\x11\xff\xff\xc0\xa8\x01\x08\xc0\xa8\x01\x09\x1f\x90\x1f\x90\x00\x00\x00\x00'
raw_data = list(map(lambda e: "{:02X}".format(e), f))while len(raw_data) < 2048:raw_data.append('00')# 写入coe文件
with open('blk_mem_4096x8b_MAC.coe', 'w') as f:f.write('memory_initialization_radix = 16;\n')f.write('memory_initialization_vector = \n')for i,e in enumerate(raw_data*2):if i != len(raw_data*2)-1:f.write("{:s},\n".format(e))else:f.write("{:s};".format(e))
在 IP 核配置界面,选择 coe 初始化文件,点击 Edit 查看数据。

top_ethernet 模块代码:
`timescale 1ns / 1psmodule top_ethernet #(parameter local_ip_addr = 32'hC0A80109,parameter remote_ip_addr = 32'hC0A8010A,parameter local_udp_port = 16'h1F90,parameter remote_udp_port = 16'h1F90
)(// System levelinput sys_rst ,input sys_clk ,// RGMII Interfaceinput rgmii_rxc ,input [3:0] rgmii_rxd ,input rgmii_rx_ctl ,output rgmii_txc ,output [3:0] rgmii_txd ,output rgmii_tx_ctl ,// UDP data input portsinput [7:0] eth_udp_txd ,input eth_udp_txen
);wire gmii_tx_clk;
wire [7:0] eth_mac_txd;
wire eth_mac_txen;// mac_tx_slice: MAC data pack and transmit module
mac_tx_slice mac_tx_slice_inst(.sys_rst (sys_rst ), // input.sys_clk (sys_clk ), // input.gmii_tx_clk (gmii_tx_clk ), // input.eth_udp_txd (eth_udp_txd ), // input.eth_udp_txen (eth_udp_txen ), // input.eth_mac_txd (eth_mac_txd ), // output.eth_mac_txen (eth_mac_txen ) // output
);defparam mac_tx_slice_inst.local_ip_addr = local_ip_addr;
defparam mac_tx_slice_inst.remote_ip_addr = remote_ip_addr;
defparam mac_tx_slice_inst.local_udp_port = local_udp_port;
defparam mac_tx_slice_inst.remote_udp_port = remote_udp_port;
// End of mac_tx_slice_inst instantiation// gmii_rgmii_bright: GMII to RGMII bridge
util_gmii_to_rgmii util_gmii_to_rgmii (.reset (sys_rst ), // input.rgmii_td (rgmii_txd ), // output.rgmii_tx_ctl (rgmii_tx_ctl ), // output.rgmii_txc (rgmii_txc ), // output.rgmii_rd (rgmii_rxd ), // input.rgmii_rx_ctl (rgmii_rx_ctl ), // input.rgmii_rxc (rgmii_rxc ), // input.gmii_txd (eth_mac_txd ), // input.gmii_tx_en (eth_mac_txen ), // input.gmii_tx_er (1'b0 ), // input.gmii_tx_clk (gmii_tx_clk ), // output.gmii_crs ( ), // output.gmii_col ( ), // output.gmii_rxd ( ), // output.gmii_rx_dv ( ), // output.gmii_rx_er ( ), // output.gmii_rx_clk ( ), // output.speed_selection(2'b10 ), // input.duplex_mode (1'b1 ) // input
);
// End of util_gmii_to_rgmii_inst instantiationendmodule
2 上板调试
使用 ALINX AX7035 开发板,进行工程调试。红色的线接 USB 转串口接口,蓝色的线接入千兆网口。使用电脑模拟发送串口数据,并接收以太网数据。


电脑端同时打开串口调试助手,和 wireshark 工具,开始抓包。
在串口调试助手中输入待发送数据,选择定时 1s 发送,观察 wireshark 界面是否间隔 1s 收到数据包。

相关文章:
【以太网通信】RS232 串口转以太网
最近和 RK 研发同事在调试通信接口,排查与定位 RK3399 接收数据出错的问题。FPGA 与 RK3399 之间使用一路 RS232 串口进行通信,由于串口数据没有分包,不方便排查问题,想到可以开发一个 RS232 串口转以太网的工具,将串口…...
分享两道Java面试的算法上机题目(后续会持续补充更多)
所有题目参考答案均是小编自己想法,仅供参考,解法很多,大可不必局限,有更优解的大神无解,可评论或私聊博主指正! 题目1 找大串,给定一个字符串其中包含任意组连续字符,我们把超过3个…...
如何使用CSS实现一个平滑过渡效果?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用CSS实现平滑过渡效果⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚…...
网络常见设备
目录 1.网络常见设备 1.交换路由设备 2.网络安全设备 3.无线网络设备 4.网络设备生产厂商 1.网络常见设备 当用户通过电子邮件给远方的朋友送去祝福时,一定不会想到这封邮件在网络中将会经历怎样复杂的行程。就好比将一封真实的信件投到邮局后,无法了解…...
数据结构与算法:通往编程高地的必修课(文末送书)
🤵♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞Ǵ…...
python小脚本——批量将PDF文件转换成图片
语言:python 3 用法:选择PDF文件所在的目录,点击 确定 后,自动将该目录下的所有PDF转换成单个图片,图片名称为: pdf文件名.page_序号.jpg 如运行中报错,需要自行根据报错内容按照缺失的库 例如&#x…...
cUrl的介绍和基本使用
cURL 如果你在开发接口的时候,需要调试。那么cUrl将是你必备的技能。也许你用过postman,但这个未免太重量级了。curl将会是你最佳轻量级,调试接口的工具😀 1.Curl函数的基本选项✨ 1.1 --request和 -x —request 和 -X 指定与HTTP服务器通信…...
ONLYOFFICE协作空间服务器如何一键安装自托管私有化部署
ONLYOFFICE协作空间服务器如何一键安装自托管私有化部署 如何在 Ubuntu 上部署 ONLYOFFICE 协作空间社区版?https://blog.csdn.net/m0_68274698/article/details/132069372?ops_request_misc&request_id&biz_id102&utm_termonlyoffice%20%E5%8D%8F%E4…...
java分析公司名称:AI智能工具助力提取地名、品牌名、行业名
java分析公司名称:AI智能工具助力提取地名、品牌名、行业名 一、java智能提取地名 /*** 通过“武汉”补全省市区* throws Exception*/public void getPlace4() throws Exception{String r1 "武汉";String fileName2 "D:\\Personal\\Desktop\\txt…...
php 二维数组排序
要对二维数组进行排序,可以使用 PHP 的函数 array_multisort()。该函数可以按照指定的键值对对数组进行排序。 下面是一个示例代码,展示如何对二维数组按照某个键进行排序: // 定义一个二维数组 $students array(array(name > John, ag…...
postgresql 性能调优
性能调优是为了提高 PostgreSQL 数据库的性能和响应速度。下面是一些常见的 PostgreSQL 性能调优技巧: 1 确保合适的硬件资源:确保数据库服务器具有足够的内存、处理器和磁盘空间,以满足数据库负载的需求。2 优化查询语句:检查并优…...
派森 #P128. csv存json格式
描述 编写一个 Python 程序,读取movie.in(csv格式,utf-8编码) 的数据,将数据转成保存到movie.out(接送格式,utf-8编码)文件中。 格式 输入 movie.in文件,测试格式,utf-8编码。 …...
iPhone开启“轻点唤醒”功能但点击屏幕无反应怎么解决?
iPhone的“轻点唤醒”功能启用时,用户只需手指轻触或点击手机屏幕即可快速唤醒设备,无需按压任何按钮。然而,有些用户在使用“轻点唤醒”功能唤醒屏幕时,遇到该功能失灵,无法正常唤醒屏幕的情况,这是怎么回…...
论AI与大数据之间的关系
前言 在21世纪,"AI"和"大数据"已经成为科技领域的热门词汇。它们不仅是创新的代名词,更是现代技术发展的双翼。然而,很多人对于AI与大数据之间的关系仍然停留在表面的理解。本文旨在深入探讨这两者之间的深厚关系&#…...
6.ES基础概念及术语详细解读
一、Elasticsearch概述: ES是基于Lucene的搜索服务器,它提供了一个分布式多用户能力的全问搜索引擎,且ES支持RestFulweb风格的url访问。ES是基于Java开发的开源搜索引擎,设计用于云计算,能够达到实时搜索,…...
大语言模型微调实践——LoRA 微调细节
1. 引言 近年来人工智能领域不断进步,大语言模型的崛起引领了自然语言处理的革命。这些参数量巨大的预训练模型,凭借其在大规模数据上学习到的丰富语言表示,为我们带来了前所未有的文本理解和生成能力。然而,要使这些通用模型在特…...
国内ChatGPT对比与最佳方案
很久没写内容了,主要还是工作占据了太多时间。简单分享下我这段时间的研究吧,由于时间仓促,有很多内容没有具体写,请自行到我分享的网站体验查看。 前言 ChatGPT 的出现确实在很大程度上改变了世界。许多人已经亲身体验到了ChatGPT作为一个…...
绝美的古诗词AI作画,惊艳到我了!
前言 时光荏苒,科技的飞速发展催生出了许多令人惊叹的创新成果。近年来,人工智能技术在艺术领域的应用日益引人注目,其中最为引人瞩目的莫过于AI作画。这项技术将传统的古诗词与现代的人工智能相结合,创造出一幅幅令人叹为观止的…...
数据结构—排序
8.排序 8.1排序的概念 什么是排序? 排序:将一组杂乱无章的数据按一定规律顺序排列起来。即,将无序序列排成一个有序序列(由小到大或由大到小)的运算。 如果参加排序的数据结点包含多个数据域,那么排序往…...
GraphScope,开源图数据分析引擎的领航者
文章首发地址 GraphScope是一个开源的大规模图数据分析引擎,由Aliyun、阿里巴巴集团和华为公司共同开发。GraphScope旨在为大规模图数据处理和分析提供高性能、高效率的解决方案。 Github地址: https://github.com/alibaba/GraphScope GraphScope 的重…...
告别杂乱地图标注!Arcgis中标注位置与多边形中心点提取的‘黄金搭档’技巧
告别杂乱地图标注!Arcgis中标注位置与多边形中心点提取的‘黄金搭档’技巧 当你在制作行政区划图或设施分布图时,是否曾被密密麻麻的标注搞得焦头烂额?标注重叠、位置不当、中心点偏移——这些问题不仅影响地图美观,更会降低信息的…...
硬件感知集成学习HAPEns:优化机器学习模型部署效率
1. 硬件感知集成学习:当机器学习遇上资源约束在机器学习领域,集成学习(Ensemble Learning)长期被视为提升模型性能的"银弹"。通过组合多个基础模型的预测结果,集成方法能够显著提高分类准确率和鲁棒性。然而…...
从零组装一台智能避障小车:STM32F103RCT6核心控制板、SG90舵机与HC-SR04超声波模块的软硬件联调全记录
从零构建智能避障小车:STM32F103RCT6核心与多传感器融合实战指南 在创客圈里,智能小车一直是验证嵌入式系统能力的经典项目。当传统的循迹小车已经不能满足你的技术探索欲望时,为它装上"眼睛"和"大脑",打造一…...
你的手机变砖前兆?聊聊Android救援模式(Rescue Mode)的5次机会与触发逻辑
你的手机变砖前兆?聊聊Android救援模式(Rescue Mode)的5次机会与触发逻辑 最近有位朋友在群里吐槽:"新装的购物App让手机卡成幻灯片,重启三次都没用,最后居然弹窗问我要不要恢复出厂设置?"这其实是触发了And…...
从编码器线数到电子齿轮比:一份给PLC编程员的伺服电机脉冲计算避坑指南
从编码器线数到电子齿轮比:PLC工程师的伺服电机脉冲计算实战手册 在工业自动化领域,伺服系统的精确定位控制一直是工程师面临的核心挑战。当机械臂需要以0.001mm的精度进行装配,或是数控机床要完成微米级的切削时,脉冲计算的准确…...
Blender 3MF插件:终极指南 - 如何轻松实现3D打印设计一体化
Blender 3MF插件:终极指南 - 如何轻松实现3D打印设计一体化 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 你是否曾经在Blender中精心设计了3D模型ÿ…...
GitHub中文化插件完整指南:3分钟让GitHub界面变中文的终极方案
GitHub中文化插件完整指南:3分钟让GitHub界面变中文的终极方案 【免费下载链接】github-chinese GitHub 汉化插件,GitHub 中文化界面。 (GitHub Translation To Chinese) 项目地址: https://gitcode.com/gh_mirrors/gi/github-chinese 还在为GitH…...
工业数据采集新思路:用一台NET30-CS桥接器同时搞定欧姆龙PLC的FINS/TCP和ModbusTCP协议
工业数据采集新思路:NET30-CS桥接器实现欧姆龙PLC双协议并行接入 在工业自动化系统升级过程中,新旧设备协议兼容性问题一直是困扰工程师的技术痛点。当车间里同时存在依赖FINS/TCP协议的老旧监控系统和仅支持ModbusTCP的新型MES平台时,传统解…...
Stryker.NET在CI/CD中的应用:如何在DevOps流水线中集成变异测试
Stryker.NET在CI/CD中的应用:如何在DevOps流水线中集成变异测试 【免费下载链接】stryker-net Mutation testing for .NET core and .NET framework! 项目地址: https://gitcode.com/gh_mirrors/st/stryker-net Stryker.NET是一款强大的.NET变异测试工具&…...
ARM TLB指令详解与虚拟化内存管理优化
1. ARM TLB指令基础与虚拟化背景 在ARM架构的虚拟化环境中,内存管理单元(MMU)通过TLB(Translation Lookaside Buffer)缓存虚拟地址到物理地址的转换结果,以提升内存访问性能。当页表发生变更时,…...
