调试串口服务器(康海NC600)的问题记录

很多设备都有串口功能,比如交换机的console口或者打印机等提供的串口,由于产品也要支持串口功能,所以我收到的任务就是调试串口服务器,便于后续测试使用。

本来一开始对串口服务器并不了解,后来通过百度后了解到提供串口转网络功能,能够将RS-232/485/422串口转换TCP/IP协议网络接口,实现RS-232/485/422串口与TCP/IP协议网络接口的数据双向透明传输

网上有很多拓扑搭建和调试的资料,查看后基本了解大概。

在拿到机器后,按照使用说明和快速安装手册,便很快的搭建起来。但是发现打开SecureCRT后,始终没有串口打印信息。了解到其他产品线已经部署并使用串口服务器,询问后说不同型号串口服务器到设备之间的线序各不相同。同样是康海时代的设备(一个是9系列一个是6系列),所以我从他们那里拿了一根线来用,结果串口还是没有打印信息。照理说同一个厂家,线序应该是前后适用的,这个时候我也无从下手。

第二天我便打电话询问厂家,他告诉了我该型号串口服务器的线序,在按照该方法制作串口线后,发现确实可以适用,串口也有了打印信息。但是此时的调试设备只是一台华为交换机,并不是我们的工控机设备。我又重新制作了一根线序的网线,连接到工控机设备,却始终没有打印(厂家的技术支持能力也参差不齐,第一次的客服告诉我工控机的线序可能和交换机的不一致),让我去询问工控机厂商,我又去询问工控机厂商,串口线序是怎么样的(在交流的过程中,他给了我一张图,我发现他也不懂该线序的含义和串口图示,因为我问他的问题他也答不上来)对于一个做网络的人在看到这种硬件示意图,说实话真的一脸懵。

第三天,我思考了很久,由于在京东上购买的USB转console线既可以连接交换机使用,也可以连接工控机的console口使用,理论上应该是同一种接口类型,使用同一种线序。同时,百度后发现,RS232串口线长度不可高于13米,第一次的长度应该是过长,并且后来,我再次打电话给串口服务器厂商询问(这次的客服应该比第一次的技术能力更强,不止告诉我几种排除问题的方法,而且讲述了他很多去客户现场遇到的问题,可能和之前的问题类似)我把工控机厂商的串口示意图发给他,确定告诉我这个和交换机的console口是一种接口,应该是适用一种线序。

有了第二次的电话沟通,所以我这次重新做了一根串口线,按照交换机的串口线序图,并且长度为3米,抱着试一试的想法,结果工控机终于有了打印。

最后终于解决问题,就像是数学考试中,做出了最后一到压轴题一样,整个过程真的是一波三折,串口服务器的配置过程很简单,但是关于线序是关键。所有事情都是集中在这个点上,解决问题过程中涉及到多方的沟通和交流,实在是有点心累。所以最后写下这篇问题记录下该过程。最后附上一张最终的线序图。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hutool是一个Java工具包,其中包含了很多常用的工具类和功能。Hutool也提供了一些网络相关的工具类,可以用来实现非阻塞IO Server服务器。 以下是一个简单的使用Hutool实现非阻塞IO Server服务器的示例代码: ```java import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.log.StaticLog; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.util.Iterator; public class NonBlockingServer { public static void main(String[] args) throws IOException { Selector selector = Selector.open(); ServerSocketChannel serverSocket = ServerSocketChannel.open(); serverSocket.bind(new InetSocketAddress(8080)); serverSocket.configureBlocking(false); serverSocket.register(selector, SelectionKey.OP_ACCEPT); while (true) { if (selector.select() == 0) { continue; } Iterator<SelectionKey> iterator = selector.selectedKeys().iterator(); while (iterator.hasNext()) { SelectionKey key = iterator.next(); iterator.remove(); if (key.isAcceptable()) { ServerSocketChannel server = (ServerSocketChannel) key.channel(); SocketChannel socket = server.accept(); socket.configureBlocking(false); socket.register(selector, SelectionKey.OP_READ); StaticLog.info("新客户端连接:{}", socket.getRemoteAddress()); } else if (key.isReadable()) { SocketChannel socket = (SocketChannel) key.channel(); ByteBuffer buffer = ByteBuffer.allocate(1024); int read = socket.read(buffer); if (read > 0) { String msg = StrUtil.utf8Str(buffer.array(), 0, read); StaticLog.info("收到客户端消息:{}", msg); } else if (read < 0) { StaticLog.info("客户端断开连接:{}", socket.getRemoteAddress()); key.cancel(); IoUtil.close(socket); } } } } } } ``` 该示例代码中,使用了Java NIO的非阻塞IO方式,通过Hutool提供的工具类进行IO操作。主要步骤如下: 1. 创建Selector对象和ServerSocketChannel对象,并将ServerSocketChannel注册到Selector中,监听OP_ACCEPT事件。 2. 进入循环,使用Selector的select()方法等待事件就绪。 3. 遍历已经就绪的事件,并根据事件类型执行相应的操作。其中,如果事件类型是OP_ACCEPT,则新建一个SocketChannel对象,并将它注册到Selector中,监听OP_READ事件;如果事件类型是OP_READ,则读取客户端发送的数据,并输出到控制台。 4. 返回第2步,继续等待事件就绪。 需要注意的是,在使用非阻塞IO方式时,要注意处理事件就绪时的异常情况,以及在操作完成后要及时关闭相关的资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值