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 CCS Technical Support

using gets()

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



Joined: 05 May 2011
Posts: 4

View user's profile Send private message Send e-mail

using gets()
PostPosted: Mon Nov 07, 2011 5:46 pm     Reply with quote

Hi guys, I am trying to read a string using gets(). The string is from a pic16f690 to a pic18f4520, which are connected with a wired communication on the uarts. The problem is that I am not receiving anything. When I test if my source microcontroller is transmitting I connect it to my PC and view the transmitted string on terminal. But when connecting the destination microcontroller to PC to view if I am receiving a string there is nothing showing. I have checked everything including my connections and its ok, please help asap!!

Thanx in advance!!

Source code.
Code:

#include  <16f690.H>
#fuses INTRC_IO, NOWDT, NOBROWNOUT, PUT, NOMCLR
#DEVICE ADC=10
#use delay (clock=8000000)
#use rs232(baud=9600, xmit=PIN_C4,rcv=PIN_C5)
#include <ds1307.c>
#include <MATH.H>
#include <string.h>
   
 int light();
 int humidity();
 int temperature();
 int Temp2,Humid2,Intens2;
 int Temp,Humid,Intens;
 char Message[32];
 BYTE sec;
 BYTE min;
 BYTE hrs;
 BYTE day;
 BYTE month;
 BYTE yr;
 BYTE dow;

/////////////////FUNTION MAIN BEGINS//////////////////////////
void main ()
{   

ds1307_init();


    while(1)
     {     
              if(hrs==00 && min==00 && sec==00)
                {
                     ds1307_set_datetime(7,11,11,2,6,55,50);
                }

                  else
                     {  null;
                     }
               ds1307_get_date(day,month,yr,dow);
               ds1307_get_time(hrs,min,sec);
               
            // printf("Date : %02d/%02d/%02d",day,month,yr);
              //printf("Time : %02d:%02d:%02d",hrs,min,sec);   
                delay_ms(1000);
            Temp=temperature();
                Humid=humidity();
                Intens=light();
              
                sprintf(Message,"<,%02d/%02d/%02d,%02d:%02d:%02d,%d,%d,%d,>\r",day,month,yr,hrs,min,sec,Temp,Humid,Intens);
                puts(Message);
                //printf(Message);
                     
     }
}
///////////////////////////////////LIGHT FUNCTION////////////////////////////////////////////////
int light()
{
float value2;
float Intens1;

   setup_adc_ports(sAN2);
   setup_adc(ADC_CLOCK_INTERNAL );
   set_adc_channel( 2 );

      value2=read_adc();
      Intens1= (value2/1024)*(500.0)/100.0;
      Intens1= (Intens1+1.6258)/3.25;
      Intens2=ceil(Intens1);
             
     return Intens2;
}
//////////////////////////////////END OF LIGHT FUNCTION///////////////////////////////////////////

//////////////////////////////////TEMPERATURE FUNCTION////////////////////////////////////////////
int temperature()
{
float value0;
float Temp1;
   setup_adc_ports(sAN0);
    setup_adc(ADC_CLOCK_INTERNAL );
   set_adc_channel( 0 );
      
         value0=read_adc();
         Temp1= (value0/1024)*((500.0)/100.0);
         Temp1=100*Temp1;
         Temp2=ceil(Temp1);

      return Temp2;
}
///////////////////////////////END OF TEMPERATURE FUNCTION//////////////////////////////////////////

///////////////////////////////HUMIDITY FUNCTION////////////////////////////////////////////////////
int humidity()
{
float value1;
float Humid1;
    setup_adc_ports(sAN1);
    setup_adc(ADC_CLOCK_INTERNAL );
   set_adc_channel( 1 );
      
         value1=read_adc();
         Humid1= (value1/1024)*((500.0)/100.0);
         Humid1=100*Humid1;
         Humid2=ceil(Humid1);
     
      return Humid2;
}
/////////////////////////////////END OF HUMIDITY FUNCTION/////////////////////////////////////////////


RECEIVER CODE:
Code:

