JAVA 操作 SCL2008 大屏幕

一. 下载SDK开发包和一些依赖的DLL动态链接库

  1. 在 pom.xml 中新增 RXTX 依赖:
<!-- java 操作串口包 -->
<dependency>
    <groupId>org.rxtx</groupId>
    <artifactId>rxtx</artifactId>
    <version>2.1.7</version>
</dependency>
  1. 将 rxtxParallel.dll、rxtxSerial.dll、SuperComSCL2008.Dll 这三个文件放入 JDK 的 jre/bin 目录中。注意,这三个文件取决于自己操作系统位数而不是JDK的位数。我准备好了64位和32位的库:下载 RXTX 需要的动态链接库
  2. 下载 SCL2008 的开发包SDK:下载 SCL2008 SDK
  3. 解压出来后:
  4. 进入 Demos\Java\SCL2008-CL3000-SC3000通用java开发包 目录,将里面的所有内容(注意文件的编码,有些是 UTF-8,有些是 ANSI 建议都改成 UTF-8)复制到你项目的 com.lytec 目录下(没有要自己建):
  5. 该 SDK 发布于 2022-04-21,所以只修改了此时的 BUG,后续版本可能会修复

二. 修改 SDK 中的 BUG

  1. 打开 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文件 中:

Java 大屏展示接 java大屏技术_java


Java 大屏展示接 java大屏技术_物联网_02

  1. 查看 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);
}
  1. 继续进入 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;
}
  1. 运行测试:
  • 控制台:
  • 大屏幕:

三. 总结

可以看到,最主要的方法是 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动态链接文件。导入依赖直接运行!