2

Java インターフェイスでひずみゲージの表示番号を作成しようとしています。

ひずみゲージ回路が動作しており、その電圧をマイクロコントローラー (PIC16F877A) プログラムに送信して、アナログからデジタルへの変換を行い、シリアル ポートに数値を出力します。興味のある方は、次のコードをご覧ください。

unsigned short analog;            //Variable for analog voltage
long tlong;
unsigned char ch;                    //

void main() {
  USART_Init(19200);              //set baude rate

  ADCON1 = 0;                     //All PORTA pins as analog, VDD as Vref
  TRISA  = 0xFF;                  //All PORTA is input

  do {
    analog = ADC_Read(2) >> 2;    //Read 10-bit ADC from AN2 and discard 2 LS bit

    tlong = (long)analog * 5000;  // Convert the result in millivolts
    tlong = tlong / 1023;         // 0..1023 -> 0-5000mV
    ch = tlong / 1000;            // Extract volts (thousands of millivolts) from result

    USART_Write(48+ch);           // Write result in ASCII format
    USART_Write('.');

    ch = (tlong / 100) % 10;      // Extract hundreds of millivolts
    USART_Write(48+ch);           // Write result in ASCII format

    ch = (tlong / 10) % 10;       // Extract tens of millivolts
    USART_Write(48+ch);           // Write result in ASCII format

    ch = tlong % 10;              // Extract digits for millivolts
    USART_Write(48+ch);           // Write result in ASCII format
    USART_Write(' ');
    USART_Write(' ');
    USART_Write(' ');

    Delay_ms(1000);
  } while (1);
}

ひずみゲージを動かしても、出力数値が本来の方法で変化しないため、これは完全には機能しません。誰かがそのためのアイデアを持っているなら、それは大歓迎です。

しかし、とにかく先に進み、それらの番号を Java プログラムに送りました。これをオンラインで見つけて、自分のデザインに合うように変更しました。

import java.io.*;
import java.util.*; 
import gnu.io.*;


public class SimpleRead implements Runnable, SerialPortEventListener {
    static CommPortIdentifier portId;
    static Enumeration portList;

InputStream inputStream;
SerialPort serialPort;
Thread readThread;
static byte[] readBuffer;
public static int result2;

public static void main(String[] args) {
    portList = CommPortIdentifier.getPortIdentifiers();
    System.out.println("portList... " + portList);

    while (portList.hasMoreElements()) {
        portId = (CommPortIdentifier) portList.nextElement();
        if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
            System.out.println("port identified is Serial.. "
                    + portId.getPortType());
            if (portId.getName().equals("COM4")) {
                System.out.println("port identified is COM4.. "
                        + portId.getName());
                // if (portId.getName().equals("/dev/term/a")) {
                SimpleRead reader = new SimpleRead();
            } else {
                System.out.println("unable to open port");
            }
        }
    }
}

public SimpleRead() {
    try {
        System.out.println("In SimpleRead() contructor");
        serialPort = (SerialPort) portId.open("SimpleReadApp1111",500);
        System.out.println(" Serial Port.. " + serialPort);
    } catch (PortInUseException e) {
        System.out.println("Port in use Exception");
    }
    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 {

        serialPort.setSerialPortParams(19200, SerialPort.DATABITS_8,
                SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);

        // no handshaking or other flow control
        serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);

        // timer on any read of the serial port
        serialPort.enableReceiveTimeout(500);

        System.out.println("................");

    } catch (UnsupportedCommOperationException e) {
        System.out.println("UnSupported comm operation");
    }
    readThread = new Thread(this);
    readThread.start();
}

public void run() {
    try {
        System.out.println("In run() function ");
        Thread.sleep(500);
        // System.out.println();
    } catch (InterruptedException e) {
        System.out.println("Interrupted Exception in run() method");
    }
}

