java串口通信代碼 Java 串口

在java的web程序中怎么使用串口通訊?

方法如下:

創(chuàng)新互聯(lián)長期為上千余家客戶提供的網(wǎng)站建設服務,團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為貴南企業(yè)提供專業(yè)的成都做網(wǎng)站、成都網(wǎng)站建設,貴南網(wǎng)站改版等技術(shù)服務。擁有10多年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

新建eclipse工程,添加comm.jar或者RXTXcomm.jar包。因為javacomm20-win32.zip包里有樣例SimpleRead.java,可以通過這個例子測試串口是否正確。

接收數(shù)據(jù)正確后,根據(jù)傳送接收雙方的協(xié)議,采用CRC循環(huán)校驗,根據(jù)傳輸?shù)囊环降男r灪瘮?shù)判定是否是正確傳輸。

把正確結(jié)束的數(shù)據(jù)解析,查看自己指定的通訊規(guī)則,然后解析。

插入數(shù)據(jù)庫,jdbc插入。

數(shù)據(jù)統(tǒng)計,定時統(tǒng)計每小時,每天,每月,每年的平均值,采用quartz服務來實現(xiàn)。

建立web工程,采用hibernate3,spring3,dwr技術(shù)把數(shù)據(jù)庫數(shù)據(jù)動態(tài)顯示,圖表采用jfreechart,以及AJAX的運用

java優(yōu)點:

java是純面向?qū)ο缶幊痰恼Z言;

平臺無關(guān)性 (一次編譯,到處運行;Write Once,Run Anywhere);

java提供了許多內(nèi)置的類庫,通過這些類庫,簡化了開發(fā)人員的設計工作,同時縮短了項目開發(fā)時間;

提供了對Web應用開發(fā)的支持,例如,Applet,Servlet,和JSP可以用來開發(fā)Web應用程序,,Socket,RMI可以用來開發(fā)分布式應用程序的類庫;

去除了c++中難以理解,容易混淆的特性(如c++中的多繼承,頭文件,指針,結(jié)構(gòu),單元,運算符重載,虛擬基礎類,使得程序更加嚴謹,整潔。

java串口通信

java.comm可以在XP下使用,我用JAVA寫過串口程序

下載了comm.jar開發(fā)包后,與之一起的還有兩個重要的文件,win32com.dll和javax.comm.properties。

1 comm.jar提供了通訊用的java API。

2 win32com.dll提供了供comm.jar調(diào)用的本地驅(qū)動接口。

3 javax.comm.properties是這個驅(qū)動的類配置文件。

首先 將comm.jar復制到JRE_HOME\lib\ext目錄。

接著 將win21com.dll復制到你的RS232應用程序運行的目錄,即user.dir。

最后 將javax.comm.properties復制到JRE_HOME\lib目錄。

我在Eclipse3.2+JDK1.6開發(fā)的時候,在項目中包含comm.jar和win32com.dll

編程技巧:Java串口通信簡介

嵌入式系統(tǒng)或傳感器網(wǎng)絡的很多應用和測試都需要通過PC機與嵌入式設備或傳感器節(jié)點進行通信 其中 最常用的接口就是RS 串口和并口(鑒于USB接口的復雜性以及不需要很大的數(shù)據(jù)傳輸量 USB接口用在這里還是顯得過于奢侈 況且目前除了SUN有一個支持USB的包之外 我還沒有看到其他直接支持USB的Java類庫) SUN的CommAPI分別提供了對常用的RS 串行端口和IEEE 并行端口通訊的支持 RS C(又稱EIA RS C 以下簡稱RS )是在 年由美國電子工業(yè)協(xié)會(EIA)聯(lián)合貝爾系統(tǒng) 調(diào)制解調(diào)器廠家及計算機終端生產(chǎn)廠家共同制定的用于串行通訊的標準 RS 是一個全雙工的通訊協(xié)議 它可以同時進行數(shù)據(jù)接收和發(fā)送的工作

常見的Java串口包

目前 常見的Java串口包有SUN在 年發(fā)布的串口通信API m jar(Windows下) m jar(Linux/Solaris);IBM的串口通信API以及一個開源的實現(xiàn) 鑒于在Windows下SUN的API比較常用以及IBM的實現(xiàn)和SUN的在API層面都是一樣的 那個開源的實現(xiàn)又不像兩家大廠的產(chǎn)品那樣讓人放心 這里就只介紹SUN的串口通信API在Windows平臺下的使用

串口包的安裝(Windows下)

到SUN的網(wǎng)站下載javam win zip 包含的東西如下所示

按照其使用說明(l)的說法 要想使用串口包進行串口通信 除了設置好環(huán)境變量之外 還要將win dll復制到 \bin目錄下;將m jar復制到 \lib;把m properties也同樣拷貝到 \lib目錄下 然而在真正運行使用串口包的時候 僅作這些是不夠的 因為通常當運行 java MyApp 的時候 是由JRE下的虛擬機啟動MyApp的 而我們只復制上述文件到JDK相應目錄下 所以應用程序?qū)崾菊也坏酱?解決這個問題的方法很簡單 我們只須將上面提到的文件放到JRE相應的目錄下就可以了

