摘要:串口通信以自己刚做的功能做为核心记录这篇博客是基于通信协议之间的通信是十六进制进行通信的可选波特率,数据位停止位采用校验功能和代码的实现界面是用窗体表现的界面的实现就不过多的贴代码和说怎么去实现了,有个很好用的工具,可以直接拖控件,跟做很像
串口通信以自己刚做的功能做为核心记录这篇博客
①. 是基于modbus通信协议之间的通信
②. 是十六进制进行通信的
③. 可选波特率,数据位 停止位
④. 采用CRC校验
界面是用窗体表现的
界面的实现就不过多的贴代码和说怎么去实现了,有个很好用的工具 NETBean,可以直接拖控件,跟C#做winfrom很像,但是eclipse没有 要自己布局的话比较耗时。ok,先说窗体下半部分的实现需要用到的jar包:comm.jar ,可以在网上搜下如何配置
void listPort() {
CommPortIdentifier portId; //这个类在comm.jar中
Enumeration a = CommPortIdentifier.getPortIdentifiers();
while (a.hasMoreElements()) {
portId = (CommPortIdentifier) a.nextElement();
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
list.add(portId.getName()); //这里的list是个成员变量,add之后再下拉框中刷新进去
}
}
}
波特率,数据位这些可以直接事先放在数组里面,界面一启动就加 载进去了
二.打开串口public void selectPort(String portName, int rate, int databit, int stopbit,int parity) {
System.out.println("selectPort()");
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(rate, databit, stopbit, parity);
}
/**
* @功能:打开串口
**
**/
private void openPort(int rate, int databit, int stopbit, int parity) {
System.out.println("openPort()");
// TODO Auto-generated method stub
if (commPort == null)
//无法找到这个端口
else {
//成功找到
try {
serialPort = (SerialPort) commPort.open(appName, timeout);
try {
serialPort.setSerialPortParams(rate, SerialPort.DATABITS_8,
SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);//这里过来参数是int,要转成16进制,为了方便看代码我就不转化,直接用他的变量了
} catch (UnsupportedCommOperationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
log("实例SerialPort成功");
} catch (PortInUseException e) {
throw new RuntimeException(String.format("端口为"%1$s"的串口正在被使用!",
commPort.getName()));
}
}
}
在写上部分如何实现前,先说说扫描枪的工作相当于最后的字符带了回车的键盘输入 ,就这样.
将接收到的字符串转换成16进制:
public static byte[] HexStringBytes(String src) {
if (null == src || 0 == src.length()) {
return null;
}
byte[] ret = new byte[src.length()/2];
byte[] tmp = src.getBytes();
// System.out.println("tmp="+Arrays.toString(tmp));
/*
* int length = 0; if (tmp.length % 2 != 0) { length=(tmp.length+1)/2; }
* length=tmp.length;
*/
for (int i = 0; i < (tmp.length / 2); i++) {
ret[i] = uniteBytes(tmp[i * 2], tmp[i * 2 + 1]);
}
return ret;
}
/*
* 以字节的形式写进去
*/
public void write(byte[] message) {
System.out.println("write()");
checkPort();
try {
outputStream = new BufferedOutputStream(
serialPort.getOutputStream());
} catch (IOException e) {
throw new RuntimeException("获取端口的输出流出错");
}
try {
outputStream.write(message);
log("信息发送成功");
} catch (IOException e) {
throw new RuntimeException("向端口发送信息失败");
} finally {
try {
outputStream.close();
} catch (Exception e) {
}
}
}
附上dome下载:链接
推荐一款适合二次开发的扫描枪:MS3398迷你条码扫描枪
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/67336.html
摘要:二模块原理蓝牙模块的通信示意图如下两个设备主控芯片或单片机分别连接各自的蓝牙模块,即将主控芯片与蓝牙模块的串口控制引脚交叉连接。如图注蓝牙模块自带转电路。注博主演示的蓝牙模块虽然不是,但是功能和一样。 ...
摘要:使用库读写环境光照度传感器本文将教大家如何快速使用库读取光照度数据。五实验样机测试展示通过之前配置好的面板,通过涂鸦智能进行配网实时采集光照度传感器的数据。 使用STM32 HAL库读写环境光照度传感器(BH1750) 本文将教大家如何快速使用STM32HAL库读取光照度数据。 实现功能:通...
摘要:异步通信与同步通信异步通信异步通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程。同步通信同步通信时要建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步。配置串口设置为异步通信基础参数波特率为。 ...
阅读 3543·2021-11-11 16:54
阅读 3719·2021-10-11 10:58
阅读 1489·2021-08-30 09:41
阅读 1933·2019-08-30 15:54
阅读 2192·2019-08-30 14:00
阅读 2854·2019-08-29 17:13
阅读 1804·2019-08-29 15:19
阅读 925·2019-08-29 15:14