Чтение файла с последовательного порта в Java - PullRequest
3 голосов
/ 18 февраля 2009

Я новичок в технологии Java, я должен читать файл из порта. Сначала я напишу «FLASH» в outputtream, затем получу ответ как «FLASH_OK» от целевого устройства, после получения FLASH_OK в качестве ответа, затем снова мне нужно написать имя файла, который я хочу, но проблема в том, что он не записывается имя файла для outputtream, ниже мой код. Пожалуйста, помогите мне.

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;

    }
}

}

Ответы [ 3 ]

1 голос
/ 18 февраля 2009

Тестировали ли вы программное обеспечение эмулятора последовательного порта?

Когда я делал такое приложение для колледжа, наш профессор сказал нам создать приложение и протестировать его с помощью эмулятора, поскольку оно намного дешевле и менее подвержено ошибкам.

При поиске в Google вы можете найти некоторые программы, которые делают это. Я точно не помню тот, который мы использовали в то время, но он работал довольно хорошо.

Я имею в виду такие продукты: Eterlogic - эмулятор виртуальных последовательных портов , но это всего лишь пример (и я не тестировал это программное обеспечение, я просто погуглил его)

1 голос
/ 02 июня 2009

Вы ошибочно полагаете, что полные сообщения всегда будут приниматься. Вместо этого, когда запускается последовательное событие, может быть доступна только часть сообщения. Например, вы можете получить событие и прочитать «FLAS», а последующее событие даст «H_OK». Вам нужно адаптировать свой код к чему-то вроде этого:

// member variables
byte [] receiveBuffer = new byte[BUFFER_LENGTH];
int receiveIndex = 0;

// Receive code

receiveIndex +=
   inputStream.read(receiveBuffer, receiveIndex, BUFFER_LENGTH - receiveIndex);
0 голосов
/ 18 февраля 2009

Извините, я не могу помочь вам с кодом Java, но вы уверены, что данные "FLASH" на самом деле отправляется на ваш последовательный порт? Когда у меня возникают проблемы такого рода, я обычно использую осциллограф, чтобы посмотреть на вывод TX на последовательном порту и проверить, могу ли я «увидеть» отправляемые данные (пакет данных будет коротким, но вы сможете увидеть Это). если ты можно увидеть, как он использует область, чтобы посмотреть на вывод RX последовательного порта и посмотреть, если вы можете увидеть ответ "FLASH_OK", фактически отправляемый.

В девяти случаях из десяти проблема заключается не в программном обеспечении, а в аппаратном обеспечении, часто возникающем из-за неправильного подключения контактов рукопожатия.

Удачи с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...