值得注意的是 在網(wǎng)絡應用程序中使用串口API的時候 還會遇到其他更復雜問題 有興趣的話 你可以查看CSDN社區(qū)中 關(guān)于網(wǎng)頁上Applet用javam 讀取客戶端串口的問題 的帖子

串口API概覽

m CommPort

這是用于描述一個被底層系統(tǒng)支持的端口的抽象類 它包含一些高層的IO控制方法 這些方法對于所有不同的通訊端口來說是通用的 SerialPort 和ParallelPort都是它的子類 前者用于控制串行端口而后者用于控這并口 二者對于各自底層的物理端口都有不同的控制方法 這里我們只關(guān)心SerialPort

m CommPortIdentifier

這個類主要用于對串口進行管理和設置 是對串口進行訪問控制的核心類 主要包括以下方法

l 確定是否有可用的通信端口

l 為IO操作打開通信端口

l 決定端口的所有權(quán)

l 處理端口所有權(quán)的爭用

l 管理端口所有權(quán)變化引發(fā)的事件(Event)

m SerialPort

這個類用于描述一個RS 串行通信端口的底層接口 它定義了串口通信所需的最小功能集 通過它 用戶可以直接對串口進行讀 寫及設置工作

串口API實例

大段的文字怎么也不如一個小例子來的清晰 下面我們就一起看一下串口包自帶的例子 SerialDemo中的一小段代碼來加深對串口API核心類的使用方法的認識

列舉出本機所有可用串口

