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();
但是问题依然存在
希望路过的大神,指点一下