《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 設(shè)計應(yīng)用 > 基于Java的串口通信應(yīng)用編程
基于Java的串口通信應(yīng)用編程
來源:微型機與應(yīng)用2012年第13期
丁振凡1,王小明1,鄧建明2,周 斌2
(1.華東交通大學(xué),江西 南昌 330013;2.南昌鐵路局,江西 南昌 330001)
摘要: 介紹了Java實現(xiàn)串口通信編程的技術(shù)處理。著重就串口通信的連接、數(shù)據(jù)緩沖區(qū)資源的多線程訪問控制以及數(shù)據(jù)讀取中的超時控制等問題進行了詳細討論,有效地實現(xiàn)了主機與下位單片機之間的數(shù)據(jù)傳遞。該通信方式已用于基于工控機的絕緣電阻檢測應(yīng)用中。
關(guān)鍵詞: 軟件 JAVA 串口通信 多線程 comm包
Abstract:
Key words :

摘  要: 介紹了Java實現(xiàn)串口通信編程的技術(shù)處理。著重就串口通信的連接、數(shù)據(jù)緩沖區(qū)資源的多線程訪問控制以及數(shù)據(jù)讀取中的超時控制等問題進行了詳細討論,有效地實現(xiàn)了主機與下位單片機之間的數(shù)據(jù)傳遞。該通信方式已用于基于工控機的絕緣電阻檢測應(yīng)用中。
關(guān)鍵詞: Java;串口通信;多線程;comm包

 嵌入式系統(tǒng)或傳感器網(wǎng)絡(luò)的很多應(yīng)用都需要通過PC機與嵌入式設(shè)備或傳感器節(jié)點進行通信。其中,最常用的接口就是RS-232串口。串口通信可以是上位機與下位機之間的直接串口通信,也可以是在串口上連接無線通信模塊,通過串口進行無線通信。RS-232-C是在1970年由美國電子工業(yè)協(xié)會(EIA)聯(lián)合貝爾系統(tǒng)、調(diào)制解調(diào)器廠家及計算機終端生產(chǎn)廠家共同制定的用于串行通信的標(biāo)準(zhǔn)。RS-232是一個全雙工的通信協(xié)議,它可以同時進行數(shù)據(jù)接收和發(fā)送的工作。
 Java實現(xiàn)串口通信的編程方式通常采用SUN發(fā)布的串口通信API,它是以獨立jar包形式提供的一個標(biāo)準(zhǔn)擴展。其中包含3個文件:comm.jar提供了通信用的java API;win32com.dll提供了串口通信的本地驅(qū)動接口;javax.comm.properties是這個驅(qū)動的類配置文件。Java讀寫串口過程主要是調(diào)用javax.comm包中的API函數(shù)。在javax.comm包中,串口的讀寫操作是數(shù)據(jù)流形式,串口初始化后,通過CommPort類的getInputStream()和getOutputStream()方法即可分別取得端口的輸入流和輸出流。
 串口通信應(yīng)用程序有兩種模式:一種是實現(xiàn)SerialPortEventListener接口,通過監(jiān)聽串口事件并作相應(yīng)處理;另一種就是建立一個獨立的接收線程負責(zé)數(shù)據(jù)的接收。本文采用的是后一種方式。
 本文的串口通信是上位工控機與下位單片機之間的通信。工控機通過觸摸屏方式來使用系統(tǒng),下位單片機連接絕緣檢測筆實現(xiàn)絕緣電阻的檢測,并將檢測過程的結(jié)果發(fā)送給上位機。本文僅介紹主機方的Java串口通信編程處理技術(shù),如圖1所示的虛線上方部分,包含消息接收線程、Swing事件驅(qū)動應(yīng)用界面、消息緩沖區(qū)、消息分析處理程序。其中:①在圖形應(yīng)用界面中通過用戶的操作來觸發(fā)事件實現(xiàn)與單片機的通信;②主機通過串口向單片機發(fā)送啟動檢測的消息;③單片機在收到消息后,將啟動檢測,并將傳感器獲取的數(shù)據(jù)通過串口發(fā)送給主機作為響應(yīng);④數(shù)據(jù)接收線程將收到的數(shù)據(jù)放到一個緩存中;⑤消息分析處理程序從緩存中獲取數(shù)據(jù)并進行分析處理。主機和單片機間每次通信傳送1 B。


