最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java的串口通信問題

 更新時間:2024年05月13日 09:31:10   作者:雪域的雨  
這篇文章主要介紹了java的串口通信問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

一、實驗?zāi)康?/h2>

(1)了解串口的通信方式。

(2)掌握串口通信的原理,了解串口通信的編程的初步概念和相應(yīng)函數(shù),掌握一個具體開

發(fā)平臺下的串口編程。

二、實驗內(nèi)容

這一部分將是我們的重點,要與串口通信首先要在項目添加RXTXcomm.jar包(放在項目中的lib目錄下,并添加到build Path中);

另外,還需要將解壓后的rxtxParallel.dll和rxtxSerial.dll兩個文件放在%JAVA_HOME%/jre/bin目錄下,這樣該包才能被正常的加載和調(diào)用。

由于筆記本或臺式機上基本上都沒有成對的串口提供給我們調(diào)試使用,我們就需要下載虛擬串口軟件來實現(xiàn)串口調(diào)試。

  • 下載虛擬串口軟件。
  • 打開軟件添加虛擬串口vspd,一般都是成對添加的(添加COM6、COM9)
  • 添加完成后到設(shè)備管理器中查看,發(fā)現(xiàn)多了兩個虛擬串口
  • 下載串口調(diào)試軟件sscom32
  • 可以直接先打開兩個調(diào)試窗口,分別用來表示COM6和COM9串口。兩個串口的參數(shù)一定要設(shè)置的一樣才可以正常的收發(fā)數(shù)據(jù)。(若調(diào)試可以正常收發(fā)數(shù)據(jù)后,可以關(guān)掉一個調(diào)試器,而用java程序代替)

三、實驗結(jié)果及分析

串口通信在很多地方都要用到,特別是嵌入式開發(fā)、短信模塊開發(fā)以及為各種硬件產(chǎn)品定制軟件等都需要用到。

其中最經(jīng)常用的通信協(xié)議為RS-232通信協(xié)議,要想成為真正的串口通信開發(fā)高手就需要全面的了解串口的通信協(xié)議(本人還是菜鳥一枚。。。希望高手指點)。

串口通信的另一個重點在于接收到數(shù)據(jù)后,如何判斷數(shù)據(jù)的類型以及有效數(shù)據(jù)的提取等,這些都需要根據(jù)相應(yīng)的協(xié)議進行代碼編寫。

         

 

四、實驗小結(jié)、問題討論

(1)串口有兩種

1.PC上的COM口

COM口即串行通訊端口。微機上的com口多為9針,最大速率115200bps。

通常用于連接鼠標(biāo)(串口)及通訊設(shè)備(如連接外置式MODEM進行數(shù)據(jù)通訊)等。

但目前主流的主板一般都只帶1個串口,甚至不帶。

機箱后面,梯形的,兩排,一排5個孔,一排4個孔

一般有兩個,就是com1 com2,背板上應(yīng)該都標(biāo)明的

反正要么上12,要么左12

可以轉(zhuǎn)接USB

2.設(shè)備上的Serial口

專為廣域網(wǎng)設(shè)計,它可以做ISDN,PPP,幀中繼等網(wǎng)絡(luò)類型的連接可以接很多網(wǎng)絡(luò)類型,要使用它必須設(shè)置時鐘頻率(DCE、DTE),路由表的算法也在此接口上形成。

以太網(wǎng)口是對局域網(wǎng)內(nèi)的,它只有擁有局域網(wǎng)所需要的所有功能。

沒有廣域網(wǎng)接口所需要的功能,而廣域網(wǎng)串口也沒有局域網(wǎng)以太網(wǎng)口接口的功能,所以兩個接口是不能對調(diào)的。

路由器連接路由器就要用路由器上的Serial端口連接,不過現(xiàn)在的路由器都沒有這些,都用光口代替了。

ethernet口:以太網(wǎng)口,現(xiàn)在可以說是百兆口,交換機間連在一起用的。

以太口(eth)是接RJ45水晶頭的,串口(ser) 是遠(yuǎn)距離連接 使用的!可以是電纜也可以是光纖!

