JAVA 操作 SCL2008 大屏幕
一. 下载SDK开发包和一些依赖的DLL动态链接库
- 在 pom.xml 中新增 RXTX 依赖:
<!-- java 操作串口包 -->
<dependency>
<groupId>org.rxtx</groupId>
<artifactId>rxtx</artifactId>
<version>2.1.7</version>
</dependency>
- 将 rxtxParallel.dll、rxtxSerial.dll、SuperComSCL2008.Dll 这三个文件放入 JDK 的 jre/bin 目录中。注意,这三个文件取决于自己操作系统位数而不是JDK的位数。我准备好了64位和32位的库:下载 RXTX 需要的动态链接库
- 下载 SCL2008 的开发包SDK:下载 SCL2008 SDK
- 解压出来后:
- 进入 Demos\Java\SCL2008-CL3000-SC3000通用java开发包 目录,将里面的所有内容(注意文件的编码,有些是 UTF-8,有些是 ANSI 建议都改成 UTF-8)复制到你项目的 com.lytec 目录下(没有要自己建):
- 该 SDK 发布于 2022-04-21,所以只修改了此时的 BUG,后续版本可能会修复
二. 修改 SDK 中的 BUG
- 打开 com.lytec.Demo.InitailDemo:将原本的 main 方法重命名为 mainOld,复制以下 main 方法进代码中:
public static void main(String[] args) throws Exception {
int nDevId = 13;
//前面四个参数在PLAYLIST.LY的position里
TextInfo textInfo = new TextInfo(3648, 0, 448, 96, 0, 0, 1);
boolean b = SCL.L_ComInitial(
nDevId,//设备ID
0,//屏号
0,//密匙
LConst.SerialPorts[2],//COM3,改成你自己的
LConst.BAUDRATE9600,//波特率,改成你自己的
0,//地址码
1 //devType:硬件类型(1、SCL2008, 2、SC3000, 3、CL3000)
);
//其中 LConst.SerialPorts = {"COM1","COM2","COM3","COM4","COM5","COM6",
//"COM7","COM8","COM9","COM10","COM11","COM12","COM13","COM14","COM15",
//"COM16","COM17","COM18","COM19","COM20","COM21","COM22","COM23","COM24","COM25"};
if(!b){
throw new Exception("串口初始化失败!");
}
SCL.L_ShowString(nDevId, textInfo, "Hi你好,yhf");
}
注意:TextInfo 的前四个参数(3648, 0, 448, 96),在 PLAYLIST.LY文件 中:
- 查看 SCL.L_ShowString 方法:
public static boolean L_ShowString(
int nDevId,
TextInfo textInfo,
String str
) throws IOException, UnsupportedCommOperationException, PortInUseException{
byte[] textBytes = SCL.L_GetTextViewPackage(nDevId, textInfo, str);
byte[] bytes = SCL.L_GetPackage(nDevId, textBytes);
return L_TransComm(nDevId, bytes);
}
- 继续进入 SCL.L_GetTextViewPackage 方法,修改 str.getBytes() 为 str.getBytes(“GB2312”) :
public static byte[] L_GetTextViewPackage(int nDevId, TextInfo text, String str) throws IOException{
Communication commu = map.get(nDevId);
int command = 0x0000000F;
int Xpos = text.getLeft();
int Ypos = text.getTop();
int width = text.getWidth();
int height = text.getHeight();
byte[] commandBytes = LData.intTo4Bytes(command);
byte[] xBytes = LData.intTo2Bytes(Xpos);
byte[] yBytes = LData.intTo2Bytes(Ypos);
byte[] widthBytes = LData.intTo2Bytes(width);
byte[] heightBytes = LData.intTo2Bytes(height);
//byte[] strBytes = str.getBytes();
byte[] strBytes = str.getBytes("GB2312");//不指定默认是UTF-8,屏幕显示中文会乱码
byte temp = 0;
//str的长度不得超过1000个字符
if (strBytes.length>1000) {
System.out.println("字符串的长度超过1000个字符,请重新输入!");
}
baos.reset();
baos.write(commandBytes);
baos.write(xBytes);
baos.write(yBytes);
baos.write(widthBytes);
baos.write(heightBytes);
baos.write(strBytes);
baos.write(temp);
byte[] basePackage = baos.toByteArray();
baos.reset();
baos.close();
commu.setBaseBytes(basePackage);
return basePackage;
}
- 运行测试:
- 控制台:
- 大屏幕:
三. 总结
可以看到,最主要的方法是 2.2 中的以下两个方法,他将我们的数据封装成字节数组:
byte[] textBytes = SCL.L_GetTextViewPackage(nDevId, textInfo, str);
byte[] bytes = SCL.L_GetPackage(nDevId, textBytes);
之后通过串口发送数据给大屏幕。知道原理后我们可以做如下改进:
将老牌的操作串口包 RXTX 升级为新的 JSerialComm:可以参考本人以前写过的如何通过 JSerialComm 收发串口数据:JAVA 如何通过 JSerialComm 收发串口数据
JSerialComm 相较于 RXTX 最大的优点是:不需要自己额外添加.dll动态链接文件。导入依赖直接运行!