void?listPortChoices()?{ CommPortIdentifier?portId; Enumeration?en?=?CommPortIdentifier getPortIdentifiers(); //?iterate?through?the?ports while?(en hasMoreElements())?{ portId?=?(CommPortIdentifier)?en nextElement(); if?(portId getPortType()?==?CommPortIdentifier PORT_SERIAL)?{ System out println(portId getName()); } } portChoice select(parameters getPortName()); }

以上代碼可以列舉出當前系統(tǒng)所有可用的串口名稱 我的機器上輸出的結(jié)果是 和

串口參數(shù)的配置

串口一般有如下參數(shù)可以在該串口打開以前配置進行配置

包括波特率 輸入/輸出流控制 數(shù)據(jù)位數(shù) 停止位和齊偶校驗

SerialPort?sPort; try?{ sPort setSerialPortParams(BaudRate Databits Stopbits Parity); //設置輸入/輸出控制流 sPort setFlowControlMode(FlowControlIn?|?FlowControlOut); }?catch?(UnsupportedCommOperationException?e)?{}

串口的讀寫

對串口讀寫之前需要先打開一個串口

CommPortIdentifier?portId?=?CommPortIdentifier getPortIdentifier(PortName); try?{ SerialPort?sPort?=?(SerialPort)?portId open( 串口所有者名稱 ?超時等待時間); }?catch?(PortInUseException?e)?{//如果端口被占用就拋出這個異常 throw?new?SerialConnectionException(e getMessage()); } //用于對串口寫數(shù)據(jù) OutputStream?os?=?new?BufferedOutputStream(sPort getOutputStream()); os write(int?data); //用于從串口讀數(shù)據(jù) InputStream?is?=?new?BufferedInputStream(sPort getInputStream()); int?receivedData?=?is read();

讀出來的是int型 你可以把它轉(zhuǎn)換成需要的其他類型

這里要注意的是 由于Java語言沒有無符號類型 即所有的類型都是帶符號的 在由byte到int的時候應該尤其注意 因為如果byte的最高位是 則轉(zhuǎn)成int類型時將用 來占位 這樣 原本是 的byte類型的數(shù)變成int型就成了 這是很嚴重的問題 應該注意避免

串口通信的通用模式及其問題

終于嘮叨完我最討厭的基礎知識了 下面開始我們本次的重點 串口應用的研究 由于向串口寫數(shù)據(jù)很簡單 所以這里我們只關(guān)注于從串口讀數(shù)據(jù)的情況 通常 串口通信應用程序有兩種模式 一種是實現(xiàn)SerialPortEventListener接口 監(jiān)聽各種串口事件并作相應處理;另一種就是建立一個獨立的接收線程專門負責數(shù)據(jù)的接收 由于這兩種方法在某些情況下存在很嚴重的問題(至于什么問題這里先賣個關(guān)子J) 所以我的實現(xiàn)是采用第三種方法來解決這個問題

事件監(jiān)聽模型

現(xiàn)在我們來看看事件監(jiān)聽模型是如何運作的

l 首先需要在你的端口控制類(例如SManager)加上 implements SerialPortEventListener

l 在初始化時加入如下代碼

try?{ SerialPort?sPort addEventListener(SManager); }?catch?(TooManyListenersException?e)?{ sPort close(); throw?new?SerialConnectionException( too?many?listeners?added ); } sPort notifyOnDataAvailable(true);

l 覆寫public void serialEvent(SerialPortEvent e)方法 在其中對如下事件進行判斷

BI 通訊中斷

CD 載波檢測

CTS 清除發(fā)送

DATA_AVAILABLE 有數(shù)據(jù)到達

DSR 數(shù)據(jù)設備準備好

FE 幀錯誤

OE 溢位錯誤

OUTPUT_BUFFER_EMPTY 輸出緩沖區(qū)已清空

PE 奇偶校驗錯

RI  振鈴指示

一般最常用的就是DATA_AVAILABLE 串口有數(shù)據(jù)到達事件 也就是說當串口有數(shù)據(jù)到達時 你可以在serialEvent中接收并處理所收到的數(shù)據(jù) 然而在我的實踐中 遇到了一個十分嚴重的問題

首先描述一下我的實驗 我的應用程序需要接收傳感器節(jié)點從串口發(fā)回的查詢數(shù)據(jù) 并將結(jié)果以圖標的形式顯示出來 串口設定的波特率是 川口每隔 毫秒返回一組數(shù)據(jù)(大約是 字節(jié)左右) 周期(即持續(xù)時間)為 秒 實測的時候在一個周期內(nèi)應該返回 多個字節(jié) 而用事件監(jiān)聽模型我最多只能收到不到 字節(jié) 不知道這些字節(jié)都跑哪里去了 也不清楚到底丟失的是那部分數(shù)據(jù) 值得注意的是 這是我將serialEvent()中所有處理代碼都注掉 只剩下打印代碼所得的結(jié)果 數(shù)據(jù)丟失的如此嚴重是我所不能忍受的 于是我決定采用其他方法

串口讀數(shù)據(jù)的線程模型

這個模型顧名思義 就是將接收數(shù)據(jù)的操作寫成一個線程的形式:

public?void?startReadingDataThread()?{ Thread?readDataProcess?=?new?Thread(new?Runnable()?{ public?void?run()?{ while?(newData?!=? )?{ try?{ newData?=?is read(); System out println(newData); //其他的處理過程 ……… }?catch?(IOException?ex)?{ System err println(ex); return; } } readDataProcess start(); }

在我的應用程序中 我將收到的數(shù)據(jù)打包放到一個緩存中 然后啟動另一個線程從緩存中獲取并處理數(shù)據(jù) 兩個線程以生產(chǎn)者—消費者模式協(xié)同工作 數(shù)據(jù)的流向如下圖所示

這樣 我就圓滿解決了丟數(shù)據(jù)問題 然而 沒高興多久我就又發(fā)現(xiàn)了一個同樣嚴重的問題 雖然這回不再丟數(shù)據(jù)了 可是原本一個周期( 秒)之后 傳感器節(jié)電已經(jīng)停止傳送數(shù)據(jù)了 但我的串口線程依然在努力的執(zhí)行讀串口操作 在控制臺也可以看見收到的數(shù)據(jù)仍在不斷的打印 原來 由于傳感器節(jié)點發(fā)送的數(shù)據(jù)過快 而我的接收線程處理不過來 所以InputStream就先把已到達卻還沒處理的字節(jié)緩存起來 于是就導致了明明傳感器節(jié)點已經(jīng)不再發(fā)數(shù)據(jù)了 而控制臺卻還能看見數(shù)據(jù)不斷打印這一奇怪的現(xiàn)象 唯一值得慶幸的是最后收到數(shù)據(jù)確實是 左右字節(jié) 沒出現(xiàn)丟失現(xiàn)象 然而當處理完最后一個數(shù)據(jù)的時候已經(jīng)快 分半鐘了 這個時間遠遠大于節(jié)點運行周期 這一延遲對于一個實時的顯示系統(tǒng)來說簡直是災難!

后來我想 是不是由于兩個線程之間的同步和通信導致了數(shù)據(jù)接收緩慢呢?于是我在接收線程的代碼中去掉了所有處理代碼 僅保留打印收到數(shù)據(jù)的語句 結(jié)果依然如故 看來并不是線程間的通信阻礙了數(shù)據(jù)的接收速度 而是用線程模型導致了對于發(fā)送端數(shù)據(jù)發(fā)送速率過快的情況下的數(shù)據(jù)接收延遲 這里申明一點 就是對于數(shù)據(jù)發(fā)送速率不是如此快的情況下前面者兩種模型應該還是好用的 只是特殊情況還是應該特殊處理

第三種方法

痛苦了許久(Boss天天催我L)之后 偶然的機會 我聽說TinyOS中(又是開源的)有一部分是和我的應用程序類似的串口通信部分 于是我下載了它的 x版的Java代碼部分 參考了它的處理方法 解決問題的方法說穿了其實很簡單 就是從根源入手 根源不就是接收線程導致的嗎 那好 我就干脆取消接收線程和作為中介的共享緩存 而直接在處理線程中調(diào)用串口讀數(shù)據(jù)的方法來解決問題(什么 為什么不把處理線程也一并取消? 都取消應用程序界面不就鎖死了嗎?所以必須保留)于是程序變成了這樣

public?byte[]?getPack(){ while?(true)?{ //?PacketLength為數(shù)據(jù)包長度 byte[]?msgPack?=?new?byte[PacketLength]; for(int?i?=? ;?i??PacketLength;?i++){ if(?(newData?=?is read())?!=? ){ msgPack[i]?=?(byte)?newData; System out println(msgPack[i]); } } return?msgPack; } }

在處理線程中調(diào)用這個方法返回所需要的數(shù)據(jù)序列并處理之 這樣不但沒有丟失數(shù)據(jù)的現(xiàn)象行出現(xiàn) 也沒有數(shù)據(jù)接收延遲了 這里唯一需要注意的就是當串口停止發(fā)送數(shù)據(jù)或沒有數(shù)據(jù)的時候is read()一直都返回 如果一旦在開始接收數(shù)據(jù)的時候發(fā)現(xiàn) 就不要理它 繼續(xù)接收 直到收到真正的數(shù)據(jù)為止

結(jié)束語

lishixinzhi/Article/program/Java/hx/201311/26605

求VBS JAVA 等簡單易懂的操作串口(com口)的代碼,

Comm.Output=字符串或byte

如果是可見字符,則可以直接輸出字符串,如Comm.Output="hello"

不然得用byte(數(shù)組),如

Comm.CommPort = 3 '...使用Com3口

Comm.Settings = "57600,n,8,1" '對串口通訊的相關(guān)參數(shù)。包括串口通訊的比特率,奇偶校驗,數(shù)據(jù)位長度、停止位等。其默認值 是“9600,N,8,1”,表示串口比特率是9600bit/s,不作奇偶校驗,8位數(shù)據(jù)位,1個停止位。

Comm.OutBufferSize = 1024

If Comm.PortOpen = False Then

Comm.PortOpen = True '...打開串口

End If

Comm.OutBufferCount = 0 '...清空輸出寄存器

Dim buffer(6) as Byte

buffer(0) = 255

buffer(1) = 1

buffer(2) = 0

buffer(3) = 0

buffer(4) = 0

buffer(5) = 0

buffer(6) = 1

Comm.Output = buffer

Comm.PortOpen = False

上面確實是VB的代碼。

在VBS中,沒有類型,所以聲明數(shù)組與初始化可能為:

Dim buffer(6)

buffer(0) = CByte(255)

...

我沒試過,不一定正確喲。

求C++或C#或java,串口通信代碼!?。?/h2>

我有,我之前就是做串口通信的,SerialPort

using system.io.port;

SerialPort port = new SerialPort();

string []portName = SerialPort.GetPortName();//獲取串口名數(shù)組

port.PortName = portName[0];

//在這里添加設置串口的一些屬性,例如波特率等等

if(!port.IsOpen)

{

try{

port.Open();

}catch(Exception e)

{

MessageBox.Show(e.Message);

}

}

界面部分我到時再發(fā)給你

java如何從串口讀取數(shù)據(jù)帶GUI

1.導入支持java串口通信的jar包:

在maven項目的pom.xml中添加RXTXcomm的依賴 或者 下載RXTXcomm.jar并導入到項目中。

支持Java串口通信操作的jar包,java.comm比較老,而且不支持64位系統(tǒng),推薦使用Rxtx這個jar包(32位/64位均支持)。

注意:運行過程中拋出 java.lang.UnsatisfiedLinkError 錯誤或 gnu.io 下的類找不到時,將rxtx解壓包中的 rxtxParallel.dll,rxtxSerial.dll 這兩個文件復制到 C:\Windows\System32 目錄下可解決該錯誤。

2.編寫代碼操作串口:

串口必要參數(shù)類:包含連接串口所必須的參數(shù),方便在調(diào)用串口時設置和傳遞串口參數(shù)。

文章名稱:java串口通信代碼 Java 串口
網(wǎng)址分享:http://muchs.cn/article18/hphcdp.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供動態(tài)網(wǎng)站、靜態(tài)網(wǎng)站、小程序開發(fā)、用戶體驗、軟件開發(fā)標簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設