Go Down

Topic: sharing Serial between instances of Library objs (Read 339 times) previous topic - next topic

roypardi

Apr 08, 2009, 07:18 am Last Edit: Apr 08, 2009, 07:23 am by roypardi Reason: 1
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: [Select]
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: [Select]
int Gamoto::getmPosition(){
  return ReadReg(gxmPosition,3);
}


--the ReadReg method in that object
Code: [Select]
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: [Select]
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();
     }
   }
}


Go Up