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

概述

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转多路串口模块

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STM32F103是一款高性能的微控制器,具有丰富的外设资源,可以通过USB多路串口来拓展其串口通信的功能。 首先,STM32F103具有一个USB接口,可以作为主机或者从机进行USB通信。通过在固件中使用相应的USB库,并配置相应的中断和通信协议,可以实现STM32F103作为USB主机与外部设备进行通信。 其次,STM32F103还拥有多个USART和UART串口接口,可以用来进行串口通信。通过配置相应的串口参数,包括波特率、数据位、校验位和停止位等,可以实现STM32F103与其他外部设备进行串口通信。 为了实现STM32F103的USB多路串口功能,我们可以通过以下步骤来操作: 1. 配置STM32F103的USB功能,使其能够作为USB主机与外部设备进行通信,通过USB中断和通信协议来实现数据的传输和接收。 2. 配置STM32F103的USART或UART串口接口,根据需要可以选择多个串口接口,配置它们的串口参数,使其能够与其他外部设备进行串口通信。 3. 在主程序中编写相应的代码,通过USB接收到的数据进行处理,并通过串口接口将数据发送到外部设备,或者通过串口接口接收到的数据进行处理,并通过USB接口将数据发送到外部设备。 通过以上步骤,就可以实现STM32F103的USB多路串口功能。可以根据具体的需求,配置相应的串口USB参数,来满足不同的串口通信需求。这样可以使STM32F103具备更丰富的通信功能,同时提高其在嵌入式系统中的应用灵活性和可拓展性。 ### 回答2: STM32F103系列微控制器自带的USB接口可以通过软件配置为多路串口模式。具体步骤如下: 1. 配置GPIO引脚:选择作为串口通信的GPIO引脚,并进行相应的初始化配置。 2. 配置USB为虚拟串口:使用HAL库函数或者直接访问寄存器的方式,将USB配置为虚拟串口模式。 3. 初始化串口:配置串口的波特率、数据位、校验位、停止位等参数,并使能串口的中断。 4. 接收数据:在中断函数中,判断接收缓冲区是否有数据,如果有则读取数据并进行处理。 5. 发送数据:将需要发送的数据写入发送缓冲区,并设置发送标志位。 通过以上步骤,就可以将STM32F103的USB接口换为多路串口,以实现串口通信的功能。 需要注意的是,由于只有一个USB接口,因此多路串口模式下只能同时进行一路串口的收发操作。在处理多路串口数据时需要进行切换,确保每个串口的数据收发不会冲突。另外,应根据实际需求来调整串口的波特率等参数,以确保数据的可靠传输。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值