1 串口緩沖區(qū)的控制
 串口緩沖區(qū)(SerialBuffer類)實現(xiàn)從串口接收到的一個完整消息的封裝,本系統(tǒng)的消息按協(xié)議設(shè)計為11 B,其中包含消息的起始標(biāo)記、識別標(biāo)識和數(shù)據(jù)字節(jié)。消息緩沖區(qū)是消息接收線程和消息分析處理Bean之間的橋梁,只有在接收到一條完整的消息后才可以進行消息的分析解析。串口緩沖區(qū)安排有3個重要屬性:
 (1)Content屬性:存放11 B的消息;
 (2)Available屬性:標(biāo)識消息是否可用;
 (3)LengthNeeded屬性:統(tǒng)計收到的消息字節(jié)長度。
該類還定義了兩個重要方法:(1)public synchronized byte[] GetMsg():從緩沖區(qū)讀取消息;(2)public synchronized void putbyte(int c):寫一個字節(jié)到緩沖區(qū)。方法定義中均含有synchronized關(guān)鍵詞,也就是要使用這兩個方法必須取得緩沖區(qū)的對象鎖,從而實現(xiàn)對緩沖區(qū)這個共享資源的訪問互斥操作。
2 消息接收線程
 消息接收線程(ReadSerial類)循環(huán)從串口讀取數(shù)據(jù)并將其存放到消息緩沖區(qū)中,串口無數(shù)據(jù)或緩沖區(qū)滿時它將處于資源等待狀態(tài)。以下為線程的run方法代碼:
    public void run() {
        try  {
            while (true)  {
               int c = ComPort.read();      
//從串口讀1 B
               ComBuffer.putbyte(c);       
 //將數(shù)據(jù)放入消息緩沖區(qū)
            }
        } catch (IOException e) { }
    }
3 消息分析處理Bean
 消息分析處理Bean(SerialBean類)是Swing界面處理程序?qū)Υ谶M行操作訪問的調(diào)用接口。其中封裝有3個方法:Initialize方法實現(xiàn)串口的初始化;ReadPort()方法從消息緩沖區(qū)讀消息并進行分析;WritePort(byte[] Msg)方法寫消息到串口。串口初始化只執(zhí)行1次,包括如下工作:
 (1)打開串口
portId=CommPortIdentifier.getPortIdentifier(串口名);
serialPort=(SerialPort)portId.open(“串口所有者名稱”,超時等待時間);
 (2)獲取串口的輸入/輸出流
in=serialPort.getInputStream();
out=serialPort.getOutputStream();
 (3)設(shè)置串口參數(shù)