#include <18f4520.h>             // Define PIC Microcontroller Header
#fuses INTRC_IO, NOWDT, NOBROWNOUT, PUT, NOMCLR
#use delay (clock=8000000)   // Set 8MHz Oscillator For Microcontroller
#use rs232(baud=9600, xmit=PIN_B2,rcv=PIN_B1)
//#include <ctype.h>               
#include <lcd.c>                      // Define LCD Header
#include <MATH.H>
#include <string.h>
#include <stdlib.h>

  char Message[32];
  char arTemp[2];
  char arHumid[2];
  char arIntens;
  int Temp;
  int Humid;
  int Intens;

void main()
{   
 
 lcd_init();
 lcd_putc("\fReady...\n");
 
  while(1)
   {   
        delay_ms(1000);
       gets(Message);
 //      delay_ms(500);
        puts(Message);
        printf("%s",Message);
 
        sprintf(arTemp,"%d%d",Message[20],Message[21]);
        sprintf(arHumid,"%d%d",Message[23],Message[24]);
        sprintf(arIntens,"%d",Message[26]);

        Temp=atoi(arTemp);
        Humid=atoi(arHumid);
        Intens=atoi(arIntens);

//  if(Temp<15)
//    {
//      lcd_gotoxy(1,1);
//      lcd_putc("TEMPERATURE TOO LOW!!");
//        //delay_ms(1000);
//      output_toggle(PIN_B5);
//    }
//   else if(Temp>40)
//     {     lcd_gotoxy(1,1);
//           output_toggle(PIN_B5);
//           lcd_putc("TEMPERATURE TOO HIGH!!");
//     }
//    else{null;}
//
//if(Humid<35)
//    {
//      lcd_gotoxy(1,2);
//      lcd_putc("HUMIDITY TOO LOW!!");
//        //delay_ms(1000);
//      output_toggle(PIN_B5);
//    }
//   else if(Humid>60)
//     {     lcd_gotoxy(1,2);
//           output_toggle(PIN_B5);
//           lcd_putc("HUMIDITY TOO HIGH!!");
//     }
//    else{null;}
//
//if(Intens<1)
//    {
//      lcd_gotoxy(1,3);
//      lcd_putc("INTENSITY TOO LOW!!");
//       // delay_ms(1000);
//      output_toggle(PIN_B5);
//    }
//   else if(Temp>2)
//     {     lcd_gotoxy(1,3);
//           output_toggle(PIN_B5);
//           lcd_putc("INTENSITY TOO HIGH!!");
//     }
//    else{null;}
    }
}
temtronic



Joined: 01 Jul 2010
Posts: 9246
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Tue Nov 08, 2011 6:05 am     Reply with quote

quick comments..
1) always add 'errors' to the USE RS232(....) options. Right now the PIC's UART is halting , due to framing errors( too much data at once)

2) add a delay( delay_ms(2000) ? ) in the transmitter program main 'loop' to allow the receiver time to digest the incoming data...

3) use an ISR for the receiver's gets() to buffer incoming data.

4) if possible increase clock to 20MHz or slow the baudrate down to say 1200.
ckielstra



Joined: 18 Mar 2004
Posts: 3680
Location: The Netherlands

View user's profile Send private message

PostPosted: Tue Nov 08, 2011 7:38 am     Reply with quote

A few more comments:
Code:
char arTemp[2];
.
.
        sprintf(arTemp,"%d%d",Message[20],Message[21]);
Here you have a major bug where you are overwriting memory.
%d will try to print an int8 variable in the range 0 - 255. You have this two times. And the resulting string will be terminated by a null character.
Total result will be maximum: "255255" + terminating 0 = 7 characters.
You only declared space for two characters.

Same bug is present a few more times.

What you want to do is to convert the received text to integers, for this you best can use the opposite function of sprintf: the sscanf function.
Replace:
Code:
        sprintf(arTemp,"%d%d",Message[20],Message[21]);
        sprintf(arHumid,"%d%d",Message[23],Message[24]);
        sprintf(arIntens,"%d",Message[26]);

        Temp=atoi(arTemp);
        Humid=atoi(arHumid);
        Intens=atoi(arIntens);
by:
Code:
        sscanf(&Message[20], "%d,%d,%d", &Temp, &Humid, &Intens);


Not tested, so there might be a problem left in the above example code but it should get you going.

O yes, in the receiver code get rid of the long delay functions. Gets() will wait till a newline character is read, so no need for confusing extra delays.
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