sharing Serial between instances of Library objs

Hi -

I created a Library of for a particular motor controller board because there is a lot of reading/writing to registers on the board and because I need two of these boards in a project, I figured it would be easier to create instances of my library object and just pass in the specific address/ID to each instance. Oh - this is with the Wiring board because I need two serial ports - one to the motor controllers and one to a PC.

It’s working but the wrinkle comes with accessing/sharing the Serial port so each instance can do the communication it needs. I solved that by including two methods in my sketch and referencing them in the Library like this

 extern void ReadBytes(unsigned char*, long*, int);
 extern void WriteBytes(unsigned char*, int);

And it works! - for one instance at least - haven’t hooked up the other board yet. The only problem (so far…) is that every other read comes back 0 - (I’ll include the specific code below).

The deal with the board is to read a register, you first have to write to the board to tell it what register you want to read from. I tried putting in a delay between the write and the read but that didn’t help.

If I have made any sense so far (…) does anyone have a suggestion of where I might put a delay, or some other method to insure that there my data reads come back with valid data.

A lot to wade through - but I thought going with a Library was a cleaner way to go. Maybe not?



Here’s some code -

– a method in the Library object to get the motor position:

int Gamoto::getmPosition(){
   return ReadReg(gxmPosition,3);

–the ReadReg method in that object

int Gamoto::ReadReg(int RegAdr, int RegLen) {
      // Reads a value from a Gamoto Register
   int Regvalue=0;
    long bytes_read;
      // Build the command
      wBuffer[0]= gxHEADER;
      wBuffer[1]= gxWRITE;
      wBuffer[2]= RegAdr;
      wBuffer[3]= RegLen;
      wBuffer[4]= CheckSum(wBuffer,4);
      // Send the command

      //delay(5); // this didn't work
      // Get the response
      if (bytes_read>0){
            // We got a response - now parse the result
      for (int i=0;i<RegLen;i++) {
            Regvalue += rBuffer[i+1] * (1<<(8*i));
            // Handle negative case
      if (Regvalue >= (1<<(8*RegLen))/2)
            Regvalue -= 1<<(8*RegLen);
      return Regvalue;

–and finally the ReadBytes routine in my sketch that gets called by the Library instance (this populates a buffer in the Library instance with the read data)

void ReadBytes(unsigned char* buffer, long* bytesRead, int len){
      int i;
      for(i = 0; i < len; i++){
        buffer[i] =;