NXC RS-485 communication program problem

Discussion specific to NXT-G, NXC, NBC, RobotC, Lejos, and more.
chanyh
Posts: 17
Joined: 11 Oct 2010, 05:14

Re: NXC RS-485 communication program problem

Post by chanyh »

Thanks, John.

I have a program which was adopted from the "Bricxcc". It sends a string "fine". If I send an integer, I use "NumToStr()".

If it changes to send an integer, how can I do?

The conditions are :
1) Use "SendRS485Number(const int value)" or others;
2) Not use "SendRS485String()";
3) Not use "NumToStr()"

Code: Select all

void SendRS485Message(const string msg)
  {
     byte mlen = ArrayLen(msg);
     SetHSOutputBuffer(0, mlen, msg);
     SetHSOutputBufferOutPtr(0);
     SetHSOutputBufferInPtr(mlen);
     SetHSState(HS_SEND_DATA);
     SetHSFlags(HS_UPDATE); //send it
  }

task main()
  {
     SetSensorType(IN_4, SENSOR_TYPE_HIGHSPEED);
     SetHSState(HS_INITIALISE);
     SetHSFlags(HS_UPDATE);
     Wait(10);
     while (true)
       {
          SendRS485Message("fine");
          Wait(50);
       }
  }
YH Chan
mattallen37
Posts: 1818
Joined: 02 Oct 2010, 02:19
Location: Michigan USA
Contact:

Re: NXC RS-485 communication program problem

Post by mattallen37 »

That "SendRS485Number(const int value)" refers to a void that is in the program, and in it, it uses "NumToStr()" to turn it into a string, and "SendRS485String()" to send the string. I think only strings can be sent, which isn't a problem. You can flatten a variable, and then send it, and unflatten it on the other NXT.
Matt
http://mattallen37.wordpress.com/

I'm all for gun control... that's why I use both hands when shooting ;)
jojoguy14
Posts: 155
Joined: 29 Sep 2010, 12:49
Contact:

Re: NXC RS-485 communication program problem

Post by jojoguy14 »

Ya...I've also been thinking if it's possible to make a custom NXT-G block for RS-485 commands. Does anyone have any documentation I could look at about RS-485? Does LEGO have a document? Has someone already tried to make this kind of block?

jojoguy10
Creator of LEGO-X TechN'XT! (http://lego-x.com http://techn-xt.blogspot.com)
Known as jojoguy10
afanofosc
Site Admin
Posts: 1256
Joined: 26 Sep 2010, 19:36
Location: Nashville, TN
Contact:

Re: NXC RS-485 communication program problem

Post by afanofosc »

Please see the RS485 API functions in the NXC Guide and help files. The example files are not great, sadly, but they can be improved. The code posted above was written prior to the addition of the official API functions and they require the enhanced NBC/NXC firmware.
rs485.JPG
rs485.JPG (89.79 KiB) Viewed 10722 times
When you send a number or a bool the API functions (which are called functions or procedures - not "void") flatten the data to a string. This is not the same as calling NumToStr. Calling NumToStr on a number will change 123456 into "123456" with a trailing null (0x00) terminator. 7 bytes of data. Using Flatten - which the SendRS485Number and SendRS485Bool functions do - will convert 123456 into a "string" containing 0x40, 0xE2, 0x01, 0x00, 0x00 (little-endian). 5 bytes of data. All numbers are flattened into a long (i.e., 4 byte) value plus a null. Bools are flattened into a single byte (0x00 or 0x01) followed by a null. This was done to adhere to the standard LEGO protocol used for sending numbers and bools via the mailbox system over Bluetooth.

You can, of course, use your own scheme for encoding and decoding messages you send via RS485 (or Bluetooth).

John Hansen
Multi-platform LEGO MINDSTORMS programming
http://bricxcc.sourceforge.net/
spammyk
Posts: 2
Joined: 27 Oct 2010, 10:37

NXC RS-485 Direct communication 2 NXTs

Post by spammyk »

Dear all,

since it is possible to connect 2 NXTs via RS485 I have the following question.

In the code examples it is always just interchanging values.

When 2 NXTs are connected via bluetooth then it is possible that the master directly sends commands to access motors / sensors at the slave NXT.

Is this also possible using RS485? (Or if not... is it planned?)

Regards

Kai
afanofosc
Site Admin
Posts: 1256
Joined: 26 Sep 2010, 19:36
Location: Nashville, TN
Contact:

Re: NXC RS-485 communication program problem

Post by afanofosc »

While at LEGO World and in the days prior to travelling I worked on enhancements to the firmware which would allow you to send direct and system commands from one NXT to another via either bluetooth or RS-485. I am still sorting out some brick hanging issues that I have encountered when processing incoming RS-485 data using the same "interpret" function that incoming bluetooth and USB data is fed through by default. If/when I get it working without problems then it will be exposed to NBC and NXC users with the enhanced firmware installed via Remote* API functions which take a connection number as the first parameter. Connections 0 through 3 are CONN_BT0, CONN_BT1, CONN_BT2, and CONN_BT3. Connection number 4 is CONN_HS4 and if you call an API function with that connection number it will attempt to communicate over RS-485 rather than Bluetooth.

Additionally, I am working on a minor change to the enhanced firmware which makes it always handle direct and system command responses rather than discarding all of them except for the MessageRead direct command (which is used by the firmware to handle reading a message from a remote NXT's response mailbox and writing it to the corresponding local NXT's mailbox). My initial thought (already partially implemented) is to copy the incoming direct and system command response data into a "last response" buffer that can be accessed via a new system call function that reads/clears the last response buffer. Using this new feature in conjunction with the RS-485 direct/system command processing changes, the intent is that all the existing direct and system commands will be supported, with those requiring a response actually waiting for the response to arrive and passing the relevant response data back to the user via the function call parameters.

I will almost certainly be adding more direct commands, as well, to expose more of the remote NXT's functionality to a "master" NXT so that you could also do things like output to the LCD. I'm considering adding a new API layer around existing API functions for reading sensor values and controlling motors so that you can do something like this:

Code: Select all

// control local motors
OnFwd(CONN_BT0, OUT_A, 75);
Wait(SEC_1);
OnRev(CONN_BT0, OUT_A, 75);
Wait(SEC_1);
Off(CONN_BT0, OUT_A);
// control motors on bluetooth connection 1
OnFwd(CONN_BT1, OUT_A, 75);
Wait(SEC_1);
OnRev(CONN_BT1, OUT_A, 75);
Wait(SEC_1);
Off(CONN_BT1, OUT_A);
// control motors on RS-485 connection 4 (device 0)
OnFwd(CONN_HS4, OUT_A, 75);
Wait(SEC_1);
OnRev(CONN_HS4, OUT_A, 75);
Wait(SEC_1);
Off(CONN_HS4, OUT_A);
In theory, with NXT's connected via RS-485 I could add a byte to the direct and system command protocol which would be a device ID/address byte so that you could connect more than one NXT as a remote slave over the hi-speed port and the direct/system command would only be processed by the slave with the specified device ID.

Does any of this sound interesting?

John Hansen
Multi-platform LEGO MINDSTORMS programming
http://bricxcc.sourceforge.net/
HaWe
Posts: 2500
Joined: 04 Nov 2014, 19:00

Re: NXC RS-485 communication program problem

Post by HaWe »

VERY interesting!
have you also some intentions to control motors by remote encoder targets or PID (like BTRotateMotorEx, RSRotateMotorPID) and to enable remote sensor setting and polling (like BTSetSensor, RSSensorValue)?
spammyk
Posts: 2
Joined: 27 Oct 2010, 10:37

Re: NXC RS-485 communication program problem

Post by spammyk »

Hello John,

thank you for the fast answer and YES it sounds great!!! :D

And I value it a lot that you develop that kidn of things for the mindstorm community.
How will you announce news / new functions implemented to NXC?

Kind regards

Kai
jojoguy14
Posts: 155
Joined: 29 Sep 2010, 12:49
Contact:

Re: NXC RS-485 communication program problem

Post by jojoguy14 »

John,

Awesome! I was planning on making a Guitar Hero playing robot, but I needed two NXT's and using bluetooth, it would be too slow. So, this'll make me want to learn how to code in C and learn how to use Bricxcc!

Thanks a bunch!

jojoguy10
Creator of LEGO-X TechN'XT! (http://lego-x.com http://techn-xt.blogspot.com)
Known as jojoguy10
Post Reply

Who is online

Users browsing this forum: No registered users and 3 guests