USB 转多路串口应用软件说明

news2024/9/24 5:27:01

概述

PL731模块实现1个USB接口转7个异步串口(USART[1-7])功能。用于为计算机扩展异步串口,满足大多数一对多应用场景。支持Windows 10及以上系统,绝大多数Linux系统。嵌入式Linux系统有可能经过裁剪,需要系统开发人员确保系统安装正式的驱动程序,后面有相关说明。
PL731 使用1个USB接口与USB主机通信,属于USB 2.0协议下的USB CDC类设备,需要系统已安装对应的驱动才能正确枚举出7个串口设备。
USB CDC与PSTN的关系

Windows 驱动说明

Windows 10及以上系统自带USB CDC驱动,正常情况下接上USB即会发现7个串口设备。Windows 7及以下操作系统,特别是经过裁剪的精简版系统(包括大多数GHOST系统)可能不能识别该设备。不建议在这些系统上使用本产品。

Linux 驱动说明

Linux内核源码中有USB CDC驱动,路径为:kernel/drivers/usb/class/,"make menuconfig"菜单路径为:Device Drivers —> USB support —> "USB Device class drivers"下的 USB Modem(CDC ACM) support.

Windows 上位机软件说明(C#)

USB设备被枚举为7个串口设备,设备名字一般是"COMx"。如下图所示,USB设备被枚举为从COM20 到 COM26的7个串口设备。大多数情况下,Windows下枚举的名字序号并不与设备实际通道号对应,即下图中的COM20并不代表是设备的第1个串口,上位机软件需要做处理才能知道对应关系。
设备管理器枚举USB-CDC串口设备

如下图所示,通过查看串口设备的属性信息,可以知道设备的PID和VID等信息,通过PID和VID作筛选,得到同一类串口设备。通道号是"MI_xx",xx的值分别是:“00, 02, 04, 06, 08, 0a, 0c”,这些值除以2就是硬件实际通道号。
串口设备详细信息

软件筛选设备及获取通道号信息代码如下:

private ArrayList querySerialPorts()
        {
            ArrayList ports = new ArrayList();
            ManagementObjectSearcher s = new ManagementObjectSearcher("select * from Win32_PnPEntity where Name like '%(COM%'");
            foreach (ManagementObject service in s.Get())
            {
                string serviceString = service.ToString();
                if (serviceString.Contains("VID_1A86&PID_FE0C"))
                {
                    int index = serviceString.IndexOf("MI_");
                    if (index == 0)
                        continue;
                    else
                        index += "MI_".Length;

                    string channelString = service.ToString().Substring(index, 2);
                    int channelNumber = Convert.ToInt32(channelString, 16);
                    channelNumber /= 2;
                    string fullName = service.Properties["Name"].Value.ToString(); //获取名称
                    int p = fullName.IndexOf("(COM");
                    string descript = fullName.Substring(0, p); //截取描述(名称)
                    string COMName = fullName.Substring(p + 1, fullName.Length - p - 2); //截取串口号
                    ports.Add(COMName + "(" + channelNumber + ")");
                    //string manufacturer = service.Properties["Manufacturer"].Value.ToString(); //获取制造商
                    //tbCOMInfo.AppendText(fullName + ", " + descript + ", " + COMName + ", " + channelNumber + ", " + manufacturer + "\r\n");
                }
            }

            return ports;
        }

代码中,变量serviceString的内容: "\DESKTOP-8OVDULB\root\cimv2:Win32_PnPEntity.DeviceID=“USB\VID_1A86&PID_FE0C&MI_00\6&245BBDFA&0&0000”,程序对该字符串进行操作,队列变量"ports"内元素的内容为:“COM26(0)”,即"COM26"这个设备对应着通道0,这样就能与硬件设备的通道号对应上了。该上位机软件完整代码在SDK中提供。

由于硬件线路问题或者中间有USB HUB芯片,串口有可能会掉线然后重新连接上,上位机软件可以通过一些手段来检测到,System.IO.Ports.SerialPort类可以通过变量"IsOpen"来判断,串口open后该变量为true,当串口掉线后(即使重新连上也要重新open)该变量为false。串口掉线时会有InvalidOperationExcption异常产生,发送数据的函数用try-catch语句捕获这个异常,并加以处理即可。参考代码:

public void send(string data)
{
    try
    {
        dtuPort.Write(data);
    }
    catch (InvalidOperationException e)
    {
        System.Console.Out.WriteLine(e.ToString());
    }
}

Linux 枚举脚本参考

在Linux操作系统,串口设备文件都会在/dev目录,例如"/dev/ttyACMx"文件。设备及对应的驱动的映射关系体现在目录上,例如在目录"/sys/bus/usb/drivers/cdc_acm/“下存放USB设备在USB总线上的枚举节点,总线枚举关系是固定的,重启系统或者拔掉USB线再接上,这些节点对应的串口设备及硬件通道号都不会改变,通过这些节点信息可以查找到对应”/dev/"目录下的设备名字,这样就能得到设备名及对应的通道号。
以下shell脚本的功能就是查找设备名,并在/tmp目录下建立软链接:

#!/bin/sh

check_ttyUSB_device()
{
	i=0
	while [ $i -le 6 ];
	do
		if [ -f /tmp/rs485-ch${i} ]; then
			i=$((i+1))
			continue
		fi

		dev_path=${CDC_PATH}$((i*2))/tty
		echo $dev_path
		file_name=`ls ${dev_path} | grep ttyACM | awk '{print $0}'`
		dev_file_name=/dev/${file_name}
		echo ${dev_file_name}
		if [ -e "${dev_file_name}" ]; then
			ln -s ${dev_file_name} /tmp/rs485-ch$i
			echo "dev${i}=/tmp/rs485-ch${i}" >> /tmp/dev_map
			echo "tmp/rs485-ch${i} -> ${dev_file_name}"
		else
			let complete_flag=0
		fi
		i=$((i+1))
	done
}

CDC_PATH=/sys/bus/usb/drivers/cdc_acm/1-1.2:1.
complete_flag=1


# 先清掉再创建
for i in 0 1 2 3 4 5 6;do
	rm /tmp/rs485-ch$i
done

index=0
while [ $index -le 10 ];
do
	let complete_flag=1
	check_ttyUSB_device
	if [ $complete_flag = 1 ]; then
		break
	fi
	index=$((index+1))
	sleep 1
done

chmod a+rw /tmp/dev_map


echo "complete!"

FAQ

  1. USB串口设备不稳定,容易掉线?
    一般都是USB HUB芯片导致,USB转串口芯片本身很稳定。上层软件可以应对这种异常情况,例如前面提到的C#下System.IO.Ports.SerialPort类可以通过变量"IsOpen"来判断。无论是Windows还是Linux下send数据时都会返回错误值,重新再open串口即可。

  2. 与CH340系列芯片的区别
    CH340系列芯片需要安装专有的驱动,本产品操作系统内置驱动。CH340只有一通道,本产品有多个通道(共享1个USB带宽)。

最后是自己USB转多路串口模块的推广_
USB转多路串口模块

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

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

相关文章

[Unity]碰撞器的接触捕获层详解

目录 前言※关闭效果器(Effector)的遮罩接触捕获层的官方描述官方描述的翻译和注解接触捕获层作用简介接触(Contact)和捕获(Capture)配置接触捕获层的作用※接触捕获层对碰撞响应的影响需要接触捕获的物理查询需要接触捕获的物理回调注意运行时(Runtime)修改接触的相互性总结 相…

关于普通接口转AXI接口AMM Master Bridge仿真和使用

平台:vivado2023.1 应用场景,在设计的过程中,在xilinx内部的IP采用AXI接口协议。而我们外部的FIFO,BRAM等接口有时候使用的Native接口。使用AMM Master Bridge IP将普通的native接口转换为AXI接口协议。 参考文件:pg…

C++ | Leetcode C++题解之第229题多数元素II

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> majorityElement(vector<int>& nums) {int n nums.size();vector<int> ans;unordered_map<int, int> cnt;for (auto & v : nums) {cnt[v];}for (auto & v : cnt…

leetcode 28.找出字符串中第一个匹配项的下标

对于Java来说直接秒呗&#xff1a; public static int strStr(String haystack, String needle) {return haystack.indexOf(needle); }

Unity UGUI Image Maskable

在Unity的UGUI系统中&#xff0c;Maskable属性用于控制UI元素是否受到父级遮罩组件的影响。以下是关于这个属性的详细说明和如何使用&#xff1a; Maskable属性 Maskable属性&#xff1a; 当你在GameObject上添加一个Image组件&#xff08;比如UI面板或按钮&#xff09;时&…

渲染100农场有哪些优势?渲染100邀请码1a12

渲染100是知名的渲染农场&#xff0c;深受广大设计师欢迎&#xff0c;比起其他农场&#xff0c;它有什么优势呢&#xff1f;我们一起来看看。 1、资源丰富 渲染100拥有强大的计算集群&#xff0c;能多线处理大规模、超复杂的场景渲染需要&#xff0c;性能卓越。2、成本低廉 渲…

【iOS】OC类与对象的本质分析

目录 前言clang常用命令对象本质探索属性的本质对象的内存大小isa 指针探究 前言 OC 代码的底层实现都是 C/C代码&#xff0c;OC 的对象都是基于 C/C 的数据结构实现的&#xff0c;实际 OC 对象的本质就是结构体&#xff0c;那到底是一个怎样的结构体呢&#xff1f; clang常用…

glibc-all-in-one+patchelf修改程序libc

主要是做堆的时候经常遇到libc小版本不对导致libcbase不对打不通的情况&#xff0c;再者&#xff0c;每个题换一个ubuntu虚拟机属实麻烦&#xff0c;所以还是回到最初也是最好用的做法&#xff1a;patch libc。 核心就是两个工具&#xff1a;glibc-all-in-one和patchlef。但是…

buuctf-web

查看后端源码 得到base64编码&#xff0c;解码得flag

pc端注册页面 密码校验规则

1.密码校验规则 格应包含大小写字母、数字和特殊符号,长度为8-20 var validateRetrievePassword (rule, value, callback) > {let reg /^(?.*[A-Za-z])(?.*\d)(?.*[~!#$%^&*()_<>?:"{},.\/\\;[\]])[A-Za-z\d~!#$%^&*()_<>?:"{},.\/\\;…

WSL-Ubuntu20.04训练环境配置

1.YOLOv8训练环境配置 训练环境配置的话就仍然以YOLOv8为例&#xff0c;来说明如何配置深度学习训练环境。这部分内容比较简单&#xff0c;主要是安装miniAnaconda以及安装torch和torchvision. 首先是miniAnaconda的安装(参考官网的教程Miniconda — Anaconda )&#xff0c;执行…

开发笔记 | 快速上手[法大大]电子合同SDK使用SpringBoot+JAVA

Springbootmavenjava 官方API文档 API - 法大大电子合同和电子签云平台 官方SDK下载 API - 法大大电子合同和电子签云平台 目录 目录 开发前准备 项目整合 功能1&#xff1a;查询文档模板列表 功能2&#xff1a;文档模板字段填充 开发前准备 1.点下方链接注册法大大测试环…

昇思25天学习打卡营第12天|munger85

基于MindSpore通过GPT实现情感分类 这个实现情感分类意思就是通过一些电影的数据最后知道他对于这个电影的评价&#xff0c;最后知道他对于这个电影的评价到底是好还是不好&#xff0c;零就是不好&#xff0c;一就是好。首先我们肯定是按安装这些依赖包了为了今天这个模型我们…

Postman、Apifox、Apipost用哪个?

Postman、Apifox、Apipost都是流行的API接口管理工具&#xff0c;它们各自具有不同的特点和优势&#xff0c;因此哪个更好用取决于具体的使用场景和需求。以下是对这三个工具的比较分析&#xff1a; 一、Postman 特点与优势&#xff1a; 支持多种请求方式&#xff1a;包括GE…

游戏分组(DFS)

游戏分组&#xff08;DFS&#xff09; 将10名参赛者根据其游戏水平评分分为实力尽量相近的两队。 深度优先搜索&#xff08;DFS&#xff09;是游戏分组中常用的一种算法思路。 DFS在解决特定类型的分组问题时&#xff0c;特别是需要遍历所有可能组合的情况&#xff0c;表现出了…

一文详解:医疗营销升级的智能解决方案

顺境是所有人的狂欢&#xff0c;逆境才是优秀者的天堂。淘金的时代过去了&#xff0c;未来是冶金的时代。 01、享受完改革开放40年的高速区间红利 企业正处于中速区间的全面竞争期 1978年&#xff0c;中国的GDP是3679亿。改革开放40多年&#xff0c;我们不断引进资本&#xf…

【嵌入式Linux】<总览> 网络编程(更新中)

文章目录 前言 一、网络知识概述 1. 网路结构分层 2. socket 3. IP地址 4. 端口号 5. 字节序 二、网络编程常用API 1. socket函数 2. bind函数 3. listen函数 4. accept函数 5. connect函数 6. read和recv函数 7. write和send函数 三、TCP编程 1. TCP介绍 2.…

Monaco 使用 DocumentFormattingEditProvider

文档格式化&#xff0c;是 VSCode 比较常用的功能&#xff0c;在文档上点击右键选择格式化文档。效果如下&#xff1a; 在 Monaco 通过 registerDocumentFormattingEditProvider 方法注册处理函数&#xff0c;实现 provider 方法。 provider 方法返回格式化好的代码。 TextE…

Android C++系列:Linux文件系统(二)

1. VFS虚拟文件系统 Linux支持各种各样的文件系统格式&#xff0c;如ext2、ext3、reiserfs、FAT、NTFS、iso9660 等等&#xff0c;不同的磁盘分区、光盘或其它存储设备都有不同的文件系统格式&#xff0c;然而这些文件系统 都可以mount到某个目录下&#xff0c;使我们看到一个…

Kafka(四) Consumer消费者

一&#xff0c;基础知识 1&#xff0c;消费者与消费组 每个消费者都有对应的消费组&#xff0c;不同消费组之间互不影响。 Partition的消息只能被一个消费组中的一个消费者所消费&#xff0c; 但Partition也可能被再平衡分配给新的消费者。 一个Topic的不同Partition会根据分配…