1

私はarduinoからバイト値を受け取り、それらを配列として保存し、いくつかの数学的計算を実行し、値をarduinoに送り返すコードを書いています。現在、127 個の値を Arduino に送信でき、127 個の値が返されますが、それらは文字列型であり、Integer クラスを使用してこれらの文字列を変換しようとすると、プログラムがハングします。バッファが空の文字列を提供することがあり、 parseInt() は何をすべきかわからないと思います。誰か提案はありますか?私はJavaの初心者であり、より良い解決策を受け入れるでしょう。

これが私のコードです:

package GridMap;

import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 *
*/
public class SerialWriter implements Runnable {

OutputStream out;
byte array[] = new byte[10];
byte c;

public SerialWriter(OutputStream out, byte[] in) {
    this.out = out;
    array = in;
}

public void run() {

        try {
            int index = 0;
            c = array[index];
            while ((c) > -1) {
                this.out.write(c);
                System.out.println("sent " + c);
                if (index == 64){
                    Thread.sleep(2);
                }
                index++;
                c = array[index];
            }
            TwoWaySerialComm.recieve();
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(-1);
        }


}
}

public class SerialReader implements Runnable {
static byte[] output = new byte[128];
private InputStream in;
private int[] buffer = new int[11];
static SerialPort thisSerialPort;
static OutputStream thisOut;
static String total = new String("333");

public SerialReader(InputStream in) {
    this.in = in;

    for (byte i = 0; i < 127; i++) {
            output[i] = i;
        }
    output[127] = - 1;
}
public void run ()
    {
        byte[] buffer = new byte[1024];
        int len = -1;
        int index = 0;
        int value;
        try
        {
            Thread.sleep(200);

            while (( len = this.in.read(buffer)) > -1 && index < 200)
            {


                String string = new String(buffer, 0, len);
                //value = Integer.getInteger(string, len);
               // System.out.print(value);
                //System.out.println("buffer" + value);
                System.out.print(string);
                index++;

            }


            TwoWaySerialComm.send(output);
        }
        catch (Exception e )
        {
            e.printStackTrace();
        } 
    }
public static int byteArrayToInt(byte[] b) 
{
return   b[3] & 0xFF |
        (b[2] & 0xFF) << 8 |
        (b[1] & 0xFF) << 16 |
        (b[0] & 0xFF) << 24;
}


}
public class TwoWaySerialComm {

static SerialPort serialPort;
static OutputStream out = null;
static InputStream in;
static Thread receiveThread;
static Thread sendThread;
static byte[] output = new byte[11];


public TwoWaySerialComm() {
    super();
}

void connect(String portName) throws Exception {
    CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
    if (portIdentifier.isCurrentlyOwned()) {
        System.out.println("Error: Port is currently in use");
    } else {
        CommPort commPort = portIdentifier.open(this.getClass().getName(), 2000);

        if (commPort instanceof SerialPort) {
            serialPort = (SerialPort) commPort;
            serialPort.setSerialPortParams(114400, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);




        } else {
            System.out.println("Error: Only serial ports are handled by this example.");
        }
    }

}

static void send(byte[] output) {
    try {
        out = serialPort.getOutputStream();
        sendThread = new Thread(new SerialWriter(out, output));
        sendThread.start();
        //sendThread.join();
    } catch (Exception e) {
        System.out.println("Port Not Avaialable (send) ");
    }
}

static void recieve(){
    try {
    in = serialPort.getInputStream();
    receiveThread = new Thread(new SerialReader(in));
    receiveThread.start();
    receiveThread.join();
    } catch (Exception e) {

    }
}

public static void main(String[] args) {
    try {

        (new TwoWaySerialComm()).connect("COM3");

        for (byte i = 0; i < 10; i++) {
            output[i] = i;
        }
        output[10] = -1;
        send(output);  



    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

public static SerialPort returnSerialPort(){
    return serialPort;
}
}
4

3 に答える 3

0

説明がよくわかりませんでした。
しかし、質問のタイトルへの答えはここにあります。
Java で InputStream をバイト配列に変換する

于 2013-04-21T17:46:36.680 に答える
0

ストリームから int を取得したい場合は、BuffereInputStream を使用して int を返す read() メソッドを使用する方が簡単です -> 変換は不要です。これを SerialReader クラスに追加します。

  Thread.sleep(200);
  BufferedInputStream input = new BufferedInputStream(in);

  while ((value = input.read()) != 1 && index < 200)
  {
    compute(value);
    index++;
  }
  input.close();

すべてのデータを読み取ったら、ストリームを close() することを忘れないでください。close() を実行しないとすべてのデータが書き込まれるわけではないため (以前に flush() を実行した場合を除く)、これは書き込み時にさらに重要になります。

于 2013-04-21T18:17:37.083 に答える
0

CorsiKa の「Java で String が整数であるかどうかを判断する」への回答から、次のように String が有効な int であるかどうかを確認できます。

public static boolean isInteger(String s) {
    try { 
        Integer.parseInt(s); 
    } catch(NumberFormatException e) { 
        return false; 
    }
    // only got here if we didn't return false
    return true;
}
于 2013-04-21T17:47:12.153 に答える