1. 如何用RXTX開源包實現串口通信

最近了解到的需求是需要需激光打刻機進行(RS232)串口通信,這里使用的是RXTX開源包實現的。 之前並沒有用java做過串口通信,而且這方面資料不是很多。 項目實際應用中可能會採用VB開發 只不過用java嘗試一下,記個筆記,希望可以對相關開發用些幫助。 下面是實現代碼 Java代碼 package test; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.util.Date; 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; import gnu.io.; public class CommUtil implements SerialPortEventListener { InputStream inputStream; // 從串口來的輸入流 OutputStream outputStream;// 向串口輸出的流 SerialPort serialPort; // 串口的引用 CommPortIdentifier portId; public CommUtil(Enumeration portList, String name) { while (portList.hasMoreElements()) { CommPortIdentifier temp = (CommPortIdentifier) portList.nextElement(); if (temp.getPortType() == CommPortIdentifier.PORT_SERIAL) {// 判斷如果埠類型是串口 if (temp.getName().equals(name)) { // 判斷如果埠已經啟動就連接 portId = temp; } } } try { serialPort = (SerialPort) portId.open("My"+name, 2000); } catch (PortInUseException e) { } try { inputStream = serialPort.getInputStream(); outputStream = serialPort.getOutputStream(); } catch (IOException e) { } try { serialPort.addEventListener(this); // 給當前串口天加一個監聽器 } catch (TooManyListenersException e) { } serialPort.notifyOnDataAvailable(true); // 當有數據時通知 try { serialPort.setSerialPortParams(2400, SerialPort.DATABITS_8, // 設置串口讀寫參數 SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); } catch ( e) { } } public void serialEvent(SerialPortEvent event) { switch (event.getEventType()) { case SerialPortEvent.BI: case SerialPortEvent.OE: case SerialPortEvent.FE: case SerialPortEvent.PE: case SerialPortEvent.CD: case SerialPortEvent.CTS: case SerialPortEvent.DSR: case SerialPortEvent.RI: case SerialPortEvent.OUTPUT_BUFFER_EMPTY: break; case SerialPortEvent.DATA_AVAILABLE:// 當有可用數據時讀取數據,並且給串口返回數據 byte[] readBuffer = new byte[20]; try { while (inputStream.available() > 0) { System.out.println(inputStream.available()); int numBytes = inputStream.read(readBuffer); System.out.println(numBytes); } System.out.println(new String(readBuffer).trim()); } catch (IOException e) { e.printStackTrace(); } break; } } public void send(String content){ try { outputStream.write(content.getBytes()); } catch (IOException e) { e.printStackTrace(); } } public void ClosePort() { if (serialPort != null) { serialPort.close(); } } } 測試 Java代碼 package test; import gnu.io.CommPortIdentifier; import java.util.Enumeration; public class Test { public static void main(String[] args) throws InterruptedException { Enumeration portList = CommPortIdentifier.getPortIdentifiers(); //得到當前連接上的埠 CommUtil comm3 = new CommUtil(portList,"COM3"); int i = 0; while(i<5) { Thread.sleep(3000); comm3.send("hello"); i++; } comm3.ClosePort(); } } java串口通信開源佚名網路摘編賈周成網路

2. 串口數據包格式

用有串口的單片機,自動檢測幀頭的,不需認為判斷

3. java 串口開發包comm.jar在java官網哪個頁面可以下載我要官方的下載頁面

建議到maven中央倉庫下載,然後用maven依賴一下,就會自動下載下來了專。
以下為maven的依賴屬:
<dependency>
<groupId>javax.comm</groupId>
<artifactId>comm</artifactId>
<version>3.0-u1</version>
</dependency>

4. 托利多3880+怎樣通過串口通信讀取稱重數量,需要開發包嗎

你好,尊敬的用戶,

如需串口讀取稱重數據需要秤內軟體支持,該功能需要聯系梅特勒-托利多進行定製開發。
如仍有疑問,歡迎向企業知道提問。

5. 我剛剛接觸串口通訊這東西 需要用JAVA做 該有的包我都有了 差不多也配置好了 只有程序問題

用socket做
首先建立個服務端

import java.net.*;
import java.io.*;

public class Server
{
private ServerSocket ss;
private Socket socket;
private BufferedReader in;
private PrintWriter out;

public Server()
{
try
{
ss = new ServerSocket(10000);

while (true)
{
socket = ss.accept();
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(),true);

String line = in.readLine();
out.println("you input is :" + line);
out.close();
in.close();
socket.close();
}
ss.close();
}
catch (IOException e)
{}
}

public static void main(String[] args)
{
new Server();
}
}

{建立客戶端}

import java.io.*;
import java.net.*;

