Avatar billede rosgaard Nybegynder
23. oktober 2008 - 11:28 Der er 7 kommentarer og
1 løsning

Matlab, java eller noget helt 3. RS232 kommunikation.

Hej
Jeg er i øjeblikket igang med en opgave, hvor jeg skal styre noget via 2 vejs seriel kommunikation.

Det skal kunne styres fra Matlab, men om det er en Java driver eller lignende gør ikke så meget, bare det kan klare opgaven uden at være alt for besværlig.

Jeg har næsten fået det til at virke i java, men spørgsmålet er så om jeg skal prøve at køre java koden fra matlab eller prøve at lave det hele i matlab i stedet?

Jeg prøvede lidt i starten at få rs232 op og køre i matlab, men det virkede ikke så effektivt som i java(sikkert mig der ikke er den skarpeste i matlab :)?)

Er der nogle som kan anbefale noget?

Mvh
Rosgaaard
Avatar billede arne_v Ekspert
24. oktober 2008 - 00:36 #1
Avatar billede rosgaard Nybegynder
24. oktober 2008 - 08:55 #2
Tak, der har jeg været inde og kigge lidt. Men det var mere om det måske var smartere at lave det hele i matlab? Det hele skal sendes i hexkode og der syntes jeg ikke java er så smart?
Avatar billede arne_v Ekspert
24. oktober 2008 - 14:40 #3
Java kan nemt laese og skrive binaere data via DataInputStream og DataOutputStream.

Hvis det sendes som hex tekst, saa skal man lave en lille konvertering mellem
String og byte[]. Jeg tror bestemt at jeg har noget kode liggende til det.
Avatar billede rosgaard Nybegynder
24. oktober 2008 - 15:39 #4
Ja det har jeg set nu efter at have arbejdet en del med det :)
Men problemet er lidt at hvis jeg feks skal sende int værdien 100000. Det giver så 0x86A0. Hvis jeg gerne vile sende den skal det komme i denne række følge(big endian).

<A0><5F><86><79><01><FE><00><FF>.

Altså efter hvert byte skal der sendes det samme bare modsat(komplementær).
Jeg har lavet det på denne måde, syntes bare det åndsvagt at lave det om til string, men kunne ikke finde på en anden løsning, måske du kunne ?

int h=i|0x10000000;
String s = Integer.toHexString(h).replaceFirst("1", "0");
int j=Integer.parseInt(s.substring(s.length()-2, s.length()),16);
int k=Integer.parseInt(s.substring(s.length()-4, s.length()-2),16);
int l=Integer.parseInt(s.substring(s.length()-6, s.length()-4),16);
int m=Integer.parseInt(s.substring(s.length()-8, s.length()-6),16);
                                       
int iArray[]= {0x52,0x52,0x52,0xFF,0x00,0x03,0xFC,0x04,0xFB,j,j^0xFF,k,
k^0xFF,l,l^0xFF,m,m^0xFF,0xAA,0xAA};
SendCommand(iArray);

Ved ikke om det giver mening ? :)
Avatar billede arne_v Ekspert
24. oktober 2008 - 17:49 #5
Proev med:

    public static byte[] int2bytesWithComp(int v) {
        byte[] res = new byte[8];
        res[0] = (byte) v;
        res[1] = (byte) ~res[0];
        res[2] = (byte) (v >> 8);
        res[3] = (byte) ~res[2];
        res[4] = (byte) (v >> 16);
        res[5] = (byte) ~res[4];
        res[6] = (byte) (v >> 24);
        res[7] = (byte) ~res[6];
        return res;
    }
Avatar billede rosgaard Nybegynder
29. oktober 2008 - 11:00 #6
Mange tak det virker fint, forstår ikke helt hvad der sker, men det skal jeg nok forstå på et tidspunkt :)

Er dog løbet ind i et andet problem. Jeg ved jeg burde modtage disse hexværdier:
52 52 52 00 FF 03 FC 04 fb 8f 70 c2 3d e1 1e ff 00 aa aa
Men det jeg får ud er det her:

----


Writing: <50><50><50><FF><0><3><FC><AA><AA>
Num Bytes : 8
>> 52525200ff03fc04
String: RRR ÿü to Hex: 52 52 52 00 ff 03 fc 04
Num Bytes : 8
>> -451ae689706f901
String: û®Q—hùÿ to Hex: fb ae 51 2014 68 f9 06 ff
Num Bytes : 3
>> aaaa0000000000
String: ªª  to Hex: 00 aa aa

----

Det giver fejl begge steder om jeg beholder det i string eller i bigint. Java og string er vidst noget med at alle ascii værdi'er mellem 128-160 giver ?, derfor er der nogle fejl der.
Den første linie her er fin nok modtaget/oversat
>> 52525200ff03fc04
men den næste
>> -451ae689706f901
ved -4 burde der stå fb og de resterende tal er byttet rundt, 51 og ae er byttet plads, 68 og 97 osv.

Har du en ide til hvordan det kan løses så jeg kan aflæse de hex værdier ordenligt?

Her er et udsnit af min kode hvor problemet sikkert er:

case SerialPortEvent.DATA_AVAILABLE:
    byte[] readBuffer = new byte[8];
    try {
      while (inputStream.available() > 0) {
        int numBytes = inputStream.read(readBuffer);
        System.out.println("Num Bytes : " + (byte) numBytes);
      }
    BigInteger bi = new BigInteger(readBuffer);
        String s = bi.toString(16);

        System.out.println(">> " + s);
        System.out.println("String: "+new String(readBuffer)+" to Hex: "+StringToHex(new String(readBuffer)));
        } catch (IOException e) {
      System.out.println(e);
          close();
        }
        break;
Avatar billede rosgaard Nybegynder
10. november 2008 - 13:14 #7
smid et svar arne_v. Fik klaret resten, men ellers tak for hjælpen.
Avatar billede arne_v Ekspert
10. november 2008 - 14:54 #8
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester