读取端口数据通信(SerialEventListener)-Java
好吗?我正在尝试将C代码转换为Java,但遇到了一些问题 我正在读一个串口读取端口数据通信(SerialEventListener)-Java,java,Java,好吗?我正在尝试将C代码转换为Java,但遇到了一些问题 我正在读一个串口 Global private InputStream inputStream; private OutputStream outputStream; 要发送数据,就要正确,问题是读取数据的时间 在C#中,我有一个接收方法: public void recepcaoResposta(int tam, byte[] frameHex) { byte[] l_frameHex = new byte[2000];
Global
private InputStream inputStream;
private OutputStream outputStream;
要发送数据,就要正确,问题是读取数据的时间 在C#中,我有一个接收方法:
public void recepcaoResposta(int tam, byte[] frameHex)
{
byte[] l_frameHex = new byte[2000];
byte[] frameEvt = new byte[16];
string linha, linhaTipo;
// !! Copia vetor-parâmetro para vetor-local (evita exception nos "if's"
//caso apenas 1 byte recebido) !!
Buffer.BlockCopy(frameHex, 0, l_frameHex, 0, tam);
.....
}
转换为Java的过程如下所示:
public void recepcaoResposta(int tam, byte[] frameHex) {
byte[] l_frameHex = new byte[2000];
byte[] frameEvt = new byte[16];
String linha, linhaTipo;
// !! Copia vetor-parâmetro para vetor-local (evita exception nos "if's"
//caso apenas 1 byte recebido) !!
System.arraycopy(frameHex, 0, l_frameHex, 0, tam);
...
}
到目前为止,问题是获取tam的时间,即数组的大小。在java中,我返回的大小是8,无论我做什么,都是8
我甚至尝试将“随机”数字大小的ifs改为8。但很明显我有错误
@Override
public void serialEvent(SerialPortEvent event) {
switch (event.getEventType()) {
case SerialPortEvent.DATA_AVAILABLE:
try {
while (inputStream.available() > 0) {
// int t = inputStream.read();
int t = serialPort.getDataBits();
byte[] f = new byte[t];
inputStream.read(f, 0, t); // Frame de bytes
recepcaoResposta(t, f);
}
} catch (IOException e) {
System.out.println("IO Exception in SerialEvent()" + e);
}
break;
}
}
但如前所述,我只有大小为8的返回值,在上面的代码中是:
int t = serialPort.getDataBits();
结果基本上是这样的:
TAM:8
l_frameHex[1]12
TAM:8
l_frameHex[1]23
嗯,经过多次尝试,我得到了它,它工作得非常好:
public static InputStream inputStream;
public static OutputStream outputStream;
@Override
public void serialEvent(SerialPortEvent evt) {
switch (evt.getEventType()) {
case SerialPortEvent.BI:
//Quebra interupção.
case SerialPortEvent.OE:
//Erro de saturação.
case SerialPortEvent.FE:
//Erro de enquadramento.
case SerialPortEvent.PE:
//Erro de pariedade.
case SerialPortEvent.CD:
//Detecção de portadora.
case SerialPortEvent.CTS:
//Limpa para enviar.
case SerialPortEvent.DSR:
//Conjunto de dados prontos.
case SerialPortEvent.RI:
//Caminho indicado.
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
/*Buffer de saída está vazio. O evento será gerado depois de uma gravação for concluída,
quando o buffer do sistema torna-se vazia novamente..."
*/
break;
case SerialPortEvent.DATA_AVAILABLE:
/*Dados disponíveis na porta serial. "
+ "Este evento será gerada uma vez quando dados novos chegam na porta de série. "
+ "Mesmo se o usuário não ler os dados, "
+ "não será gerado novamente até a próxima vez que novos dados chegam");
*/
try {
TimeUnit.MILLISECONDS.sleep(500); //
} catch (InterruptedException e) {
}
byte[] readBuffer = new byte[1024];
try {
int numBytes = 0;
while (inputStream.available() > 0) {
numBytes = inputStream.read(readBuffer);
}
String result = new String(readBuffer);
result = result.substring(0, numBytes);
System.out.println(result + "\n");
} catch (IOException e) {
}
break;
}
}
getDataBits()
返回为串行端口配置的位数(不是字节),该值可以是5、6、7或8。它与当前可以从InputStream读取的字节数无关。是的,在我意识到之前看了一会儿<代码>//byte[]readBuffer=新字节[2000];//int t=inputStream.read(readBuffer);int t=inputStream.available()代码>我这样测试它,但它不断返回随机和错误的值<代码>运行:1 8 1 4 1 3 5
public static InputStream inputStream;
public static OutputStream outputStream;
@Override
public void serialEvent(SerialPortEvent evt) {
switch (evt.getEventType()) {
case SerialPortEvent.BI:
//Quebra interupção.
case SerialPortEvent.OE:
//Erro de saturação.
case SerialPortEvent.FE:
//Erro de enquadramento.
case SerialPortEvent.PE:
//Erro de pariedade.
case SerialPortEvent.CD:
//Detecção de portadora.
case SerialPortEvent.CTS:
//Limpa para enviar.
case SerialPortEvent.DSR:
//Conjunto de dados prontos.
case SerialPortEvent.RI:
//Caminho indicado.
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
/*Buffer de saída está vazio. O evento será gerado depois de uma gravação for concluída,
quando o buffer do sistema torna-se vazia novamente..."
*/
break;
case SerialPortEvent.DATA_AVAILABLE:
/*Dados disponíveis na porta serial. "
+ "Este evento será gerada uma vez quando dados novos chegam na porta de série. "
+ "Mesmo se o usuário não ler os dados, "
+ "não será gerado novamente até a próxima vez que novos dados chegam");
*/
try {
TimeUnit.MILLISECONDS.sleep(500); //
} catch (InterruptedException e) {
}
byte[] readBuffer = new byte[1024];
try {
int numBytes = 0;
while (inputStream.available() > 0) {
numBytes = inputStream.read(readBuffer);
}
String result = new String(readBuffer);
result = result.substring(0, numBytes);
System.out.println(result + "\n");
} catch (IOException e) {
}
break;
}
}