serialPort.setSerialPortParams(9 600,SerialPort.
DATABITS_8,
SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
 (4)創(chuàng)建消息緩沖區(qū)對象
SB=new SerialBuffer();
 (5)創(chuàng)建并啟動消息接受線程
RT=new ReadSerial(SB, in);
RT.start();  
4 串口通信驅(qū)動程序的裝載
 串口驅(qū)動程序的裝載是實現(xiàn)串口初始化的前提,如果程序在Spring STS開發(fā)環(huán)境中運行,會從JDK的運行環(huán)境裝載驅(qū)動程序。這種情況下,必須事先將comm.jar拷貝到JDK安裝目錄的jre\lib\ext 目錄下,將win32com.dll 拷貝到JDK安裝目錄的jre\bin目錄下,將javax.comm.properties拷貝到JDK安裝目錄的jre\lib目錄[2]下。
 如果將開發(fā)的應(yīng)用導(dǎo)出為獨立的可運行的JAR文件,則必須將以上的3個文件安排到應(yīng)用工程的src所在目錄路徑下,并在程序中用如下程序代碼進行裝載。
Import javax.comm.CommDriver;
import javax.swing.JOptionPane;
public class CurrentStatus {
    public static SerialBean SB ;  //消息分析處理Bean
    public static void init(int n){   //n為串口編號
        String driverName=“com.sun.comm.Win32Driver”;
        CommDriver driver=null;
        try   {
            System.loadLibrary(“win32com”);  //裝載DLL
            driver=(CommDriver)Class.forName
            (driverName).newInstance();
        } 
        catch(Exception e1){ e1.printStackTrace();} 
        driver.initialize(); //驅(qū)動程序初始化
        SB=new SerialBean(n); 
        if (SB.Initialize()==-1)
            JOptionPane.showMessageDialog(null,”串口初始
化錯誤”);
    }
}
 這樣,在程序中可通過執(zhí)行init方法實現(xiàn)具體串口的通信初始化。例如:
 CurrentStatus.init(1);  //初始化串口1
5 在圖形界面中實現(xiàn)通信調(diào)用
 在電氣設(shè)備的絕緣電阻檢測應(yīng)用中,圖2為應(yīng)用界面。當(dāng)用戶點擊某個檢測項對應(yīng)的按鈕時,通過注冊按鈕點擊事件觸發(fā)執(zhí)行代碼,將通過消息分析處理Bean的WritePort方法給串口發(fā)送檢測命令,并利用循環(huán)等待讀取來自單片機的檢測結(jié)果。由于單片機在檢測過程中將發(fā)送系列檢測結(jié)果,因此,要循環(huán)讀取數(shù)據(jù),直到超過一定時間無數(shù)據(jù)可讀或接收到結(jié)束標(biāo)志的消息為止。具體工作過程如圖3所示。其中,數(shù)據(jù)庫的訪問處理采用Spring的JdbcTemplate類提供的功能實現(xiàn)。

 

 

 本文介紹了Java實現(xiàn)串口通信編程的典型編程處理要點,可有效地實現(xiàn)上位工控機與單片機之間的數(shù)據(jù)通信。系統(tǒng)通過多線程及對消息緩沖區(qū)資源的訪問控制、延時等待控制等措施,保證了上下位機之間通信的可靠傳遞。實際應(yīng)用中要根據(jù)具體的消息格式來組織通信過程中數(shù)據(jù)的分析處理。
參考文獻
[1] 吳金鋒,劉偉平,黃紅斌.Java串口通信數(shù)據(jù)采控系統(tǒng)的設(shè)計與實現(xiàn)[J].微計算機信息,2010(10).
[2] 唐未香.Java程序與ZigBee串口通訊的實現(xiàn)[J].福建電腦,2010(5).

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
一区二区高清在线| 久久九九有精品国产23| 亚洲欧美日产图| 亚洲精品一区二区在线观看| 激情五月***国产精品| 国产深夜精品| 国产精品综合av一区二区国产馆| 国产精品高精视频免费| 欧美日韩专区| 欧美偷拍一区二区| 欧美视频精品一区| 欧美视频第二页| 欧美午夜免费影院| 国产精品每日更新在线播放网址| 欧美性淫爽ww久久久久无| 欧美性感一类影片在线播放| 欧美午夜激情小视频| 欧美色欧美亚洲另类七区| 欧美先锋影音| 国产精品乱码一区二区三区| 国产精品久久久一区麻豆最新章节| 欧美视频亚洲视频| 欧美特黄a级高清免费大片a级| 欧美日韩在线播放一区| 国产精品v日韩精品| 国产精品久久久久久亚洲毛片 | 亚洲国产一区二区精品专区| 亚洲人被黑人高潮完整版| 亚洲精品日韩久久| aⅴ色国产欧美| 亚洲欧美日韩国产另类专区| 欧美在线1区| 91久久久久久国产精品| 日韩视频在线你懂得| 在线性视频日韩欧美| 亚洲女爱视频在线| 久久久久久久久久久久久久一区| 久久综合色婷婷| 欧美另类女人| 国产精品尤物| 在线欧美三区| 亚洲精品乱码久久久久久蜜桃麻豆 | 亚洲高清精品中出| 99国产麻豆精品| 亚洲欧美高清| 久久免费国产| 欧美护士18xxxxhd| 国产精品日日摸夜夜摸av| 一区二区三区中文在线观看| 亚洲精品久久久久久一区二区| 亚洲系列中文字幕| 亚洲电影自拍| 一区二区欧美日韩视频| 欧美一区二区三区视频免费播放 | 欧美国产精品久久| 欧美午夜激情视频| 国内精品伊人久久久久av一坑| 91久久在线| 亚洲欧美日韩中文视频| 91久久久久久| 新片速递亚洲合集欧美合集| 久久只有精品| 国产精品久久九九| 1000部精品久久久久久久久| 亚洲特级毛片| 亚洲欧洲日本国产| 欧美一级成年大片在线观看| 欧美高清视频一区二区三区在线观看| 国产精品videossex久久发布| 好吊一区二区三区| 99在线视频精品| 亚洲国产精品成人久久综合一区| 亚洲私人影院在线观看| 久久青草久久| 国产精品久久久久一区二区三区| 一区国产精品| 亚洲一区二区三区中文字幕| 亚洲精品资源美女情侣酒店| 欧美一区二区在线免费播放| 欧美日本国产| 精品成人一区二区三区| 亚洲免费一在线| 在线一区二区三区四区| 美女脱光内衣内裤视频久久影院 | 亚洲欧洲精品一区二区三区波多野1战4 | 亚洲国产精品t66y| 午夜精品视频在线| 一区二区三区视频在线观看| 久久综合一区二区三区| 国产欧美精品xxxx另类| 99视频精品全部免费在线| 亚洲国产一区二区a毛片| 欧美在线播放高清精品| 国产精品多人| 日韩午夜激情| 亚洲精品社区| 另类综合日韩欧美亚洲| 国产情侣久久| 亚洲私人影院| 亚洲午夜女主播在线直播| 欧美激情小视频| 在线播放精品| 久久大逼视频| 久久久久国产精品www| 国产欧美日韩视频在线观看| 亚洲视频免费在线观看| 在线综合视频| 欧美日韩一区成人| 亚洲美女视频在线观看| 99精品国产在热久久婷婷| 欧美chengren| 亚洲福利国产精品| 亚洲国产裸拍裸体视频在线观看乱了 | 欧美日韩精品久久久| 亚洲国产老妈| 最新中文字幕亚洲| 久热精品视频在线观看| 激情欧美丁香| 亚洲国产小视频在线观看| 久久综合色综合88| 红桃视频亚洲| 亚洲福利av| 麻豆精品一区二区综合av| 激情小说另类小说亚洲欧美| 久久精品国产成人| 久久综合婷婷| 亚洲激情精品| 一区二区三区成人精品| 欧美日韩一级片在线观看| aⅴ色国产欧美| 亚洲一区二区三区免费在线观看 | 国产日韩精品久久久| 午夜在线电影亚洲一区| 久久精品亚洲一区二区三区浴池| 国产亚洲欧美日韩美女| 久久狠狠亚洲综合| 免费欧美日韩国产三级电影| 91久久嫩草影院一区二区| 一区二区日韩免费看| 国产精品v欧美精品v日韩精品| 亚洲视频中文| 久久疯狂做爰流白浆xx| 精品动漫3d一区二区三区| 亚洲欧洲精品一区二区三区不卡| 欧美高清视频在线观看| 99国产精品自拍| 亚洲欧美怡红院| 国产亚洲电影| 亚洲日本成人| 欧美午夜激情在线| 午夜在线精品偷拍| 免费日韩成人| 日韩视频免费在线观看| 亚洲欧美亚洲| 国产综合在线看| 亚洲人成网站在线观看播放| 欧美日韩免费观看一区=区三区| 亚洲一区日韩在线| 久久一综合视频| 亚洲精品少妇| 欧美影院在线| 亚洲人成人77777线观看| 亚洲欧美日韩在线不卡| 国产专区综合网| 一区二区欧美精品| 国产亚洲日本欧美韩国| 亚洲精品一区二区三区av| 国产精品卡一卡二卡三| 亚洲第一在线| 欧美日在线观看| 久久精品国产清自在天天线| 欧美日韩亚洲91| 欧美综合第一页| 欧美色精品天天在线观看视频 | 亚洲午夜一区二区三区| 久久亚洲欧美| 一区二区91| 免费亚洲视频| 亚洲专区在线视频| 欧美国产一区视频在线观看 | 艳妇臀荡乳欲伦亚洲一区| 国产日韩久久| 9人人澡人人爽人人精品| 国产亚洲视频在线观看| 中文精品视频| 韩日精品在线| 亚洲自拍偷拍网址| 亚洲高清av| 久久国产精品99久久久久久老狼| 亚洲国产mv| 久久久91精品国产一区二区三区| 亚洲狼人精品一区二区三区| 久久国产成人| 亚洲视频一二| 欧美激情中文字幕乱码免费| 欧美在线观看视频一区二区| 国产精品成人免费视频| 亚洲精品老司机| 黄色成人av| 久久成人免费|