为什么要做USB转多路UART项目 - 技术角度

前言

之前专门为USB转多路UART项目写了个序,提到了技术方案原因,这个文章打算展开讲一下。

一、工业物联网关

最初是因为有个工业物联网关的项目,需要出多路RS485接口,每路外接几十个三相电表PLC之类的电力电子设备。其中一款需要8个串口,于是用USB外扩了6个,加上CPU自带的2个串口凑够8路。CPU原生的串口用来做TTL串口没问题,但是支持RS485就感觉差点意思了。
RS485是差分信号,半双工。需要有个专门的GPIO控制当前是Tx还是Rx,一般做法是保持Rx模式,有数据发送就拉GPIO进入Tx模式,数据发送完毕就拉回Rx模式,与Modbus协议结合完美。官方SDK的代码里是用udelay来控制gpio上下拉的时间的,代码如下方所示。linux kernel 中,udelay 就是个忙循环,精度其实也不准确。串口网关就是串口业务跑满的,猜想一下,CPU 4个串口跑满,udelay被频繁调用,有点酸爽。而且,发送完成切回Rx模式时间上有点误差。因为用DMA方式发送,DMA发送完成中断产生时,实际上最后一个字节还在CPU串口模块的寄存中,未真正发送完成,只是DMA传输完成。所以要调用这个udelay,时间长短要实测才准确,要更精确还要看波特率。
所以应当像MCU那样,注册串口发送完成中断,直接在中断里拉RS485的GPIO是最准确,最快速的。不知道为什么这个CPU(或者是SDK)不采用这种方式。

static int ms_uart_rs485_gpio(struct serial_rs485 *rs485,bool send)
{UART_DBG("delay:%d,%d\n",rs485->delay_rts_before_send,rs485->delay_rts_after_send);if ((rs485->flags & SER_RS485_ENABLED) && send){if(rs485->delay_rts_before_send)udelay(rs485->delay_rts_before_send);if(rs485->flags&SER_RS485_RTS_ON_SEND){gpio_set_value(rs485->padding[0],1);UART_DBG("wend set higt\n");}else{gpio_set_value(rs485->padding[0],0);UART_DBG("send set low\n");}}else if ((rs485->flags & SER_RS485_ENABLED) && !send) {if(rs485->delay_rts_after_send)udelay(rs485->delay_rts_after_send);if(rs485->flags&SER_RS485_RTS_AFTER_SEND){gpio_set_value(rs485->padding[0],1);UART_DBG("after set higt\n");}else{gpio_set_value(rs485->padding[0],0);UART_DBG("after set low\n");}}return 0;
}

二、技术方案

在CPU原生串口不够用的时候,大家一般用USB或者SPI来扩展串口,用SPI扩展的话就需要修改linux驱动。有朋友用过,他们选用SPI的方式是觉得USB不稳定,容易掉线。从我个人经历,以前做过电话网关项目,USB方式是有出现过掉线的问题,其实是USB HUB 芯片引起的,直连或者换个好点的USB HUB 芯片就不会有这个问题。

SPI转串口芯片方案图

USB转串口芯片方案图

从成本来考虑,两种扩展方式都添加外围芯片和电路,成本差不多。如果需要更多串口的话,USB方式可能还要多一个USB HUB 芯片,成本更高。SPI可能需要更多片选 GPIO,每增加一路可能就得改一次驱动代码。

三、USB 扩展方式

我们自己选用USB扩展方式。实测不经过USB HUB芯片不会有掉线问题,买个好点的USB HUB芯片也不会有掉线问题。而且就算掉线,USB也会重连,软件上处理一下即可(在另外的文章有写)。
USB 方式一般扩展为USB CDC设备,windows 10以上和linux系统都自带驱动,嵌入式linux 在menuconfig 配置里面添加上就可以。在应用层直接就是个标准串口设备文件,应用层软件不用修改,像使用普通串口一样。

四、MCU模拟USB转多路串口芯片

回归到问题本身,为什么要自己做这个项目?用MCU模拟USB转多路串口芯片的优势在哪里?

  1. 市面上USB转多路串口芯片价格贵,MCU的价格降下来了,平替优势明显。
  2. MCU 的实时性能好,CPU内置的串口要跑在linux等操作系统下,RS485应用实时性不好。
  3. USB接口简单,引排线出来,接上就能用,不用就不接,灵活。
  4. MCU原生4路串口,我用GPIO模拟了3路串口,一个MCU出7路串口,价格比人家4路串口还便宜,优势明显。

(END)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/872027.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【论文极速读】 可微分检索索引(Differential Search Index, DSI)

【论文极速读】 可微分检索索引(Differential Search Index, DSI) FesianXu 20240714 at WeChat Search Team 前言 最近从朋友处得知了DSI这个概念,所谓的可微分检索索引DSI,就是通过语言模型将检索过程中的索引和召回…

pixelRNN与pixelCNN

目的:为了找到一个最能解释得到的生成样本的模型 PixelRNN 我们需要利用概率链式法则将图像x的生成概率转变为每个像素生成概率的乘积,也就是每个通道生成概率的乘积。 公式: 公式解释:p(x)是每个图像x的概率;右侧为…

浅聊授权-spring security和oauth2

文章目录 前言自定义授权spring security授权oauth2授权概述 前言 通常说到授权,就会想到登录授权、token令牌、JWT等概念,授权。顾名思义就是服务器授予了客户端访问资源的权益,那么要实现授权有几种方案呢,三种授权方式在公司项…

c++dll库的制作和使用

01、dll库的创建使用 创建dll项目 dllexport到处 dllimport导入 分别制定dll和lib的生成目录 调用: 包含头文件 常规添加 最后把dll文件拷贝到程序 成功调用

