在Java中从串行端口读取文件
我是java技术的初学者,我必须从端口读取文件。首先我将写“FLASH”到outputstream,然后我将从目标设备得到“FLASH\u OK”响应,在得到FLASH\u OK作为响应之后,我必须再次写下我想要的文件名,但问题是它没有将文件名写入outputstream,下面是我的代码。请帮帮我在Java中从串行端口读取文件,java,serial-port,Java,Serial Port,我是java技术的初学者,我必须从端口读取文件。首先我将写“FLASH”到outputstream,然后我将从目标设备得到“FLASH\u OK”响应,在得到FLASH\u OK作为响应之后,我必须再次写下我想要的文件名,但问题是它没有将文件名写入outputstream,下面是我的代码。请帮帮我 package writeToPort; import java.awt.Toolkit; import java.io.*; import java.util.*; import javax.c
package writeToPort;
import java.awt.Toolkit;
import java.io.*;
import java.util.*;
import javax.comm.*;
import javax.swing.JOptionPane;
import constants.Constants;
public class Flashwriter implements SerialPortEventListener {
Enumeration portList;
CommPortIdentifier portId;
String messageString = "\r\nFLASH\r\n";
SerialPort serialPort;
OutputStream outputStream;
InputStream inputStream;
Thread readThread;
String one, two;
String test = "ONLINE";
String[] dispArray = new String[1];
int i = 0;
byte[] readBufferArray;
int numBytes;
String response;
FileOutputStream out;
final int FLASH = 1, FILENAME = 2;
int number;
File winFile;
public static void main(String[] args) throws IOException {
Flashwriter sm = new Flashwriter();
sm.FlashWriteMethod();
}
public void FlashWriteMethod() throws IOException {
portList = CommPortIdentifier.getPortIdentifiers();
winFile = new File("D:\\testing\\out.FLS");
while (portList.hasMoreElements()) {
portId = (CommPortIdentifier) portList.nextElement();
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
if (portId.getName().equals("COM2")) {
try {
serialPort = (SerialPort) portId.open("SimpleWriteApp",
1000);
} catch (PortInUseException e) {
}
try {
inputStream = serialPort.getInputStream();
System.out.println(" Input Stream... " + inputStream);
} catch (IOException e) {
System.out.println("IO Exception");
}
try {
serialPort.addEventListener(this);
} catch (TooManyListenersException e) {
System.out.println("Tooo many Listener exception");
}
serialPort.notifyOnDataAvailable(true);
try {
outputStream = serialPort.getOutputStream();
inputStream = serialPort.getInputStream();
} catch (IOException e) {
}
try {
serialPort.setSerialPortParams(9600,
SerialPort.DATABITS_8, SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
serialPort
.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
number = FLASH;
sendRequest(number);
} catch (UnsupportedCommOperationException e) {
}
}
}
}
}
public void serialEvent(SerialPortEvent event) {
SerialPort port = (SerialPort) event.getSource();
switch (event.getEventType()) {
case SerialPortEvent.DATA_AVAILABLE:
try {
if (inputStream.available() > 0) {
numBytes = inputStream.available();
readBufferArray = new byte[numBytes];
int readBytes = inputStream.read(readBufferArray);
one = new String(readBufferArray);
System.out.println("readBytes " + one);
}
if (one.indexOf("FLASH_") > -1 & !(one.indexOf("FLASH_F") > -1)) {
System.out.println("got message");
response = "FLASH_OK";
number = FILENAME;
sendRequest(number);
}
out = new FileOutputStream(winFile, true);
out.write(readBufferArray);
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
readBufferArray = null;
// break;
}
}
public void sendRequest(int num) {
switch (num) {
case FLASH:
try {
outputStream.write(messageString.getBytes());
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
}
break;
case FILENAME:
try {
outputStream.write("\r\n26-02-08.FLS\r\n".getBytes());
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
}
break;
}
}
}
很抱歉,我无法帮助您使用Java代码,但是您确定数据“FLASH”是正确的吗 实际上是通过串行端口发送的?当我遇到此类问题时,我通常使用示波器查看串行端口上的TX引脚,并检查是否可以“看到”正在发送的数据(数据突发将很短,但您可以看到)。如果你 可以看到它使用示波器查看串行端口的RX引脚,并查看是否可以 查看实际发送的“FLASH_OK”响应 十分之九的问题不是软件问题,而是硬件问题,通常是因为握手引脚连接不正确
祝你好运。你用串口模拟器软件测试过吗 当我为大学开发这种应用程序时,我们的教授告诉我们构建应用程序并使用模拟器进行测试,因为它更便宜,更不容易出错 在搜索谷歌时,你可以找到一些这样做的软件。我记不清当时我们用的是哪一种,但效果很好
我指的是这样的产品:,但这只是一个例子(我还没有测试这个软件,我只是用谷歌搜索过)你错误地认为总是会收到完整的消息。相反,当触发串行事件时,可能只有部分消息可用。例如,您可能得到一个事件并读取“FLAS”,随后的事件将给出“H_OK”。您需要使代码适应以下内容:
// member variables
byte [] receiveBuffer = new byte[BUFFER_LENGTH];
int receiveIndex = 0;
// Receive code
receiveIndex +=
inputStream.read(receiveBuffer, receiveIndex, BUFFER_LENGTH - receiveIndex);
这与我正在寻找发送/读取相关,看起来没有肯定的答案,所以我放了一个:是的,我得到的响应为flash ok,但我无法再次写入outputstream。我正在读取serailport,数据将每隔一秒钟出现,但有时会丢失几秒钟的数据,问题出在哪里?请告诉我,在这种情况下,问题出在你的硬件上。尝试在不同的机器和不同的电缆上测试它。但是,只有当您已经使用模拟器进行了一些广泛的测试,以查看错误是否不在您的代码上时,才可以这样做