Jump to content
Skeggy88

Sending Labview data via TCP

Recommended Posts

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

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

...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

Share this post


Link to post
Share on other sites

Thanks for replays.

This is my VI:

2iq4hf.png

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 by Skeggy88

Share this post


Link to post
Share on other sites

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!

  • Like 1

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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 :P I hope you understand me!

Edited by Skeggy88

Share this post


Link to post
Share on other sites

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).

Share this post


Link to post
Share on other sites

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]

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.