使用Keepalived实现双机热备(虚拟漂移IP地址)详细介绍

🏡作者主页:点击! 🐧Linux基础知识(初学):点击! 🐧Linux高级管理防护和群集专栏:点击! 🔐Linux中firewalld防火墙:点击! ⏰️创作…

uniapp发送Form Data格式请求

设置header的Content-Type为 application/x-www-form-urlencoded 即可 uni.request({url: , // 接口urldata: {input: 写一篇一千字的作文}, // 入参method: POST, // 参数类型header: {"Content-Type": "application/x-www-form-urlencoded"}, // 请求头…

进销存管理系统设计

进销存管理系统(Inventory Management System,简称IMS)是一种帮助企业有效管理商品的入库、出库及库存情况的信息系统。良好的进销存管理系统能够提升库存周转率、减少库存成本、提高订单处理效率,从而增强企业的市场竞争力。以下…

[JS]Generator

介绍 Generator函数是 ES6 提供的一种异步编程解决方案, async是该方案的语法糖 核心语法 Generator对象由生成器函数返回, 并且它符合可迭代协议和迭代器协议 生成器函数在执行时能暂停, 后面又从暂停处继续执行 <script>// 1.定义生成器函数function* testGenerato…

VMware与centos安装

目录 VM安装 安装centos VM安装 VMware Workstation Pro是VMware&#xff08;威睿公司发布的一袋虚拟机软件&#xff09;&#xff0c;它主要功能是可以给用户在单一的桌面上同时运行不同的操作系统&#xff0c;也是可以进行开发、测试、部署新的应用程序的最佳解决方案。 开始…

HarmonyOS 屏幕适配设计

1. armonyOS 屏幕适配设计 1.1. 像素单位 &#xff08;1&#xff09;px (Pixels)   px代表屏幕上的像素点&#xff0c;是手机屏幕分辨率的单位&#xff0c;即屏幕物理像素单位。 &#xff08;2&#xff09;vp (Viewport Percentage)   vp是视口百分比单位&#xff0c;基于…

程序包不存在【java: 程序包org.springframework.boot不存在】

1、问题提示&#xff1a;java: 程序包org.springframework.boot不存在 注意&#xff1a;已经下载好了程序包&#xff0c;就是提示不存在 2、解决办法

PostgreSQL 中如何处理数据的并发读写和锁等待超时?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 PostgreSQL 中如何处理数据的并发读写和锁等待超时一、并发读写的基本概念&#xff08;一&#xff09;…

公司周年庆活动应该怎么策划?

当我们谈论公司周年庆典&#xff0c;我们不仅仅是在讨论一个简单的派对。 这是一个展现公司文化、增强员工归属感、加深客户关系&#xff0c;甚至推动公司战略发展的重要时刻。 那么&#xff0c;如何策划一场既有趣又有意义的周年庆典呢&#xff1f;这里分享一点自己的私人笔…

【java】力扣 买卖股票的最佳时机II

文章目录 题目链接题目描述思路代码 题目链接 122.买卖股票的最佳时机II 题目描述 思路 这道题和121.买卖股票的最佳时机 有所不同&#xff0c;不同点在于&#xff0c;这道题的股票可以多次买卖(但是要在买之前先卖掉) 详细思路请看链接的文章【java】力扣 买卖股票的最佳时…

ERP基础知识

ERP 一、概述 ​ ERP是Event-related Potentials的简称。外加一种特定的刺激&#xff0c;作用于感觉系统或脑 的某一部位&#xff0c;在给予刺激或撤销刺激时&#xff0c;或和当某种心理因素出现时在脑区所产生的电位变化&#xff0c;成为事件相关电位&#xff0c;是一种特殊…

Sentinel-1 Level 1数据处理的详细算法定义(四)

《Sentinel-1 Level 1数据处理的详细算法定义》文档定义和描述了Sentinel-1实现的Level 1处理算法和方程,以便生成Level 1产品。这些算法适用于Sentinel-1的Stripmap、Interferometric Wide-swath (IW)、Extra-wide-swath (EW)和Wave模式。 今天介绍的内容如下: Sentinel-1 L…

【详解】Spring Cloud概述

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;Spring学习之路&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 1. 认识微服务 1.1 单体架构 1.2 集群和分布式架构 1.3 集群和分布式…

从零开始做题:什么奇奇怪怪的东西

题目 解题 mrf拓展名&#xff0c;macro recorder打开&#xff0c;鼠标键盘的记录 然后解压flag.zip即可&#xff0c;发现有一个挂载的文件&#xff0c;直接打开后 显示所有的隐藏文件 一个一个打开 然后进行拼接运行吧估计。 首先打开txt文件直接久就给出了代码&#xff1…

linux的学习(四):磁盘,进程,定时,软件包的相关命令

简介 关于磁盘管理&#xff0c;进程管理&#xff0c;定时任务&#xff0c;软件包管理的命令的使用 磁盘管理类命令 du du 目录名&#xff1a; 查看文件和目录占用的磁盘空间 参数&#xff1a; -h&#xff1a;可以看到大小的单位&#xff0c;g,mb-a&#xff1a;还可以看到文…

昇思25天学习打卡营第8天|模型权重保存与加载

打卡 目录 打卡 模型的两种保存形式 Checkpoint 中间表示IR 模型保存与加载 模型权重保存-例1 模型权重加载-例1 模型权重保存-例2 模型权重加载-例2 模型权重文件的空间占用计算-例 模型的两种保存形式 Checkpoint 权重参数文件 中间表示IR 中间表示&#xff08;…