真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

串口通信代碼Java 串口通信代碼C語(yǔ)言

編程技巧:Java串口通信簡(jiǎn)介

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

博州網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、響應(yīng)式網(wǎng)站開(kāi)發(fā)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)公司公司2013年成立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司。

常見(jiàn)的Java串口包

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

串口包的安裝(Windows下)

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

按照其使用說(shuō)明(l)的說(shuō)法 要想使用串口包進(jìn)行串口通信 除了設(shè)置好環(huán)境變量之外 還要將win dll復(fù)制到 \bin目錄下;將m jar復(fù)制到 \lib;把m properties也同樣拷貝到 \lib目錄下 然而在真正運(yùn)行使用串口包的時(shí)候 僅作這些是不夠的 因?yàn)橥ǔ.?dāng)運(yùn)行 java MyApp 的時(shí)候 是由JRE下的虛擬機(jī)啟動(dòng)MyApp的 而我們只復(fù)制上述文件到JDK相應(yīng)目錄下 所以應(yīng)用程序?qū)?huì)提示找不到串口 解決這個(gè)問(wèn)題的方法很簡(jiǎn)單 我們只須將上面提到的文件放到JRE相應(yīng)的目錄下就可以了

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

串口API概覽

m CommPort

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

m CommPortIdentifier

這個(gè)類主要用于對(duì)串口進(jìn)行管理和設(shè)置 是對(duì)串口進(jìn)行訪問(wèn)控制的核心類 主要包括以下方法

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

l 為IO操作打開(kāi)通信端口

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

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

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

m SerialPort

這個(gè)類用于描述一個(gè)RS 串行通信端口的底層接口 它定義了串口通信所需的最小功能集 通過(guò)它 用戶可以直接對(duì)串口進(jìn)行讀 寫(xiě)及設(shè)置工作

串口API實(shí)例

大段的文字怎么也不如一個(gè)小例子來(lái)的清晰 下面我們就一起看一下串口包自帶的例子 SerialDemo中的一小段代碼來(lái)加深對(duì)串口API核心類的使用方法的認(rèn)識(shí)

列舉出本機(jī)所有可用串口

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()); }

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

串口參數(shù)的配置

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

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

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

串口的讀寫(xiě)

對(duì)串口讀寫(xiě)之前需要先打開(kāi)一個(gè)串口

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

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

這里要注意的是 由于Java語(yǔ)言沒(méi)有無(wú)符號(hào)類型 即所有的類型都是帶符號(hào)的 在由byte到int的時(shí)候應(yīng)該尤其注意 因?yàn)槿绻鸼yte的最高位是 則轉(zhuǎn)成int類型時(shí)將用 來(lái)占位 這樣 原本是 的byte類型的數(shù)變成int型就成了 這是很嚴(yán)重的問(wèn)題 應(yīng)該注意避免

串口通信的通用模式及其問(wèn)題

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

事件監(jiān)聽(tīng)模型

現(xiàn)在我們來(lái)看看事件監(jiān)聽(tīng)模型是如何運(yùn)作的

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

l 在初始化時(shí)加入如下代碼

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

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

BI 通訊中斷

CD 載波檢測(cè)

CTS 清除發(fā)送

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

DSR 數(shù)據(jù)設(shè)備準(zhǔn)備好

FE 幀錯(cuò)誤

OE 溢位錯(cuò)誤

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

PE 奇偶校驗(yàn)錯(cuò)

RI  振鈴指示

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

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

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

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

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

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

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

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

第三種方法

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

public?byte[]?getPack(){ while?(true)?{ //?PacketLength為數(shù)據(jù)包長(zhǎng)度 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)用這個(gè)方法返回所需要的數(shù)據(jù)序列并處理之 這樣不但沒(méi)有丟失數(shù)據(jù)的現(xiàn)象行出現(xiàn) 也沒(méi)有數(shù)據(jù)接收延遲了 這里唯一需要注意的就是當(dāng)串口停止發(fā)送數(shù)據(jù)或沒(méi)有數(shù)據(jù)的時(shí)候is read()一直都返回 如果一旦在開(kāi)始接收數(shù)據(jù)的時(shí)候發(fā)現(xiàn) 就不要理它 繼續(xù)接收 直到收到真正的數(shù)據(jù)為止

結(jié)束語(yǔ)

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

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

1.導(dǎo)入支持java串口通信的jar包:

在maven項(xiàng)目的pom.xml中添加RXTXcomm的依賴 或者 下載RXTXcomm.jar并導(dǎo)入到項(xiàng)目中。

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

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

2.編寫(xiě)代碼操作串口:

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

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

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

using system.io.port;

SerialPort port = new SerialPort();

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

port.PortName = portName[0];

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

if(!port.IsOpen)

{

try{

port.Open();

}catch(Exception e)

{

MessageBox.Show(e.Message);

}

}

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

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

方法如下:

新建eclipse工程,添加comm.jar或者RXTXcomm.jar包。因?yàn)閖avacomm20-win32.zip包里有樣例SimpleRead.java,可以通過(guò)這個(gè)例子測(cè)試串口是否正確。

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

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

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

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

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

java優(yōu)點(diǎn):

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

平臺(tái)無(wú)關(guān)性 (一次編譯,到處運(yùn)行;Write Once,Run Anywhere);

java提供了許多內(nèi)置的類庫(kù),通過(guò)這些類庫(kù),簡(jiǎn)化了開(kāi)發(fā)人員的設(shè)計(jì)工作,同時(shí)縮短了項(xiàng)目開(kāi)發(fā)時(shí)間;

提供了對(duì)Web應(yīng)用開(kāi)發(fā)的支持,例如,Applet,Servlet,和JSP可以用來(lái)開(kāi)發(fā)Web應(yīng)用程序,,Socket,RMI可以用來(lái)開(kāi)發(fā)分布式應(yīng)用程序的類庫(kù);

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


文章題目:串口通信代碼Java 串口通信代碼C語(yǔ)言
轉(zhuǎn)載來(lái)于:http://weahome.cn/article/ddegeeh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部