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,你就明白了,但你要做好克服困难的心理准备先。
全手工录入,满意请点赞。谢谢。