Pages: [1]   Go Down
Author Topic: sharing Serial between instances of Library objs  (Read 307 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 296
Got Karma?
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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?

tx!

--Roy

Here's some code -

-- a method in the Library object to get the motor position:
Code:
int Gamoto::getmPosition(){
   return ReadReg(gxmPosition,3);
}

--the ReadReg method in that object
Code:
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
      WriteBytes(wBuffer,5);

      //delay(5); // this didn't work
      // Get the response
      ReadBytes(rBuffer,&bytes_read,RegLen+2);
      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)

Code:
void ReadBytes(unsigned char* buffer, long* bytesRead, int len){
 
  while(Serial1.available()){
      int i;
      for(i = 0; i < len; i++){
        bytesRead++;
        buffer[i] =  Serial1.read();
      }
    }
}
« Last Edit: April 08, 2009, 12:23:02 am by roypardi » Logged

Pages: [1]   Go Up
Jump to: