CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

2 UARTS sharing a function call

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
OJ
Guest







2 UARTS sharing a function call
PostPosted: Wed Feb 20, 2008 2:28 pm     Reply with quote

I don't know how to explain this but I am trying to implement the use of two UARTs. I want to be able to share the same function call when extracting data from either buffer but I don't know how to go about it. Is there anyone that can help? Thanks in advance!

NOTE: this section inside get_packet() is not being printed correctly on this post.
Quote:
for(i=1; i<9> 0){OK++;}

this should be within the for loop: if(! strncmp ( temp,CMD[i],3)){command =i;}} followed by: if( command > 0) {OK++;}


The following code below works perfect for one UART:
Code:


#include <18F67J60.h>
#device adc=12
#FUSES NOWDT, WDT128, HS, NODEBUG, NOXINST, STVREN, NOPROTECT, FCMEN, IESO, ETHLED, PRIMARY, RESERVED
#use delay(clock=25000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=USB)
#use rs232(baud=9600,parity=N,xmit=PIN_B1,rcv=PIN_B0,bits=8,stream=UART)
#include <string.h>

#define BUFFER_SIZE 32
char packet[BUFFER_SIZE];
char USB_buffer[BUFFER_SIZE];
char UART_buffer[BUFFER_SIZE];
int index=0,next = 0;


int command,data_reg,length;
char CMD[9][4]="ERR","RTC","ADC","DAC","TCP","MMC","DIO","SLP","FLA"; //Command
int  REG[9]={0,4,4,4,4,9,8,1,1};   // # of registers for each command

// Read example:  CMD00\0x0D
// Write example:  CMD10123456\0x0D

char temp[2];

/******************** Initialize Ports *****************************************/
void Initialize(void)
{
   enable_interrupts(INT_RDA);
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);
}

/******************** Serial Receive Interrupt *********************************/
#int_rda
void USB_Receive()
{
  int t;
   USB_buffer[index] = fgetc(USB);
   t = index;
   index = (index + 1) % BUFFER_SIZE;
   if(index == next)
     index = t;
}

/******************** Serial Receive Interrupt *********************************/
#int_ext
void UART_Receive()
{
  int t;
   UART_buffer[index] = fgetc(UART);
   t = index;
   index = (index + 1) % BUFFER_SIZE;
   if(index == next)
     index = t;
}

/******************** Get Character From Buffer ********************************/
#define DataAvailable (index!=next)
char get_char()
{
   int t=0,timeout=false;
   char c;

    while(!DataAvailable)
    {
      t++;
      delay_us(600);
      if(t > 5){timeout = true; break;}
    }
   
    if(timeout){timeout = false; return (-1);}
    else
    {
      c = USB_buffer[next];
      next = (next + 1) % BUFFER_SIZE;
      return(c);
    }
}

/******************** Get Packet ***********************************************/
int get_packet()
{
   int valid=true,i,OK=0;
   command=0;
   length=0;
   
      packet[0] = get_char();
      packet[1] = get_char();                                      //GET COMMAND
      packet[2] = get_char();
     
 
   for(i=0; i<=2; i++){temp[i] = packet[i];}
   for(i=1; i<9> 0){OK++;}
   
   packet[3] = (get_char()- 48);
   if((packet[3] == 0)||(packet[3] == 1)){OK++;}                  //GET R/W BIT

   packet[4] = (get_char()- 48);
   if((packet[4] >= 0 )&&(packet[4] <= REG[command]))         //GET REGISTER BIT
   {
      data_reg = packet[4];
      OK++;
   }
   
   if(packet[3]== 1)
   {
      for(i=5;i<BUFFER_SIZE; i++)
      {
         packet[i] = get_char();                     //GET LENGTH OF DATA & DATA
         length++;                                             
         if((packet[i] == 0x0D)||(packet[i] == -1)){length--; break;}
      }
   
      if(packet[length + 5] == 0x0D){OK++;}                //GET CARRIAGE RETURN 
   }
   else
   {
      packet[5]= get_char(); 
      if(packet[5] == 0x0D){OK++;}
   }

   if(OK == 4){valid = true;}
   else{valid = false;}

   return valid;
}