public void serialEvent(SerialPortEvent event) {

    // System.out.println("In Serial Event function().. " + event +
    // event.getEventType());
    switch (event.getEventType()) {
    /*
     * case SerialPortEvent.BI: case SerialPortEvent.OE: case
     * SerialPortEvent.FE: case SerialPortEvent.PE: case SerialPortEvent.CD:
     * case SerialPortEvent.CTS: case SerialPortEvent.DSR: case
     * SerialPortEvent.RI: case SerialPortEvent.OUTPUT_BUFFER_EMPTY: break;
     */
    case SerialPortEvent.DATA_AVAILABLE:
        readBuffer = new byte[500];

        try {

            while (inputStream.available()>0) {

                int numBytes = inputStream.read(readBuffer);

            //   System.out.println("Number of bytes read " + numBytes);
                System.out.print(new String(readBuffer));
            }



        } catch (IOException e) {
            System.out.println("IO Exception in SerialEvent()");
        }
        break;
    }
    // System.out.println();
/*  String one = new String(readBuffer);
    char two = one.charAt(0);
    System.out.println("Character at three: " + two);*/
}

}

前のコードと同じ範囲の数字 (シリアル ポートが 1 つなので、同じ数字かどうかはテストできません) を読み取りますが、.692 ではなく 320 と表示されることがあります。次の数字は 43 で、「.」だけかもしれません。表示されますが、すぐに元に戻ります。「readBuffer = new byte[500]」というバッファの問題だと思いました。サイズを500(元は8)に変更したところ、少し良くなりました。

とにかく、出力を整数に変換して計算を行う必要があり、整数として、すべての奇妙なデータを簡単に除外できます。最終的に、私の質問は、この出力データを使用可能な整数に変換するかどうかです。主な問題は、Java プログラムのどこでシリアル ポート番号を読み取っているのかさえわからないことです。変数はreadBufferだと思いますが、それを使用しようとするとエラーが発生します。通常は型の不一致です。

ですから、どんな助けも素晴らしいでしょう、ありがとう!

4

2 に答える 2

0

提供された情報から推測するのは難しいですが、あなたは言いました:

「.692 の代わりに 320 と表示されます」

主な問題は、Java プログラムのどこでシリアル ポート番号を読み取っているのかさえわからないことです。

受信したバイトバッファから整数を読み込もうとしている場合、これはバイトオーダーの問題のように見えます。また、受信したバイト バッファから float データを読み取ろうとすると、float 型の IEEE 規格が一致しない可能性があります。ただし、float 型を使用せず、整数のみを使用することをお勧めします。

Java 5+ を使用している場合は、nio パッケージの ByteBuffer クラスを次のように使用します。

    byte[] readBuffer = getBufferFromyourCode();
    ByteBuffer buffer = ByteBuffer.wrap(readBuffer); //wrap received byte buffer
    buffer.order(ByteOrder.LITTLE_ENDIAN);//set correct endiannes
    Integer version = buffer.getInt();// read first 4 bytes
    Integer length = buffer.getInt(); // read next 4 bytes
    byte[] rowMsg = new byte[length];// length = bytes to read
    buffer.get(rowMsg); // copies 'length' bytes in rowMsg
    String msg = new String(rowMsg); // convert to String
    System.out.println("Version "+version+" message received");
    System.out.println("Length: "+length);
    System.out.println("text: "+msg);

バイトオーダーの設定に注意してください。ビッグエンディアンとリトルエンディアンの両方を試して、バッファから読み取った値が正常に見えるかどうかを確認してください。ここでエンディアンの詳細を確認してください: http://en.wikipedia.org/wiki/Endiannes

于 2013-01-09T12:10:16.307 に答える
0

上記のコードをさらに調べたところ、上記のコードではストリームは次のようになっていると思います。

<x.xxx >したがって、毎回 8 バイトを読み取ると、1 つのデータ エントリになります。inputstreamreader を使用すると、バイトが文字に変換されます...

http://docs.oracle.com/javase/1.4.2/docs/api/java/io/InputStreamReader.htmlを確認してください

于 2012-04-20T00:23:38.823 に答える