CCS C'de RS232 hattından gelen uzun string yapısı

Başlatan armas, 25 Temmuz 2015, 09:59:48

armas

Merhabalar,

PC ile haberleşme için 18f4550 kullanıyorum. Tek seferde veri hattına basılan veri 290 karakter. Ben en fazla 255 karakter alabiliyorum. Programda her türlü veri tipini denedim fakat yapamadım. Verileri RS232 ile alıp ve kontrol için tekrar ekrana basan kodlar şöyle;

#include <main.h>
#include <string.h>
#include <input.c>
#use fast_io(b) 

#define BUFFER_SIZE 255 
#define STRING_SIZE 255
#define bkbhit (next_in!=next_out) 
 
 BYTE buffer[BUFFER_SIZE]; 
 BYTE next_in = 0; 
 BYTE next_out = 0; 
unsigned int8 counter=0;
int1 volume=0;

#int_rda 
void serial_isr() { 
   int t; 
   buffer[next_in]=getc(); 
   t=next_in; 
   next_in=(next_in+1) % BUFFER_SIZE; 
   if(next_in==next_out) 
     next_in=t;           // Buffer full !! 
} 



BYTE bgetc() { 
   BYTE c; 

   while(!bkbhit) ; 
   c=buffer[next_out]; 
   next_out=(next_out+1) % BUFFER_SIZE; 
   
  for(counter;counter<255;counter++){
   printf("\nstring=%x i=%u",buffer[counter],counter);
   }
   return(c); 
} 


void my_get_string(char* s, unsigned int8 max) { 
   unsigned int8 len; 
   char c; 
   --max; 
   len=0; 
   do { 
     //c=getc();  // Commented out. 
       c = bgetc();   // Call bgetc() instead of getc() 
      
       if(c==8) {  // Backspace 
        if(len>0) { 
          len--; 
          putc(c); 
          putc(' '); 
          putc(c); 
        } 
     } else if ((c>=' ')&&(c<='~')) 
       if(len<=max) { 
         s[len++]=c; 
        putc(c); 
        putc(' ');
       } 
   } while(c!=13); 
   s[len]=0; 
} 



//=================================== 
void main() 
{ 
char input_str[STRING_SIZE]; 

enable_interrupts(int_rda); 
enable_interrupts(global); 
set_tris_b(0x00);

while(1) 
  {  
  output_high(pin_b7);
    output_high(pin_b6);
   printf("Enter a string of text: "); 
   my_get_string(input_str, STRING_SIZE-1);      
   printf("\n\rYou typed: %s \n\r\n\r", input_str); 

  } 

}


Programda buffer size 255 olarak yazılı arttırdığımda overflow oluyor. Bu konuda yardımcı olursanız sevinirim.

JKramer

BUFFER_SIZE'ı arttırırken counter değişkenini de int16 yapın.

armas

Alıntı yapılan: JKramer - 25 Temmuz 2015, 10:16:34
BUFFER_SIZE'ı arttırırken counter değişkenini de int16 yapın.

sayıcı işlemini next_in ve next_out değişkenleri yapıyor değiştirdiğimde hepsini birlikte değiştiriyorum yani long BYTE olarak tanımlıyorum yine olmuyor.

RaMu

Denildiği gibi yap,
CcsC de long byte diye bir değişken tipi yok,
#byte var oda başka bir şey.

CcsC help kısmında "basic types" diye aratırsan değişken tipleri anlatılmış.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

armas

Tamam sorun çözüldü çok teşekkür ediyorum.