/******************** Main Loop ************************************************/
void main()
{
   Initialize();
 
   while (true)
   {
     if(DataAvailable)
     {     
         if(get_packet())         
         {
           fprintf(USB,"command=%d bit=%d register=%d length=%d\n",command,packet[3],packet[4],length);
           index = 0;next = 0;
        }
     }
   }
}



I tried modifying the get_packet() & get_char() functions in the code below but it doesn't seem to work.


Code:


******************** Get Character From Buffer ********************************/
#define DataAvailable (index!=next)
char get_char(char* buffer)
{
   int t=0,timeout=false;
   char c;

    while(!DataAvailable)
    {
      t++;
      delay_us(600);
      if(t > 5){timeout = true; break;}
    }
   
    if(timeout){timeout = false; return (-1);}
    else
    {
      c = buffer[next];
      next = (next + 1) % BUFFER_SIZE;
      return(c);
    }
}

/******************** Get Packet ***********************************************/
int get_packet(char* buffer)
{
   int valid=true,i,OK=0;
   command=0;
   length=0;
   
      packet[0] = get_char(buffer);
      packet[1] = get_char(buffer);                                //GET COMMAND
      packet[2] = get_char(buffer);
     
 
   for(i=0; i<=2; i++){temp[i] = packet[i];}
   for(i=1; i<9> 0){OK++;}
   
   packet[3] = (get_char(buffer)- 48);
   if((packet[3] == 0)||(packet[3] == 1)){OK++;}                   //GET R/W BIT

   packet[4] = (get_char(buffer)- 48);
   if((packet[4] >= 0 )&&(packet[4] <= REG[command]))         //GET REGISTER BIT
   {
      data_reg = packet[4];
      OK++;
   }
   
   if(packet[3]== 1)
   {
      for(i=5;i<BUFFER_SIZE; i++)
      {
         packet[i] = get_char(buffer);                     //GET LENGTH OF DATA & DATA
         length++;                                             
         if((packet[i] == 0x0D)||(packet[i] == -1)){length--; break;}
      }
   
      if(packet[length + 5] == 0x0D){OK++;}                //GET CARRIAGE RETURN 
   }
   else
   {
      packet[5]= get_char(buffer); 
      if(packet[5] == 0x0D){OK++;}
   }

   if(OK == 4){valid = true;}
   else{valid = false;}

   return valid;
}

/******************** Main Loop ************************************************/
void main()
{
   Initialize();
 
   while (true)
   {
     if(DataAvailable)
     {     
         if(get_packet(USB_buffer))         
         {
           fprintf(USB,"command=%d bit=%d register=%d length=%d\n",command,packet[3],packet[4],length);
           index = 0;next = 0;
         }

         if(get_packet(UART_buffer))         
         {
           fprintf(UART,"command=%d bit=%d register=%d length=%d\n",command,packet[3],packet[4],length);
           index = 0;next = 0;
         }
     }
   }
Ken Johnson



Joined: 23 Mar 2006
Posts: 197
Location: Lewisburg, WV

View user's profile Send private message

PostPosted: Wed Feb 20, 2008 3:10 pm     Reply with quote

1st - I don't know this part (sorry) - are these 2 hardware uarts? I'll assume yes; if not, I'm not sure you can pull this off.

2nd - assuming these are both active, you need separate indices for each buffer (you do have 2 separate buffers).

3rd - #int_ext is not a uart interrupt, do you want #int_rda2 ?

Well, that's my (maybe useless) comments, for starters. I didn't go into the meat of your code at all. Hope this helps a little.

Ken
OJ
Guest







Re: 2 UARTS sharing a function call
PostPosted: Wed Feb 20, 2008 4:39 pm     Reply with quote

Thank you for your input but I managed to get it working....just need to clean it up a little.

Here is working code for extracting data from a packet (using two UARTs) using a shared function.




Code:

#include <18F67J60.h>
#device adc=8
#FUSES NOWDT, WDT128, HS, NODEBUG, NOXINST, STVREN, NOPROTECT, FCMEN, IESO, ETHLED, PRIMARY, RESERVED
#use delay(clock=25000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=USB)
#use rs232(baud=9600,parity=N,xmit=PIN_B1,rcv=PIN_B0,bits=8,stream=UART)
#include <string.h>

#define BUFFER_SIZE 32
char packet[BUFFER_SIZE];
char USB_buffer[BUFFER_SIZE];
char UART_buffer[BUFFER_SIZE];
int USB_i=0,USB_o=0,UART_i=0,UART_o=0,select=1;


int command,data_reg,length;
char CMD[9][4]="ERR","RTC","ADC","DAC","TCP","MMC","DIO","SLP","FLA";
int  REG[9]={0,4,4,4,4,9,8,1,1};

char temp[2];

/******************** Initialize Ports ***************************/
void Initialize(void)
{
   enable_interrupts(INT_RDA);
   ext_int_edge(H_TO_L);   
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);
}