串口是串行口通訊協(xié)議,以太網(wǎng)口是以太網(wǎng)通訊協(xié)議。

2

  • 讀出寄存器數(shù)據(jù)
  • 將讀出的數(shù)據(jù)轉(zhuǎn)換成可計算的數(shù)據(jù)類型(兩個char類型轉(zhuǎn)換成一個short或int或float類型)
  • 根據(jù)公式計算

根據(jù)公式計算

不用union的函數(shù)也可以用sprintf實現(xiàn)

package com.test;


import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.TooManyListenersException;

import gnu.io.CommPortIdentifier;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;

/**
 * @項目名稱 :DSerialPort
 * @文件名稱 :SerialPort.java
 * @所在包 :org.serial
 * @功能描述 : 串口類
 * @修改記錄 :
 */
public class DSerialPort implements Runnable, SerialPortEventListener {

    private String appName = "串口通訊測試";
    private int timeout = 2000;// open 端口時的等待時間
    private int threadTime = 0;

    private CommPortIdentifier commPort;
    private SerialPort serialPort;
    private InputStream inputStream;
    private OutputStream outputStream;

    /**
     * @方法名稱 :listPort
     * @功能描述 :列出所有可用的串口
     * @返回值類型 :void
     */
    @SuppressWarnings("rawtypes")
    public void listPort() {
        CommPortIdentifier cpid;
        Enumeration en = CommPortIdentifier.getPortIdentifiers();

        System.out.println("now to list all Port of this PC:" + en);

        while (en.hasMoreElements()) {
            cpid = (CommPortIdentifier) en.nextElement();
            if (cpid.getPortType() == CommPortIdentifier.PORT_SERIAL) {
                System.out.println(cpid.getName() + ", " + cpid.getCurrentOwner());
            }
        }
    }

    /**
     * @方法名稱 :selectPort
     * @功能描述 :選擇一個端口,比如:COM1
     * @返回值類型 :void
     * @param portName
     */
    @SuppressWarnings("rawtypes")
    public void selectPort(String portName) {

        this.commPort = null;
        CommPortIdentifier cpid;
        Enumeration en = CommPortIdentifier.getPortIdentifiers();

        while (en.hasMoreElements()) {
            cpid = (CommPortIdentifier) en.nextElement();
            if (cpid.getPortType() == CommPortIdentifier.PORT_SERIAL && cpid.getName().equals(portName)) {
                this.commPort = cpid;
                break;
            }
        }

        openPort();
    }

    /**
     * @方法名稱 :openPort
     * @功能描述 :打開SerialPort
     * @返回值類型 :void
     */
    private void openPort() {
        if (commPort == null){
            log(String.format("無法找到名字為'%1$s'的串口!", commPort.getName()));}
        else {
            log("端口選擇成功,當(dāng)前端口:" + commPort.getName() + ",現(xiàn)在實例化 SerialPort:");

            try {
                serialPort = (SerialPort) commPort.open(appName, timeout);
                log("實例 SerialPort 成功!");
            } catch (PortInUseException e) {
                throw new RuntimeException(String.format("端口'%1$s'正在使用中!", commPort.getName()));
            }
        }
    }

    /**
     * @方法名稱 :checkPort
     * @功能描述 :檢查端口是否正確連接
     * @返回值類型 :void
     */
    private void checkPort() {
        if (commPort == null){
            throw new RuntimeException("沒有選擇端口,請使用 " + "selectPort(String portName) 方法選擇端口");}

        if (serialPort == null) {
            throw new RuntimeException("SerialPort 對象無效!");
        }
    }

    /**
     * @方法名稱 :write
     * @功能描述 :向端口發(fā)送數(shù)據(jù),請在調(diào)用此方法前 先選擇端口,并確定SerialPort正常打開!
     * @返回值類型 :void
     * @param message
     */
    public void write(String message) {
        checkPort();

        try {
            outputStream = new BufferedOutputStream(serialPort.getOutputStream());
        } catch (IOException e) {
            throw new RuntimeException("獲取端口的OutputStream出錯:" + e.getMessage());
        }

        try {
            outputStream.write(message.getBytes("GBK"), 0, message.getBytes("GBK").length);
            //outputStream.write(message.getBytes());
            log("信息發(fā)送成功:"+new String(message.getBytes()));
        } catch (IOException e) {
            throw new RuntimeException("向端口發(fā)送信息時出錯:" + e.getMessage());
        } finally {
            try {
                outputStream.close();
            } catch (Exception e) {
            }
        }
    }

