Java 使用串行端口arraylist中的数据
好吧,我迷路了,现在连谷歌都不知道该怎么办 我正在使用JSSC从串行端口读取数据 当我打印为支票数字时,数据被顶起。 它先打印几行,然后按单个字符打印。 如果我使用“printf”,它会正常打印 这是im使用的for循环:Java 使用串行端口arraylist中的数据,java,string,arraylist,jssc,Java,String,Arraylist,Jssc,好吧,我迷路了,现在连谷歌都不知道该怎么办 我正在使用JSSC从串行端口读取数据 当我打印为支票数字时,数据被顶起。 它先打印几行,然后按单个字符打印。 如果我使用“printf”,它会正常打印 这是im使用的for循环: for (String s: data2) { System.out.println(s); } 其他代码: String getData = serialPort.readString(even
for (String s: data2) {
System.out.println(s);
}
其他代码:
String getData = serialPort.readString(event.getEventValue());
List<String> data2 = new ArrayList<String>(Arrays.asList(getData.split("$")));
String getData=serialPort.readString(event.getEventValue());
List data2=新的ArrayList(Arrays.asList(getData.split(“$”));
如果我只是打印它,我就可以使用printf了
我需要把每个句子按$符号分开
任何帮助都将不胜感激
import jssc.SerialPort;
import jssc.SerialPortEvent;
import jssc.SerialPortEventListener; import jssc.SerialPortException;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;
public class test {
static SerialPort serialPort;
public static void main(String[] args) {
serialPort = new SerialPort("COM!");
try {
serialPort.openPort();//Open ports
serialPort.setParams(4800, 8, 1, 0);//Set params
int mask = SerialPort.MASK_RXCHAR + SerialPort.MASK_CTS + SerialPort.MASK_DSR;//Prepare mask
serialPort.setEventsMask(mask);//Set mask
serialPort.addEventListener(new SerialPortReader());//Add SerialPortEventListener
}
catch (SerialPortException ex) {
System.out.println(ex);
}
}public void serialEvent(SerialPortEvent event) {
// if(event.isRXCHAR()){//If data is available
// if(event.getInputBufferBytesCount() > 1){//Check bytes count in the input buffer
//Read data, if 10 bytes available
try {
String getdata = serialPort.readString(event.getEventValue());
String delimiter = "$";
List<String> data2 = new ArrayList<String>(Arrays.asList(getdata.split("$")));
for (String s: data2) {
System.out.printf("NEW" + s);
}
}
catch (SerialPortException ex) {
}
导入jssc.SerialPort;
导入jssc.SerialPortEvent;
导入jssc.SerialPortEventListener;导入jssc.SerialPortException;
导入java.util.array;
导入java.util.ArrayList;
导入java.util.List;
公开课考试{
静态串口串口;
公共静态void main(字符串[]args){
serialPort=新的serialPort(“COM!”);
试一试{
serialPort.openPort();//打开端口
serialPort.setParams(4800,8,1,0);//Set params
int mask=SerialPort.mask\u RXCHAR+SerialPort.mask\u CTS+SerialPort.mask\u DSR;//准备mask
serialPort.setEventsMask(掩码);//设置掩码
serialPort.addEventListener(新的SerialPortReader());//添加SerialPortEventListener
}
捕获(SerialPortException例外){
系统输出打印项次(ex);
}
}public void serialEvent(SerialPortEvent事件){
//if(event.isRXCHAR()){//if数据可用
//如果(event.getInputBufferBytesCount()>1){//检查输入缓冲区中的字节数
//读取数据(如果有10字节可用)
试一试{
String getdata=serialPort.readString(event.getEventValue());
字符串分隔符=“$”;
List data2=新的ArrayList(Arrays.asList(getdata.split(“$”));
对于(字符串s:data2){
系统输出打印F(“新”+s);
}
}
捕获(SerialPortException例外){
}
每个请求更新的代码
import jssc.SerialPort;
import jssc.SerialPortEvent;
import jssc.SerialPortEventListener; import jssc.SerialPortException;
//import java.util.Arrays;
//import java.awt.List;
//import java.util.Base64;
//import java.io.BufferedReader;
//import java.io.ByteArrayInputStream;
//import java.io.InputStream;
//import java.io.InputStreamReader;
//import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.io.IOException;
import java.lang.*;
//import static java.util.Arrays.asList;
//import java.util.List;
//import java.util.stream.Collectors;
//import org.apache.commons.lang3.StringUtils;
public class test {
static ArrayList<String> data = new ArrayList<String>();
static SerialPort serialPort;
public static void main(String[] args) {
serialPort = new SerialPort("COM1");
try {
serialPort.openPort();//Open ports
serialPort.setParams(4800, 8, 1, 0);//Set params
int mask = SerialPort.MASK_RXCHAR + SerialPort.MASK_CTS + SerialPort.MASK_DSR;//Prepare mask
serialPort.setEventsMask(mask);//Set mask
serialPort.addEventListener(new SerialPortReader());//Add SerialPortEventListener
}
catch (SerialPortException ex) {
System.out.println(ex);
}
}
/*
* 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
*/
static class SerialPortReader implements SerialPortEventListener {
public void serialEvent(SerialPortEvent event) {
// if(event.isRXCHAR()){//If data is available
// if(event.getEventValue() < 577){//Check bytes count in the input buffer
//Read data, if 10 bytes available
try {
String getdata = serialPort.readString(event.getEventValue());
String[] parts= getdata.split("$");
data.set(data.size() - 1, data.get(data.size() - 1) + parts[0]);
for (int i=1; i<parts.length; i++) {
data.add(parts[i]);
}
}
catch (SerialPortException ex) {
}
}
}
}
导入jssc.SerialPort;
导入jssc.SerialPortEvent;
导入jssc.SerialPortEventListener;导入jssc.SerialPortException;
//导入java.util.array;
//导入java.awt.List;
//导入java.util.Base64;
//导入java.io.BufferedReader;
//导入java.io.ByteArrayInputStream;
//导入java.io.InputStream;
//导入java.io.InputStreamReader;
//导入java.io.UnsupportedEncodingException;
导入java.util.ArrayList;
导入java.io.IOException;
导入java.lang.*;
//导入静态java.util.Arrays.asList;
//导入java.util.List;
//导入java.util.stream.collector;
//导入org.apache.commons.lang3.StringUtils;
公开课考试{
静态ArrayList数据=新的ArrayList();
静态串口串口;
公共静态void main(字符串[]args){
serialPort=新的serialPort(“COM1”);
试一试{
serialPort.openPort();//打开端口
serialPort.setParams(4800,8,1,0);//Set params
int mask=SerialPort.mask\u RXCHAR+SerialPort.mask\u CTS+SerialPort.mask\u DSR;//准备mask
serialPort.setEventsMask(掩码);//设置掩码
serialPort.addEventListener(新的SerialPortReader());//添加SerialPortEventListener
}
捕获(SerialPortException例外){
系统输出打印项次(ex);
}
}
/*
*在这个类中必须实现方法serialEvent,通过它我们了解
*发生在我们港口上的事件。但我们不会报告所有事件,只会
*我们放在掩码中的那些。在这种情况下,数据的到达和
*状态行CTS和DSR
*/
静态类SerialPortReader实现SerialPortEventListener{
public void serialEvent(SerialPortEvent事件){
//if(event.isRXCHAR()){//if数据可用
//如果(event.getEventValue()<577){//检查输入缓冲区中的字节数
//读取数据(如果有10字节可用)
试一试{
String getdata=serialPort.readString(event.getEventValue());
String[]parts=getdata.split($);
data.set(data.size()-1,data.get(data.size()-1)+parts[0]);
对于(int i=1;i您的serialEvent
方法只是为每个SerialPortEvent
启动的EventListener
,但不能保证数据会“完整”到达,因此您应该在类级别声明列表,获取到达的数据并以适当的方式存储。例如:
public class test {
// ...
static List<String> data = new ArrayList<String>();
// ...
public void serialEvent(SerialPortEvent event) {
try {
String getdata = serialPort.readString(event.getEventValue());
// String.split takes a regular expression. In regular expressions,
// the dollar sign ($) by it's own means the end of the line, so you
// have to escape it using a backslash (\), but since it's a string
// you have to escape that one with another backslash so it get's
// passed correctly, thus searching for the dollar sign and not the
// end of the line
String[] parts = getdata.split("\\$");
// Append whatever is before the first dollar sign to the last item
// in your data
if(!data.isEmpty()){
data.set(data.size() - 1, data.get(data.size() - 1) + parts[0]);
}
// Append the rest of the parts in your data
for (int i=1; i<parts.length; i++) {
data.add(parts[i]);
}
}
catch (SerialPortException ex) {}
// ...
}
// ...
}
公共类测试{
// ...
静态列表数据=新的ArrayList();
// ...
public void serialEvent(SerialPortEvent事件){
试一试{
String getdata=serialPort.readString(event.getEventValue());
//String.split接受正则表达式。在正则表达式中,
//美元符号($)本身意味着这一行的结束,所以你
//必须使用反斜杠(\)对其进行转义,但由于它是字符串
//你必须用另一个反斜杠来避开它,这样它就得到了
//正确通过,因此搜索美元符号而不是
//行尾
String[]parts=getdata.split(\\$);
//将第一个美元符号之前的内容附加到最后一项
//在您的数据中
如果(!data.isEmpty()){
data.set(data.size()-1,data.get(data.size()-1)+parts[0]);
}
//将其余部分追加到数据中
for(int i=1;iI)在这个主题上可能有些生疏,但你的代码不应该包装在serialEvent
实现中吗?如果是这样,请共享整个类,以便我们可以更好地查看查看查看编辑。我不明白为什么会有一些问题
public class test {
// ...
static List<String> data = new ArrayList<String>();
// ...
public void serialEvent(SerialPortEvent event) {
try {
String getdata = serialPort.readString(event.getEventValue());
// String.split takes a regular expression. In regular expressions,
// the dollar sign ($) by it's own means the end of the line, so you
// have to escape it using a backslash (\), but since it's a string
// you have to escape that one with another backslash so it get's
// passed correctly, thus searching for the dollar sign and not the
// end of the line
String[] parts = getdata.split("\\$");
// Append whatever is before the first dollar sign to the last item
// in your data
if(!data.isEmpty()){
data.set(data.size() - 1, data.get(data.size() - 1) + parts[0]);
}
// Append the rest of the parts in your data
for (int i=1; i<parts.length; i++) {
data.add(parts[i]);
}
}
catch (SerialPortException ex) {}
// ...
}
// ...
}