查看: 3961|回复: 1

[i.MX6ULL竞赛专区] 我的项目666——基于i.MX6ULL的串口服务器

[复制链接]
  • TA的每日心情
    擦汗
    昨天 00:00
  • 签到天数: 750 天

    [LV.10]以坛为家III

    23

    主题

    1362

    帖子

    4

    金牌会员

    Rank: 6Rank: 6

    积分
    5257
    最后登录
    2024-4-27
    发表于 2018-7-6 15:10:52 | 显示全部楼层 |阅读模式
    我的项目666——基于i.MX6ULL的串口服务器
    [size=10.5000pt]一、串口服务器介绍
    传统的控制方案一般都采用串口进行操作,无论是TTL/RS232/RS485/RS422都是当年非常流行的控制方式,一直沿用到今天,串口仍然是大多数网络设备“最可靠的”控制方法之一,大量无法通过远程使用的命令和调试模式都可以在串口上使用。从目前主流网络厂商(如思科、juniper、华为、华三、中兴、烽火、锐捷、迈普)的交换机、路由器、Bras、防火墙等最新设备看来,这一趋势还将延续很多年。
    但是随着技术的发展,早期串口的弊端已经暴露无疑,作为控制设备,速率可能不是最重要的,但是便捷性一定放在前位,串口的线路长度、不便于中继和接续等等都已经大幅度落后于现代的以太网。而TCP/IP的大力发展,更是把串口远远甩在了后面,因此很多时候我们采用一种“串口服务器”的设备来将TCP/IP协议的数据包与串口数据相互转换。至于承载TCP/IP的是以太网、WiFi甚至现代的4G5G并没有严格限制,它能连接多个串口设备并将传统的TTL串口或者RS232/RS485/RS422接口的数据串行数据送上流行的IP通道,无疑大大扩展了串口的生命力,将远程管理和数据访问,直接送上Internet,甚至可以做到足不出户,就能对机房内的设备进行系统级的调试。
    [size=10.5000pt]二、硬件结构
    我手上的这款板子是米尔MYS-6ULX-IoT,其实硬件资源挺丰富的,开发串口服务器实际上是需要网络连接和串口两个部分。
    5901b2c385cc0.png
    定位于物联网(IOT)应用的设备来说,当然少不了WIFI连接,这款MYS-6ULX-IoT除了WIFI以外,还提供了Ethernet口,从理论上说以太网口和WIFI口,在应用层的开发来说,没有本质区别。下面的测试都是基于WIFI测试的串口服务器相关功能。
    5901b26f31495.png
    通过TCP/IP来控制串口,那么首先就要有串口,我的目标设备是一个交换机,它支持RS232,波特率9600,数据位8,停止位1,不需要流控和奇偶校验。从手册上来看,GPIO支持 “Selectable Schmitt trigger or CMOS input mode”和“Selectable CMOS or open-drain output type”。因此,作为串口服务器来说,GPIO倒是有不少可以用的端口,但需要做一下电压变化。
    微信截图_20180706122711.png
    说实话,现在在一块板子上找个15V的接口实在不容易,大多都是通过max232芯片将5V的TTL或者max3232芯片将3.3V的TTL转给RS232使用,我之前也试图专门为串口做一个扩展板,不过米尔MYS-6ULX-IoT单板机还有一个usb otg口,碰巧之前有个朋友做了个CP2102usb串口的驱动,直接拿来使用就行。时间原因和调试难度的原因,我就没有使用GPIO了(但我相信这个一定可以用的)。
    通过小口转大口的utg头和usb转串口线连接到设备上。看到大家的贴图,我渣像素的照片实在拿不出手,暂做抛砖之举吧。
    微信图片_20180705134452.jpg
    [size=10.5000pt]三、软件原理
    将米尔MYS-6ULX-IoT上建立一个TCP服务器,启用了6666接口监听,当收到回车之类的数据后,将提供串口的选择,再根据输入数字选择和串口进行对应传输。TCP我采用的是现成的telnet模块(相信ssh也可以开发)。大致的状态机如下:等待状态、串口选择状态、串口服务器状态。
    微信截图_20180706125559.png
    大段代码就不贴了,只提开发过程中遇到的几个关键问题和解决方法:
    1、速率匹配
    因为我已经固化了串口模式,在大段贴数据的时候,串口明显比TCP/IP慢,导致贴出的内容大段大段丢失。查看了串口的驱动说明,修改串口驱动中的“VTY_FAST_OUT=1”字段,将1改为0,关闭快速打印功能。这样操作以后,每次打印串口都是先将信息全部存入系统自带的缓存,再从缓存里面打印就解决了该问题。
    2、转义和控制序列
    在文本输入的模式下,可以通过转义序列进行一些特殊操作,比如终端和打印机上的回车和制表符移动,这些显示在串口—telnet翻译过程中,有时会直接跳出显示类似乱码,而不是类似直接通过telnet到设备上,将非图形控制字符到显示终端,因此部分字符,直接做了删除处理,如控制颜色显示的ESC 字符 (\033) 等。
    3、回车的处理
    在复制文字并粘贴到SecureCRT上时,会根据格式化的文字,形成转义序列。这些格式的文字有时确实是需要的,表示输入该文字换行(“\n\r”),有时又是多余的,例如因为notepad排版到最末端写不下需要换行而生成的“\r”,或者类似垂直制表符和换页符(\v \f),不会影响屏幕输出。对于这个问题,我研究了很久,最后在串口输出时统一保留“\n\r”,删除“\r”、“\v”、“\f”。这样做虽然不能保证今后不出现类似问题,但起码调试交换机没出太大问题。
    [size=10.5000pt]四、测试情况
    我用了某个交换机(这里不做广告,认识的人自然认识)来进行测试,因为软件中目前只开发了一个串口,那么首先选择连接串口1,登陆到设备,输入用户名、密码,随便测试了几个命令,话不多说,直接上贴图。
    SecureCRT的配置
    微信截图_20180706143055.png
    连接后的打印
    微信截图_20180706143256.png
    时间的差别是因为设备上的时间和我板上的时间没有完全对准,@是我设定直接从串口退出的命令,当然这个可能未必合适,后续可能会考虑改成诸如ctrl+\或者其它什么自定义的转义字符。
    嗯,在补充一张截图。
    微信截图_20180706143349.png
    [size=10.5000pt]五、后续开发想法
    后续的开发自然是完善串口服务器的功能,后续准备把GPIO开发出来实现多个串口同时使用,现在RS2323芯片还在淘宝中,制成成品还不知道要什么时候去了。
    目前只允许一个终端登陆到服务器上,每次也只能打开一个console,这个不确定是因为现在只有一个console或者是其它原因。后续希望将每个console映射到一个TCP的端口号使用,这样可以实现多用户同时接入,但这对现有Telnet模块会需要较大的改动。
    还有,如果大规模使用串口服务器,一般会希望串口联网服务器作为TCP客户端,转换器上电时主动向某个平台程序请求连接,并将这个串口服务器虚拟成为主机的某个硬件,这样多个串口服务器设备,可以较为方便的自由切换。

    评分

    参与人数 1 +4 收起 理由
    doatello + 4

    查看全部评分

    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2018-7-31 08:40
  • 签到天数: 43 天

    [LV.5]常住居民I

    299

    主题

    876

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    14698
    最后登录
    2020-3-1
    发表于 2018-7-6 16:26:36 | 显示全部楼层
    感谢分享!
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-27 02:50 , Processed in 0.116361 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表