Java jssc从多个COM端口读取数据,同时将所有数据写入一个端口
我有几个COM端口,每1-2秒就带来一次数据。每台设备的每一行都以$开头,以CR和LF结尾。每行的长度不同,不超过82字节 我试图将四个4800波特的输入和一个34800波特的输入合并到一个192k波特的输出线上 您可以在此处看到我的代码:Java jssc从多个COM端口读取数据,同时将所有数据写入一个端口,java,jssc,Java,Jssc,我有几个COM端口,每1-2秒就带来一次数据。每台设备的每一行都以$开头,以CR和LF结尾。每行的长度不同,不超过82字节 我试图将四个4800波特的输入和一个34800波特的输入合并到一个192k波特的输出线上 您可以在此处看到我的代码: NEMA_聚合器是主要的 RS232Control包含所有JSSC内容 当发送GPS数据时,RS232Control调用NEMADATE UPDATE。更改其中一行中的日期。很好 主设备的相关代码: RS232Control gps = new RS2
- NEMA_聚合器是主要的
- RS232Control包含所有JSSC内容
- 当发送GPS数据时,RS232Control调用NEMADATE UPDATE。更改其中一行中的日期。很好
RS232Control gps = new RS232Control("COM32", 4800, true);
while (true) {
String line = gps.testRead2();
sentences.add(line);
gps.changePort("COM41", 115200, false);
gps.testWrite(line);
try {
Thread.sleep(500);
} catch (InterruptedException ex) {
Logger.getLogger(Nema0183_aggregator.class.getName()).log(Level.SEVERE, null, ex);
}
for (int i = 0 ; (i < 8) && (!line.startsWith("$GPGLL")) ; i++ ) {
gps.changePort("COM32", 4800, true);
line = gps.testRead2();
sentences.add(line);
gps.changePort("COM41", 115200, false);
gps.testWrite(line);
try {
Thread.sleep(500);
} catch (InterruptedException ex) {
Logger.getLogger(Nema0183_aggregator.class.getName()).log(Level.SEVERE, null, ex);
}
}
gps.changePort("COM39", 4800, false);
line = gps.testRead2();
sentences.add(line);
gps.changePort("COM41", 115200, false);
gps.testWrite(line);
gps.changePort("COM32", 4800, true);
try {
Thread.sleep(500);
} catch (InterruptedException ex) {
Logger.getLogger(Nema0183_aggregator.class.getName()).log(Level.SEVERE, null, ex);
}
}
RS232Control gps=新的RS232Control(“COM32”,4800,真);
while(true){
String line=gps.testRead2();
句子。加(行);
gps.changePort(“COM41”,115200,假);
测试写入(行);
试一试{
睡眠(500);
}捕获(中断异常例外){
Logger.getLogger(Nema0183_aggregator.class.getName()).log(Level.SEVERE,null,ex);
}
对于(int i=0;(i<8)和(!line.startsWith(“$GPGLL”);i++){
gps.changePort(“COM32”,4800,真实);
line=gps.testRead2();
句子。加(行);
gps.changePort(“COM41”,115200,假);
测试写入(行);
试一试{
睡眠(500);
}捕获(中断异常例外){
Logger.getLogger(Nema0183_aggregator.class.getName()).log(Level.SEVERE,null,ex);
}
}
gps.changePort(“COM39”,4800,假);
line=gps.testRead2();
句子。加(行);
gps.changePort(“COM41”,115200,假);
测试写入(行);
gps.changePort(“COM32”,4800,真实);
试一试{
睡眠(500);
}捕获(中断异常例外){
Logger.getLogger(Nema0183_aggregator.class.getName()).log(Level.SEVERE,null,ex);
}
}
然后RS232Control在这里:
import java.util.ArrayList;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
import jssc.*; // Java Simple Serial Connector, the library that contains the serial methods
import static nema0183_aggregator.RS232Control.serialPort;
/**
*
* @author Ian Van Schaick
*/
public class RS232Control {
static SerialPort serialPort;
String portName;
static long portOpen;
StringBuilder message;
Boolean receivingMessage;
SerialPortReader reader;
String readLine;
Boolean acknowledge;
int baud;
boolean gpsData;
NEMADateUpdate gpsUpdate;
String lineSep;
/**
*
* @param portNum
* @param portbaud
* @param gps
*/
public RS232Control(String portNum, int portbaud, boolean gps) {
gpsData = gps;
if (gpsData == true) {
gpsUpdate = new NEMADateUpdate ();
}
portName = portNum;
baud = portbaud;
serialPort = new SerialPort(portName);
message = new StringBuilder();
receivingMessage = false;
reader = new SerialPortReader();
readLine = "";
acknowledge = false;
lineSep = System.getProperty("line.separator");
openP();
}
protected void changePort (String portNum, int portbaud, boolean gps) {
close();
gpsData = gps;
if (gpsData == true) {
gpsUpdate = new NEMADateUpdate ();
}
portName = portNum;
baud = portbaud;
serialPort = new SerialPort(portName);
message = new StringBuilder();
receivingMessage = false;
reader = new SerialPortReader();
readLine = "";
acknowledge = false;
lineSep = System.getProperty("line.separator");
openP();
}
/**
* Opens a COM port at the specified settings (baudrate 8N1)
* Can throw an error opening the port
*/
private void openP() {
try {
serialPort.openPort();
serialPort.setParams(baud,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
int mask = SerialPort.MASK_RXCHAR;
serialPort.setEventsMask(mask);
serialPort.addEventListener(reader);
serialPort.setRTS(false);
serialPort.setDTR(false);
acknowledge = true;
} catch (SerialPortException ex) {
Logger.getLogger(RS232Control.class.getName()).log(Level.SEVERE, null, ex);
System.out.println("There is an error opening port т: " + ex);
}
}
/**
* Closes the serial port, can throw a SerialPortException error.
*
* @return
*/
private boolean close() {
boolean success = false;
try {
serialPort.closePort();
success = true;
} catch (SerialPortException ex) {
Logger.getLogger(RS232Control.class.getName()).log(Level.SEVERE, null, ex);
}
return success;
}
/**
* Opens the serial port. Tries to read a string from the serial port.
* Closes the serial port.
*
* @return Returns the byte array read from the serial port.
*/
protected String testRead2() {
String line = "";
ArrayList <String> readList = new ArrayList <String> ();
boolean lineFin = false;
for (int i = 0; i < 100 && (!lineFin); i++) {
try {
line = line + serialPort.readString(1);
} catch (SerialPortException ex) {
Logger.getLogger(RS232Control.class.getName()).log(Level.SEVERE, null, ex);
}
if (line.endsWith(lineSep)) {
lineFin = true;
}
if (gpsData == true) {
line = gpsUpdate.dateUpdate(line);
}
}
return line;
}
/**
* Writes the String message to the serial port
*
* @param message The string to write to the serial port
* @return Returns true if the write was successful
*/
protected boolean testWrite(String message) {
boolean success = false;
try {
if ( (!message.isBlank() ) && message.startsWith("$") ) {
success = serialPort.writeString(message);
}
} catch (SerialPortException ex) {
Logger.getLogger(RS232Control.class.getName()).log(Level.SEVERE, null, ex);
}
return success;
}
}
/**
* In this class must implement the method serialEvent, through it we learn
* about events that happened to our port. But we will not report on all events
* but only those that we put in the mask. In this case the arrival of the data
* and change the status lines CTS and DSR
*/
class SerialPortReader implements SerialPortEventListener {
/**
* Reads the data bit by bit from the serial port Can throw a
* SerialPortException error
*
* @param event
*/
@Override
public void serialEvent(SerialPortEvent event) {
if (event.isRXCHAR() && event.getEventValue() == 10) {
try {
byte buffer[] = serialPort.readBytes(10);
} catch (SerialPortException ex) {
System.out.println("Error in receiving string from COM-port: " + ex);
}
}
}
/**
* Prints out the message read from the serial port
*
* @param message
*/
protected void processMessage(String message) {
// System.out.println(message);
}
}
import java.util.ArrayList;
导入java.util.Scanner;
导入java.util.logging.Level;
导入java.util.logging.Logger;
导入jssc。*;//Java简单串行连接器,包含串行方法的库
导入静态nema0183_aggregator.RS232Control.serialPort;
/**
*
*@作者伊恩·范沙克
*/
公共类RS232控件{
静态串口串口;
字符串端口名;
静态长端口开放;
StringBuilder消息;
布尔接收消息;
串口阅读器;
字符串读取线;
布尔确认;
整数波特;
布尔gpsData;
NEMADATE更新gpsUpdate;
弦线;
/**
*
*@param-portNum
*@param-portbaud
*@param全球定位系统
*/
公共RS232控制(字符串portNum、int-portbaud、布尔gps){
gpsData=gps;
如果(gpsData==true){
gpsUpdate=new-NEMADateUpdate();
}
portName=portNum;
波特=波特波特;
serialPort=新的serialPort(端口名);
消息=新的StringBuilder();
receivingMessage=false;
reader=新的SerialPortReader();
readLine=“”;
确认=错误;
lineSep=System.getProperty(“line.separator”);
openP();
}
受保护的void changePort(字符串portNum、int-portbaud、布尔gps){
close();
gpsData=gps;
如果(gpsData==true){
gpsUpdate=new-NEMADateUpdate();
}
portName=portNum;
波特=波特波特;
serialPort=新的serialPort(端口名);
消息=新的StringBuilder();
receivingMessage=false;
reader=新的SerialPortReader();
readLine=“”;
确认=错误;
lineSep=System.getProperty(“line.separator”);
openP();
}
/**
*以指定设置(波特率8N1)打开COM端口
*打开端口时可能引发错误
*/
私有void openP(){
试一试{
serialPort.openPort();
serialPort.setParams(波特率,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
串行端口。奇偶校验(无);
serialPort.setFlowControlMode(serialPort.FLOWCONTROL\u无);
int mask=SerialPort.mask\u RXCHAR;
serialPort.setEventsMask(掩码);
serialPort.addEventListener(读卡器);
serialPort.setRTS(false);
serialPort.setDTR(false);
确认=正确;
}捕获(SerialPortException例外){
Logger.getLogger(RS232Control.class.getName()).log(Level.SEVERE,null,ex);
System.out.println(“打开端口τ时出错:“+ex”);
}
}
/**
*关闭串行端口,可能引发SerialPortException错误。
*
*@返回
*/
私有布尔关闭(){
布尔成功=假;
试一试{
serialPort.closePort();
成功=真实;
}捕获(SerialPortException例外){
Logger.getLogger(RS232Control.class.getName()).log(Level.SEVERE,null,ex);
}
回归成功;
}
/**
*打开串行端口。尝试从串行端口读取字符串。
*关闭串行端口。
*
*@return返回从串口读取的字节数组。
*/
受保护的字符串testRead2(){
字符串行=”;
ArrayList readList=新的ArrayList();
布尔lineFin=false;
对于(int i=0;i<100&(!lineFin);i++){
试一试{
line=line+serialPort.readString(1);
}捕获(SerialPortException例外){
Logger.getLogger(RS232Control.class.getName()).log(Level.SEVERE,nul