❶ java構建的網站如何跟RS485通信
您好,如果有確定的接收位元組長度,設置Rthreshold等於接收位元組長度有利接收正確率提高.由於你的幾個下位機返回數據包位元組不等長,你可根據定址命令發出前預先改變Rthreshold值來保證接收返回符合要求的位元組長度.
不然你接收多少位元組符合你改發下一定址命令呢?程序代碼處理難度較高.
實際下位機返回數據包可在其代碼中補一定其它位元組來達到等長,從而使接收代碼變得簡潔.
等長接收數據後可對接收處理清0來等待下次接收.
補充:
假如下位機的返回數據按地址號能確定接收位元組長度,下列代碼可實現接收不等長數據,僅供參考:
Private Sub MSComm1_OnComm()
On Error Resume Next
Dim BytReceived() As Byte
Dim strBuff As String
Dim strData As String
Dim i As Integer
Dim x As Integer
Select Case MSComm1.CommEvent
Case 2
MSComm1.InputLen = 0
strBuff = MSComm1.Input
BytReceived() = strBuff
For i = 0 To UBound(BytReceived)
If Len(Hex(BytReceived(i))) = 1 Then
strData = strData & "0" & Hex(BytReceived(i))
Else
strData = strData & Hex(BytReceived(i))
End If
Next
Text3 = Text3 + strData
If Left(strData, 2) = "00" And Len(strData) = 8 Then
Text1(0).Text = Left(strData, 8)
Call DataClear
ElseIf Left(strData, 2) = "01" And Len(strData) = 10 Then
Text1(1).Text = Left(strData, 10)
Call DataClear
End If
End Select
End Sub
❷ 如何分析java thread mp
thread mp解析
頭部信息
時間,jvm信息
{code}
2011-11-02 19:05:06
Full thread mp Java HotSpot(TM) Server VM (16.3-b01 mixed mode):
{code}
線程info信息塊
{code}
"Checkpointer" daemon prio=10 tid=0x68ce1c00 nid=0x7c11 in Object.wait() [0x68b5c000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x740ad988> (a java.lang.Object)
at java.lang.Object.wait(Object.java:485)
at com.sleepycat.je.utilint.DaemonThread.run(DaemonThread.java:163)
- locked <0x740ad988> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:619)
{code}
"Checkpointer" daemon prio=10 tid=0x68ce1c00 nid=0x7c11 in Object.wait() [0x68b5c000]
* 線程名稱:Checkpointer
* 線程類型:daemon
* 優先順序:10,默認是5
* jvm線程id:jvm內部線程的唯一標識,0x68ce1c00
* 對應系統線程id:和top命令查看的pid對應,不過一個是10進制,一個是16進制。0x7c11
* 線程狀態:Object.wait().
* 起始棧地址
線程狀態詳解
Runnable
_The thread is either running or ready to run when it gets its CPU turn._
不解釋。
Wait on condition
_The thread is either sleeping or waiting to be notified by another thread._
該狀態出現在線程等待某個條件的發生或者sleep。
_最常見的情況是線程在等待網路的讀寫,比如當網路數據沒有準備好讀時,線程處於這種等待狀態,而一旦有數據准備好讀之後,線程會重新激活,讀取並處理數據。_
Waiting for Monitor Entry and in Object.wait()
_The thread is waiting to get the lock for an object (some other thread may be holding the lock). This happens if two or more threads try to execute synchronized code. Note that the lock is always for an object and not for indivial methods._
當一個線程申請進入臨界區時,獲取到monitor,線程將處於 「Runnable」的狀態,否則,線程 DUMP會顯示處於 「waiting for monitor entry」。
當線程獲得了 Monitor,進入了臨界區之後,如果發現線程繼續運行的條件沒有滿足,它則調用對象(一般就是被 synchronized 的對象)的 wait() 方法,放棄了 Monitor,進入 「Wait Set」隊列。只有當別的線程在該對象上調用了 notify() 或者 notifyAll() , 「 Wait Set」隊列中線程才得到機會去競爭,但是只有一個線程獲得對象的 Monitor,恢復到運行態。在 「Wait Set」中的線程, DUMP中表現為: in Object.wait()。
例:
<span style="background-color: rgb(255, 255, 255);"><span style="color:#ff6666;">{code}
"Timer-0" daemon prio=10 tid=0x695c3000 nid=0x7c00 in Object.wait() [0x69468000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x744f2850> (a java.util.TaskQueue) ###繼續wait
at java.util.TimerThread.mainLoop(Timer.java:509)
- locked <0x744f2850> (a java.util.TaskQueue) ###已經lock到0x744f2850
at java.util.TimerThread.run(Timer.java:462)
{code}</span></span>
參見:http://jameswxx.iteye.com/blog/1041173
{code}
java.lang.Thread.State: WAITING (on object monitor)
<p style="margin-top: 4px; margin-right: 0px; margin-bottom: 4px; margin-left: 0px; padding-top: 2px; padding-right: 0px; padding-bottom: 2px; padding-left: 0px; ">{code}</p>
線程狀態運行:
WAITING||State || Description||
|blocked|This thread tried to enter a synchronized block, but the lock was taken by another thread. This thread is blocked until the lock gets released.|
|blocked (on thin lock)|This is the same state as blocked, but the lock in question is a thin lock.||waiting|This thread called Object.wait() on an object. The thread will remain there until some other thread sends a notification to that object.|
|sleeping|This thread called java.lang.Thread.sleep().||parked|This thread called java.util.concurrent.locks.LockSupport.park().||suspended|The thread's execution was suspended by java.lang.Thread.suspend() or a JVMTI agent call.|
{code}
at java.lang.Object.wait(Native Method)
- waiting on <0x740ad988> (a java.lang.Object) ###等待堆地址為0x740ad988的java.lang.Object對象的鎖
at java.lang.Object.wait(Object.java:485)
at com.sleepycat.je.utilint.DaemonThread.run(DaemonThread.java:163)
- locked <0x740ad988> (a java.lang.Object) ###hold住堆地址為0x740ad988的java.lang.Object對象的鎖
at java.lang.Thread.run(Thread.java:619)
{code}
❸ 關於使用Java實現rs485串口通信的問題
comm.jar
通過串口,PC機可以獲取設備的輸入數據,也可以讓PC機向設備輸出輸出。你的設備應該有相關的程序與說明。
❹ 請問你如何用java實現的ModbusRTU485串口發送報文的,能提供一下代碼嗎,萬分感謝
發送就是像流中寫入16進制數據,java中用byte[]數組表示,至於數組怎麼存放數據要看接受端的要求了,這就要協議來控制,比如數據開頭是什麼,數據長度,校驗位什麼的。發數據要看接受端,兩端需要統一,不能隨便發送。讀寫數據很簡單,關鍵是處理分析數據,調試最難了,有時候還會遇到數據大小端不一致,數據解析亂碼。
❺ 在java的web程序中怎麼使用串口通訊
最近在做java串口通訊,主要是用個人電腦通過串口從RS485讀取數據,並通過crc循環冗餘校驗,把接收正確的數據解析,插入資料庫mysql,並用SSH技術把資料庫數據以表格以及圖表形式顯示
思路:
1.為了從RS485讀取數據,由於暫時沒有硬體設備,系統是win7,故採用Virtual Serial Port Drive(VSPD)這塊虛擬串口軟體代替。並下載sscom32.exe模擬串口通信軟體。
2. 要想實現串口通信,用Java實現串口通信(windows系統下),需要用到sun提供的串javacomm20-win32.zip。其中要用到三個文件,配置如下:
comm.jar放置到 JAVA_HOME/jre/lib/ext;
win32com.dll放置到 JAVA_HOME/bin;
javax.comm.properties 兩個地方都要放
jre/lib(也就是在JAVA文件夾下的jre),JAVA_HOME/jre/lib下
這個配置在我電腦上測試成功,也許不需要這樣麻煩。注意的是,如果你使用myeclipse,因為它自帶jre,你需要在它所在的jre相應位置放dll以及properties文件。
是不是感覺這個很麻煩,還有windows的限制。後來我們下載rxtx這款開源包代替了剛才的comm。不僅windows下可以,linux下也可以。使用方法很簡單,配置如下:
RXTXcomm.jar放到JAVA_HOME/jre/lib/ext
rxtxSerial.dll放到JAVA_HOME/bin
如果你使用myeclipse工具,你需要把rxtxSerial.dll放到它自帶的jre里。
3.新建eclipse工程,添加comm.jar或者RXTXcomm.jar包。因為javacomm20-win32.zip包里有樣例SimpleRead.java,可以通過這個例子測試串口是否正確
4.接收數據正確後,根據傳送接收雙方的協議,採用CRC循環校驗,根據傳輸的一方的校驗函數判定是否是正確傳輸
5.把正確結束的數據解析,查看自己指定的通訊規則,然後解析
6.插入資料庫,jdbc插入
7.數據統計,定時統計每小時,每天,每月,每年的平均值,採用quartz服務來實現。
8.建立web工程,採用hibernate3,spring3,dwr技術把資料庫數據動態顯示,圖表採用jfreechart,以及AJAX的運用
❻ 如何通過java程序通過DTU發送485命令
串口是數據透傳介面,一般使用串口調試軟體的默認 8n11模式就可以,高能的來了:第一點:modbus就是一次用串口連續發多個位元組!!!!!就這么簡單!!!!
如果想在深入一些,那我再告訴你,第二點:連續發出的多個位元組是按順序排好的就可以了
如果想要完成一個雙向通信,那你還要再了解一點就是第三點:發多少個位元組?位元組順序如何排列?
本篇只講主站讀,子站發,看明白之後,再點擊我的用戶名,查看主站寫,子站接的經驗
先說一下DTU RTU區別:modbus dtu是數字數據傳輸協議,gsm ,gps可以用,但是如果需要採集模擬量,比如我要詢問gsm設備的電池電壓,那就要用rtu,,他可以採集模擬量信息,其實對於自己做產品,你都用rtu也可以。也就是說就這點兒區別
知道了dtu rtu的區別,可以嘗試分析和編寫通信協議了,不需要了解太多,你只需要知道上面提到的第三點就可以了!
先說第三點,從機應該發多少數據給主機?答案是:主機請求N個寄存器,從站就發2N個位元組(特別注意,一個寄存器是16位的,而且這個數據長度是不算報文頭,不算crc,不算功能碼的,下面有圖說明)下面看一下真實的通信情況此處主機請求一個寄存器,主機發出10 03 00 00 00 02 c7 4a注意數據高位在前,crc是低位在前
經驗內容僅供參考,如果您需解決具體問題(尤其法律、醫學等領域),建議您詳細咨詢相關領域專業人士
❼ 求高人指點。。。想用java來實現與PLC進行通信,不是通過串口。。。等待中。。
你要知道與PLC通迅的對話協議,但多數PLC的對話協議是不公開的,
公開的有:歐姆龍,西門子S7-200.
還有就是通用的對話協議如: 485/MODBUS,TCP/MODBUS
有的PLC有通用OPC介面。
JAVA是解釋性的語言,速度太慢,不太適合做工控,最好的工控語言是
DELPHI/C++BUILDER, 其次是VC++/VB
❽ JAVA讀rs485怎麼讀
comm.jar 通過串口,PC機可以獲取設備的輸入數據,也可以讓PC機向設備輸出輸出。你的設備應該有相關的程序與說明。