public class Client
{
Socket socket;
BufferedReader in;
PrintWriter out;

public Client()
{
try
{
socket = new Socket("xxx.xxx.xxx.xxx", 10000);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(),true);
BufferedReader line = new BufferedReader(new InputStreamReader(System.in));

out.println(line.readLine());
line.close();
out.close();
in.close();
socket.close();
}
catch (IOException e)
{}
}

public static void main(String[] args)
{
new Client();
}
}

6. 串口通訊解包數據

你做的和我做的差不多,你這個讀取上來的數據,每四位代表一個含義,倒數四位應內該是效驗碼,倒數第二個容四位應該是轉速,那麼你把讀取上來的數據拆開,方法有很多,比如字元串/附加字元串/搜索拆分字元串,只要四位轉速1222,那麼這個1222是十六進制的數據,然後使用字元串裡面的十六進制字元串至數值轉換將字元串轉換成數值,你這個串口通訊我都做過,而且把讀取上來的數據進行拆分轉換是很容易的,有什麼問題給我發消息,我電腦上有一個把讀取上來的數據進行轉換的,可以發給你看看

7. 如何實現串口抓包的功能

呵呵,CEIWEI已經更新了,來搜一下自"CommMonitor 串口監控11.0", 你可以下載最新的,裡面有教程幫助。


11.0更新日誌

1. 支持會員手機號注冊登錄,不在限制使用電腦,任意電腦帳號登錄,詳情請查看「會員管理」,會員帳號功能適用於CommMonitor串口監控、USBMonitor監控、CommTone串口調試、虛擬串口等所有CEIWEI軟體都可以在任意電腦上登錄使用;但同一帳號,同一時間在線只能一台電腦。

2. 支持監控正在使用中(已打開)的串口;

3. 支持第一次管理員許可權安裝後,非管理員許可權運行程序;

4. 支持中文 Unicode 字元串解碼;

5. SDK 支持阻止串列埠寫入數據包,並可以將寫入的數據包攔截後再修改,然後再寫入到串列埠,或是你主動寫入任意的數據包,從而改變串列埠數據的輸出;

6. SDK 支持 OCX/DLL 調用方式,詳情參看 MFC-DLL/DelphiDLL Demo 示例。

8. 單片機串口發送數據包的問題

1.正是如此,使用串口發數據包的時候一次發送一個位元組,發送多次把一個數據包專完全送出屬去。

在使用非中斷方式發送的時候,先把數據包的所有內容放在一個數組中,然後把數組發送。

使用中斷方式接收數據時也是這樣。按照你的情況來看,由於發送的數據有幀頭和幀尾,所以你在設計數據包結構時就要考慮如何識別「開始」和「結束」的過程。如對於幀頭的3個位元組,你可使用特殊字元的組合,如0x55,0xAA,0x3C,0xC3等來作為開始和結束的標志。這樣不管數據包有多長都能被正確的接收。在數據包接收完成之後,把一個標志位設置,以便後續程序的處理。

補充:是的,每次進入中斷之後都對數據進行解析,然後做記號(標志位或者計數)。

9. 串口通信中的數據包是什麼意思,怎麼解析(最好來點c代碼舉例下)

通俗的說就是符合某通訊協議的一組二進制串或字元串。
有些有包頭及包尾,如modbus ascii,冒號表示包頭,回車(0xd)表示包尾,
某些沒有包頭及包尾,如modbus rtu,如果時間超過3.5個字元,表示新的一楨數據包。
數據包還真不好用c語言舉例。
這樣說吧,比如一楨數據包可以這樣定義:
第一位元組:從站地址+第二位元組:指令類型(讀還是寫,bool,short還是float)+第三第四位元組:地址+第五第六位元組:crc校驗。
可以有一個結構體與之對應:
typedef struct _protocol
{
char cStationAddr;
char cInst;
short sAddr;
short sCRC;
}PRO;
發送協議需要將結構體打包成串,接受到串後需要解包。
就這個例子而言,解包就比較容易了,如接收緩沖區為
char cBuff[MAX_BUF_LEN];
PRO thePro;
那麼,thePro.cStationAddr=cBuff[0];
同理,thePro.sAddr=(cBuff[2]<<8)|cBuff[3];//這句就不解釋了哈,相信你能看懂。
當然,通訊協議可以自己定義,符合某通訊協議(如tcp/ip)可以直接跟其他機器通訊。
打個比方,通訊協議就是中文,英文,德文。。。,數據包就是某種語言的一句話,語種相同的人,互相說話,就是在傳遞數據包,你可以傳「你好」或「hello」數據包。
所以建議樓主學習一下通訊協議,如modbus,你就明白了,但你要做好克服困難的心理准備先。
全手工錄入,滿意請點贊。謝謝。