/******************** Serial Receive Interrupt *******************/
#int_rda
void USB_Receive()
{
  int t;
   USB_buffer[USB_i] = fgetc(USB);
   t = USB_i;
   USB_i = (USB_i + 1) % BUFFER_SIZE;
   if(USB_i == USB_o)
     USB_i = t;
}

/******************** Serial Receive Interrupt *******************/
#int_ext
void UART_Receive()
{
  int t;
   UART_buffer[UART_i] = fgetc(UART);
   t = UART_i;
   UART_i = (UART_i + 1) % BUFFER_SIZE;
   if(UART_i == UART_o)
     UART_i = t;
}

/******************** Get Character From Buffer ****************/
#define USB_Data (USB_i != USB_o)
#define UART_Data (UART_i != UART_o)

char get_char()
{
   int t=0,timeout=false;
   char c;

    if(select==1)
    {
      while(!USB_Data)
      {
         t++;
         delay_us(600);
         if(t > 5){timeout = true; break;}
      }
    }
   
     if(select==2)
    {
      while(!UART_Data)
      {
         t++;
         delay_us(600);
         if(t > 5){timeout = true; break;}
      }
    }
   
    if(timeout){timeout = false; return (-1);}
    else
    {
      if(select==1)
      {
         c = USB_buffer[USB_o];
         USB_o = (USB_o + 1) % BUFFER_SIZE;
      }

      if(select==2)
      {
         c = UART_buffer[UART_o];
         UART_o = (UART_o + 1) % BUFFER_SIZE;
      }
      return(c);
    }
}

/******************** Get Packet  *****************************/
int get_packet()
{
   int valid=true,i,OK=0;
   command=0;
   length=0;
   
      packet[0] = get_char();
      packet[1] = get_char();                                    //GET COMMAND
      packet[2] = get_char();
     
   for(i=0; i<=2; i++){temp[i] = packet[i];}
   for(i=1; i<9;i++)
   {
      if (!strncmp(temp,CMD[i],3)){command = i;}
   }
  if(command > 0){OK++;}
   
   packet[3] = (get_char()- 48);
   if((packet[3] == 0)||(packet[3] == 1)){OK++;}     //GET R/W BIT

   packet[4] = (get_char()- 48);
   if((packet[4] >= 0 )&&(packet[4] <= REG[command]))    //GET REG BIT
   {
      data_reg = packet[4];
      OK++;
   }
   
   if(packet[3]== 1)                          //CHECK IF WRITE SELECTED
   {
      for(i=5;i<BUFFER_SIZE; i++)
      {
         packet[i] = get_char();            //GET LENGTH  & DATA
         length++;                                             
         if((packet[i] == 0x0D)||(packet[i] == -1)){length--; break;}
      }
   
      if(packet[length + 5] == 0x0D){OK++;}    //GET CARRIAGE RETURN 
   }
   else                                            //IF READ SELECTED END PACKET
   {
      packet[5]= get_char(); 
      if(packet[5] == 0x0D){OK++;}
   }

   if(OK == 4){valid = true;}
   else{valid = false;}

   return valid;
}

/******************** Main Loop ******************************/
void main()
{
   Initialize();
 
   while (true)
   {
     
     if(USB_Data)
     {     
         select=1;
         if(get_packet())
         {
           //Place Execute packet Routine here
           fprintf(USB,"command=%d bit=%d register=%d length=%d\n",command,packet[3],packet[4],length);
           USB_i = 0;USB_o = 0;
        }
     }
     if(UART_Data)
     {     
         select=2;
         if(get_packet())
         {
               //Place Execute packet Routine here           
            fprintf(UART,"command=%d bit=%d register=%d length=%d\n",command,packet[3],packet[4],length);
           UART_i = 0;UART_o = 0;
        }
     }
     
   }
}
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group