Page 1 of 1
NXT with Android Smartphone
Posted: 25 Aug 2012, 06:09
by freggel10
Hello,
When I work on the NXT Direct Commands (to control eg an engine without an external program) it works.
Now I want to send messages to the mailbox of the NXT. The messages would be processed by an external program. That does not work. What is wrong?
(Smartphone app sends message to NXT, LabVIEW VI reads mailbox from NXT)
Code: Select all
public void writeMessage(byte message) {
commandBuffer = ByteBuffer.allocate(14); // maximum 64 bytes
commandBuffer.order(ByteOrder.LITTLE_ENDIAN); // has to be little endian by definition
commandBuffer.putShort((short) 7); // announce that the message is 7 bytes long
commandBuffer.put((byte) 0x80); // no respond
commandBuffer.put((byte) 0x09); // Message Write
commandBuffer.put((byte) 0x01); // Inbox (0-9)
commandBuffer.put((byte) 0x02); // Message Size
commandBuffer.put((byte) 0); // Data
commandBuffer.put((byte) 0x00); // Null termination
commandBuffer.put(5, (byte) message);
try{
myOutputStream.write(commandBuffer.array());
} catch (IOException writeException){
cancel();
}
}
Code: Select all
commandBuffer.put(5, (byte) message);
Is 5 right?
Code: Select all
public void writeMessageButtonClick(View v) {
if (writeMessageButton.isChecked()) {
connection.writeMessage((byte) 0x33);
}else {
connection.writeMessage((byte) 0x34);
}
}
Thanks
Re: NXT with Android Smartphone
Posted: 27 Aug 2012, 13:36
by hassenplug
You may want to expand a bit when you say "it does not work".
One suggestion: on the NXT, you need to make sure the "Message Received" flag is set to true, or you may get invalid data from the mailbox.
Steve
Re: NXT with Android Smartphone
Posted: 28 Aug 2012, 05:30
by robotman2
Hi Freggel,
Are you using / have you used the NI software to communicate to the NXT? I think I am also a bit unclear exactly what is not working properly. I guess my biggest question is what type of software package are you using to communicate to the NXT?
I haven't looked too much into NI's software extension for the NXT, but in general NI software tends to use modules (VI's) that are custom written for their software and don't translate over to text-based programming too easily. An example of this might be the "mailbox" you mention. To my knowledge, the NXT does not have a mailbox and indeed may be NI lingo for handling received messages.
One point above that Steve mentioned above was that its always good to turn on your message response, or received messages, as they might be able to tell you what's going on.
If you could maybe expand upon your issues a bit more - I might be able to offer a bit more insight. Thanks!
Hope this helps,
Robotman!
(
http://www.robotappstore.com)
Re: NXT with Android Smartphone
Posted: 28 Aug 2012, 14:25
by freggel10
Hello,
Are you using / have you used the NI software to communicate to the NXT? I think I am also a bit unclear exactly what is not working properly. I guess my biggest question is what type of software package are you using to communicate to the NXT?
- I use LabVIEW2009 student edition with the NXT modul (Toolkit) 2009.
Now I have a wait of 100ms after reading the mailbox in my VI.
When I use the following code I get now the String "2". It works now. But if I use the above code, I get now the string "... ³ HTC One SX (and still 3 strange characters)" and not the String "2". Why I get another String? Is anything wrong?
This works:
Code: Select all
public void writeMessage() {
commandBuffer = ByteBuffer.allocate(8); // maximum 64 bytes //8
commandBuffer.order(ByteOrder.LITTLE_ENDIAN); // has to be little endian by definition
commandBuffer.putShort((short) 6); // announce that the message is 6 bytes long
commandBuffer.put((byte) 0x80); // no respond
commandBuffer.put((byte) 0x09); // MessageWrite
commandBuffer.put((byte) 0x00); // Inbox (0-9)
commandBuffer.put((byte) 0x02); // MessageSize
commandBuffer.put((byte) 0x32); // Data //String 2
commandBuffer.put((byte) 0x00); // Null termination (/0)
try{
myOutputStream.write(commandBuffer.array());
} catch (IOException writeException){
cancel();
}
}
Code: Select all
public void writeMessageButtonClick(View v) {
if (writeMessageButton.isChecked()) {
connection.writeMessage();
}else { }
}
Here I get the string "... ³ HTC One SX (and still 3 strange characters)" and not the String "2":
Code: Select all
public void writeMessage(byte message) {
commandBuffer = ByteBuffer.allocate(14); // maximum 64 bytes
commandBuffer.order(ByteOrder.LITTLE_ENDIAN); // has to be little endian by definition
commandBuffer.putShort((short) 7); // announce that the message is 7 bytes long
commandBuffer.put((byte) 0x80); // no respond
commandBuffer.put((byte) 0x09); // Message Write
commandBuffer.put((byte) 0x01); // Inbox (0-9)
commandBuffer.put((byte) 0x02); // Message Size
commandBuffer.put((byte) 0); // Data
commandBuffer.put((byte) 0x00); // Null termination
commandBuffer.put(5, (byte) message);
try{
myOutputStream.write(commandBuffer.array());
} catch (IOException writeException){
cancel();
}
}
Code: Select all
public void writeMessageButtonClick(View v) {
if (writeMessageButton.isChecked()) {
connection.writeMessage((byte) 0x32);
}else {
}
}
Thanks,
freggel10
Re: NXT with Android Smartphone
Posted: 29 Aug 2012, 13:51
by hassenplug
robotman2 wrote:I haven't looked too much into NI's software extension for the NXT, but in general NI software tends to use modules (VI's) that are custom written for their software and don't translate over to text-based programming too easily. An example of this might be the "mailbox" you mention. To my knowledge, the NXT does not have a mailbox and indeed may be NI lingo for handling received messages.
robotman2, You may want to research this a bit more before answering these types of question. The
mailbox is a concept used in LEGO's firmware, NXT-G, NI's Labview, and even NXC.
freggel10, in your code, you seem to be sending the message AFTER the null termination. It seems like you'd want to send it as the message/data byte
Code: Select all
commandBuffer.putShort((short) 7); // announce that the message is 7 bytes long
commandBuffer.put((byte) 0x80); // no respond
commandBuffer.put((byte) 0x09); // Message Write
commandBuffer.put((byte) 0x01); // Inbox (0-9)
commandBuffer.put((byte) 0x02); // Message Size
commandBuffer.put((byte) message); // actual message (data)
commandBuffer.put((byte) 0x00); // Null termination
Steve