485通信相关笔记

本文详细解读RS485通信协议,介绍其逻辑状态定义、特点及常用波特率。重点讲解485模块如何实现设备透明连接,包括编程技巧、监听与连接管理,以及遇到的问题与解决方案。

rs485是一种通信协议
定义2~6V -2 ~ -6V 表示两种逻辑状态

特点:速率不快,半双工

波特率:

每秒钟通过信道传输的码元数称为码元传输速率,简称波特率

1波特即指每秒传输1个码元符号(通过不同的调制方式,可以在一个码元符号上负载多个bit位信息)

——摘自百度百科

常见 9600 、 38400

使用485模块可以实现485信号转以太网信号
这样硬件设备——一些传感器元件对于我们的服务器来说就是透明的

在这里插入图片描述

设备接线示意图在这里插入图片描述
图片来自:有人

485 模块使用方式作为客户端(当然也是支持作为服务器的)
主要设置目标ip 和目标端口 波特率等内容

原理: 通过485模块设置和在服务器监听相应端口,495模块主动连接服务器建立TCP连接,然后服务器可以想设备发送指令,也可以接收设备发来的数据,将数据存储数据库后就可以对数据进行分析,或者做其它用途

编程方式上使用java Socket相关api。

监听端口
while(true) {
Socket sc = new Socket(port);

接受连接
Socket client = sc.accept(); // 阻塞直到客户端连上来

发送指令
OutputStream out = client.getOutputStream();
out.wirte(message);

接收数据
InputStream in = client.getOutputStream();
while(in.read(bytes) > 0) {
//处理数据
}

值得注意的是,需要注意指令不要连续发送 需要等待设备响应的数据回来,否则可能会导致数据错乱.

目前还发现485模块,可能会在一段时间内无反应,即发送指令后没有数据响应,但是重启程序或者485模块后恢复正常。

尝试解决办法
判断是否有可读数据 ,一段时间无响应后,断开客户端连接 ,使客户端重新连接进来

代码实现 (伪代码)

long curTime  = Sys.currentTimeMills() + 90000; // 一分半以内

Bytes bytes = new Bytes(); //存数据

while(Sys.currentTimeMills() < curTime) {
	if(clent.getInputStream().avaible() > 0) {
		clent.getInputStream().read(bytes); 
		curTime  = Sys.currentTimeMills() + 90000; 
		//hand data
	}
}

if(!clent.isClosed())
	client.close();

但是问题依然存在
希望路过的大神,指点一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值