23. oktober 2008 - 11:28Der 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 :)?)
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?
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.
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);
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);
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.