    /**
     * @方法名稱 :startRead
     * @功能描述 :開始監(jiān)聽從端口中接收的數(shù)據(jù)
     * @返回值類型 :void
     * @param time
     *            監(jiān)聽程序的存活時間,單位為秒,0 則是一直監(jiān)聽
     */
    public void startRead(int time) {
        checkPort();

        try {
            inputStream = new BufferedInputStream(serialPort.getInputStream());
        } catch (IOException e) {
            throw new RuntimeException("獲取端口的InputStream出錯:" + e.getMessage());
        }

        try {
            serialPort.addEventListener(this);
        } catch (TooManyListenersException e) {
            throw new RuntimeException(e.getMessage());
        }

        serialPort.notifyOnDataAvailable(true);

        log(String.format("開始監(jiān)聽來自'%1$s'的數(shù)據(jù)--------------", commPort.getName()));
        if (time > 0) {
            this.threadTime = time * 1000;
            Thread t = new Thread(this);
            t.start();
            log(String.format("監(jiān)聽程序?qū)⒃?1$d秒后關(guān)閉。。。。", threadTime));
        }
    }

    /**
     * @方法名稱 :close
     * @功能描述 :關(guān)閉 SerialPort
     * @返回值類型 :void
     */
    public void close() {
        serialPort.close();
        serialPort = null;
        commPort = null;
    }

    public void log(String msg) {
        System.out.println(appName + " --> " + msg);
    }

    /**
     * 數(shù)據(jù)接收的監(jiān)聽處理函數(shù)
     */
    @Override
    public void serialEvent(SerialPortEvent arg0) {
        switch (arg0.getEventType()) {
            case SerialPortEvent.BI:/* Break interrupt,通訊中斷 */
            case SerialPortEvent.OE:/* Overrun error,溢位錯誤 */
            case SerialPortEvent.FE:/* Framing error,傳幀錯誤 */
            case SerialPortEvent.PE:/* Parity error,校驗錯誤 */
            case SerialPortEvent.CD:/* Carrier detect,載波檢測 */
            case SerialPortEvent.CTS:/* Clear to send,清除發(fā)送 */
            case SerialPortEvent.DSR:/* Data set ready,數(shù)據(jù)設(shè)備就緒 */
            case SerialPortEvent.RI:/* Ring indicator,響鈴指示 */
            case SerialPortEvent.OUTPUT_BUFFER_EMPTY:/*
             * Output buffer is
             * empty,輸出緩沖區(qū)清空
             */
                break;
            case SerialPortEvent.DATA_AVAILABLE:/*
             * Data available at the serial
             * port,端口有可用數(shù)據(jù)。讀到緩沖數(shù)組,輸出到終端
             */
                byte[] readBuffer = new byte[1024];
                String readStr = "";
                String s2 = "";

                try {

                    while (inputStream.available() > 0) {
                        inputStream.read(readBuffer);
                        readStr += new String(readBuffer).trim();
                    }

                    s2 = new String(readBuffer).trim();

                    log("接收到端口返回數(shù)據(jù)(長度為" + readStr.length() + "):" + readStr);
                    log(s2);
                } catch (IOException e) {
                }
        }
    }

    @Override
    public void run() {
        try {
            Thread.sleep(threadTime);
            serialPort.close();
            log(String.format("端口''監(jiān)聽關(guān)閉了!", commPort.getName()));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        DSerialPort dp = new DSerialPort();
        dp.listPort();
        dp.selectPort("COM6");
        dp.write("tdgfg!");
        dp.startRead(30);


    }

}

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java設(shè)計模式之策略模式_動力節(jié)點Java學(xué)院整理

    Java設(shè)計模式之策略模式_動力節(jié)點Java學(xué)院整理

    策略模式是對算法的封裝,把一系列的算法分別封裝到對應(yīng)的類中,并且這些類實現(xiàn)相同的接口,相互之間可以替換。接下來通過本文給大家分享Java設(shè)計模式之策略模式,感興趣的朋友一起看看吧
    2017-08-08
  • 關(guān)于MyBatis plus條件構(gòu)造器的逐條詳解

    關(guān)于MyBatis plus條件構(gòu)造器的逐條詳解

    什么是條件構(gòu)造器呢?簡單來說,條件構(gòu)造器就是用來生成我們查數(shù)據(jù)庫的sql。它可以簡化sql代碼的編寫,靈活、方便且易于維護
    2021-09-09
  • 淺談Arrays.asList()方法的使用

    淺談Arrays.asList()方法的使用

    本文主要介紹了Arrays.asList()方法的使用。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • JavaWeb評論功能實現(xiàn)步驟以及代碼實例

    JavaWeb評論功能實現(xiàn)步驟以及代碼實例

    項目初始版本上線,有時間寫點東西記錄一下項目中的心得體會,通過這個項目學(xué)習(xí)了很多,要寫下來的有很多,先從評論功能開始吧,下面這篇文章主要給大家介紹了關(guān)于JavaWeb評論功能實現(xiàn)步驟以及代碼的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • 一文徹底弄懂Java中HashMap的原理

    一文徹底弄懂Java中HashMap的原理

    HashMap是基于Map接口的非同步實現(xiàn),線程不安全,是為了快速存取而設(shè)計的,這篇文章主要介紹了Java中HashMap原理的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-01-01
  • MyBatis一對一級聯(lián)更新問題小結(jié)

    MyBatis一對一級聯(lián)更新問題小結(jié)

    日常工作中經(jīng)常會涉及到一對一級聯(lián)更新的問題,本文主要介紹了MyBatis一對一級聯(lián)更新問題小結(jié),具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • Java類變量和成員變量初始化過程的應(yīng)用介紹

    Java類變量和成員變量初始化過程的應(yīng)用介紹

    昨天看了一本叫做《突破程序員基本功的16課》的書,個人感覺還可以,主要對Java的技巧進行了一些深入的講解,讓我對類的初始化和對象的創(chuàng)建有了新的認(rèn)識
    2013-04-04
  • Java反射機制詳解

    Java反射機制詳解

    Java的反射機制是在運行狀態(tài)中,對于任何一個類,都可以知道這個類的所有屬性和方法,對于任何一個對象,都可以調(diào)用它所有的方法和屬性,修改部分類型信息。本文就來詳細(xì)講講Java反射機制的使用
    2022-07-07
  • springboot+jwt+springSecurity微信小程序授權(quán)登錄問題

    springboot+jwt+springSecurity微信小程序授權(quán)登錄問題

    這篇文章主要介紹了springboot+jwt+springSecurity微信小程序授權(quán)登錄問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • SpringMVC的Body參數(shù)攔截的問題

    SpringMVC的Body參數(shù)攔截的問題

    SpringMVC對出參和入?yún)⒂蟹浅S押玫耐卣怪С?方便你對數(shù)據(jù)的輸入和輸出有更大的執(zhí)行權(quán),我們?nèi)绾瓮ㄟ^SpringMVC定義的結(jié)果做一系列處理呢,需要的朋友可以參考下
    2018-06-06

最新評論

山阳县| 焦作市| 尼玛县| 正镶白旗| 吉木萨尔县| 浦城县| 云安县| 龙川县| 穆棱市| 绥芬河市| 罗山县| 福泉市| 乡城县| 洞口县| 栾川县| 监利县| 芒康县| 浦县| 偃师市| 济源市| 民和| 乐东| 土默特右旗| 崇仁县| 曲阳县| 玛曲县| 布拖县| 沧州市| 大竹县| 志丹县| 景东| 霞浦县| 罗甸县| 凤翔县| 兴海县| 鄂尔多斯市| 谢通门县| 鸡西市| 登封市| 武强县| 连城县|