Skeggy88 Posted November 27, 2012 Report Posted November 27, 2012 Hi, I'm building an application that allow to control a DAQ. This DAQ acquires data and turn on and off a light. Labview and Java communicates, but I read wrong data. The DAQ acquires double samples that are converted in String format and sent via tcp. Numbers are like 0,00006 ; 1, 50000043 etc... In Java i receive data like 54; 42 etc... What's wrong? I also tried the big-endian/little-endian conversione without results. Can someone help me? In labview I can write only Strings, but if I try to use a buffered reader with the instrucion br.readLine() the program doesn't work. Thanks and sorry for my english, Veronica Quote
Mr Mike Posted November 27, 2012 Report Posted November 27, 2012 Hi, I'm building an application that allow to control a DAQ. This DAQ acquires data and turn on and off a light. Labview and Java communicates, but I read wrong data. The DAQ acquires double samples that are converted in String format and sent via tcp. Numbers are like 0,00006 ; 1, 50000043 etc... In Java i receive data like 54; 42 etc... What's wrong? I also tried the big-endian/little-endian conversione without results. Can someone help me? In labview I can write only Strings, but if I try to use a buffered reader with the instrucion br.readLine() the program doesn't work. Thanks and sorry for my english, Veronica Veronica, It would help if you posted an example of your LabVIEW code and Java code so we can understand what's going wrong. Quote
Mellroth Posted November 27, 2012 Report Posted November 27, 2012 ...In Java i receive data like 54; 42 etc... Can it be that you see the ASCII values corresponding to the characters you send from LabVIEW? /J Quote
Skeggy88 Posted November 28, 2012 Author Report Posted November 28, 2012 (edited) Thanks for replays. This is my VI: And this is the related java code... I know that I shoudn't use int to read from the socket, but if I use a BufferedReader the program doesn't work (no output). import java.io.*; import java.net.*; import java.nio.ByteBuffer; import java.nio.ByteOrder; public class ServerThread extends Thread { public ServerThread() { } @Override public void run(){ ServerSocket welcomeSocket; InputStream myInputStream; try { welcomeSocket = new ServerSocket(2056); Socket connectionSocket = welcomeSocket.accept(); System.out.println(connectionSocket); myInputStream=connectionSocket.getInputStream(); int b; while ((b = myInputStream.read()) != -1) { System.out.println(b); } } catch (IOException ex) { } } [/CODE] Edited November 28, 2012 by Skeggy88 Quote
Mr Mike Posted November 28, 2012 Report Posted November 28, 2012 Can it be that you see the ASCII values corresponding to the characters you send from LabVIEW? /J public void run(){ ServerSocket welcomeSocket; InputStream myInputStream; try { welcomeSocket = new ServerSocket(2056); Socket connectionSocket = welcomeSocket.accept(); System.out.println(connectionSocket); myInputStream=connectionSocket.getInputStream(); int b; while ((b = myInputStream.read()) != -1) { System.out.println(b); } } catch (IOException ex) { } [/CODE]Mellroth is right. The documentation for InputStream.read() says that it returns a byte at a time. You're reading byte values. You need to convert them to text. Store them as bytes and then put those bytes into a string constructor where you specify the character set as "ISO-8859-1": new String(bytes, "ISO-8859-1"). Of course, then your data would be a string, not a double.[u]However[/u], this is probably the worst way possible to transfer data short of using a messenger pigeon. A) It's slower than molasses. B) You lose precision. C) It places the burden of formatting the data for display on the part of the code that gets the data.You should probably use Flatten to String and then transmit that string. On the Java side, read [b]8[/b] bytes at a time and then use Java to assemble those bytes into a double. Note: you may need to change the endianness! 1 Quote
Mr Mike Posted November 28, 2012 Report Posted November 28, 2012 I think that with the name 'Veronica,' the way you speak, and that you said "Sorry for my English" you're Italian. No? You can speak Italian here, here, and here. Penso che col nome 'Veronica,' Suo modo di parlare, e che Lei ha detto "Sorry for my English" Lei è italiana. No? Lei puo parlare in italiano qui, qui, e qui. Mi sono dimenticato la maggiorparte del mio italiano perche non l'ho parlato da 2006. Mi dispiace. Quote
Skeggy88 Posted November 28, 2012 Author Report Posted November 28, 2012 (edited) I modified the VI and also the code. http://bayimg.com/EAgiGAAeI In labview I can choose between little endian and big endian and I either tried, but I obtained values like 1.1319598827449316E-72 instead of, for example, 0,0145643. However thanks because is really fast import java.io.*; import java.net.*; import java.nio.ByteBuffer; import java.nio.ByteOrder; public class ServerThread extends Thread { public ServerThread() { } @Override public void run(){ ServerSocket welcomeSocket; InputStream myInputStream; byte[] array = new byte[8]; int i=0; try { welcomeSocket = new ServerSocket(2056); Socket connectionSocket = welcomeSocket.accept(); System.out.println(connectionSocket); myInputStream=connectionSocket.getInputStream(); Double num; int b; while ((b = myInputStream.read()) != -1) { array[i]= (byte) b; if(i==7){ num = toDouble(array); System.out.println(num); i=0; } else { i++; } } } catch (IOException ex) { } } public static double toDouble(byte[] bytes) { return ByteBuffer.wrap(bytes).getDouble(); } } [/CODE]I know that there are italian forums, but I prefer american forums because members are more active. And I also know that my english is terrible I hope you understand me! Edited November 28, 2012 by Skeggy88 Quote
Mr Mike Posted November 28, 2012 Report Posted November 28, 2012 I modified the VI and also the code. http://bayimg.com/EAgiGAAeI In labview I can choose between little endian and big endian and I either tried, but I obtained values like 1.1319598827449316E-72 instead of, for example, 0,0145643. However thanks because is really fast I think the problem is that you're not wiring a double into the Flatten To String. Check the length of the string produced by Flatten To String. It should only be 8 if you wire in a double. No more and no less. You had a node to convert the data wire to a double in the original. You should use that. I recognize the node, but I can't remember what it's called. (You might be able to use a regular Double conversion bullet). Quote
Skeggy88 Posted November 28, 2012 Author Report Posted November 28, 2012 It works!!! Thank you so much!!! I post the solution if it can help someone. Quote
Rolf Kalbermatter Posted November 29, 2012 Report Posted November 29, 2012 Mellroth is right. The documentation for InputStream.read() says that it returns a byte at a time. You're reading byte values. You need to convert them to text. Store them as bytes and then put those bytes into a string constructor where you specify the character set as "ISO-8859-1": new String(bytes, "ISO-8859-1"). Of course, then your data would be a string, not a double. However, this is probably the worst way possible to transfer data short of using a messenger pigeon. A) It's slower than molasses. B) You lose precision. C) It places the burden of formatting the data for display on the part of the code that gets the data. You should probably use Flatten to String and then transmit that string. On the Java side, read 8 bytes at a time and then use Java to assemble those bytes into a double. Note: you may need to change the endianness! Aside from any encoding issues, it would be enough to change the line: System.out.println(b);[/CODE][font=arial,helvetica,sans-serif]to[/font][CODE] System.out.println((char)b);[/CODE][font=arial,helvetica,sans-serif]The first invokes the println(int number) method, while the second invokes the println(char character) method. This of course will only work for ASCII characters up to decimal code 127 which LabVIEW should be normally generating, unless you use foreign language characters in the format specifiers itself.[/font][font=arial,helvetica,sans-serif]If you need proper character encoding too, you would have to wrap the input stream into an input reader of some sort.[/font] Quote
Cate Posted December 1, 2012 Report Posted December 1, 2012 Hi there! I've already dealt with a similar problem and I solved it with a library that I found in NI Third-Party add-ons: http://sine.ni.com/nips/cds/view/p/lang/en/nid/210042 Try to take a look. Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.