I am writing a code that simulates receiving text from the serial port using the serial window. When I debug this code step by step and enter the text, it works fine, but when I run the code and enter the text all at once not all of the characters are received! For example if I want to enter "OK", in debugging step by step I enter O then K and it is perfect. However, when I run the code and type "OK" quickly, I may receive "K" only or nothing at all, while if I type it slowly (which I don't think is the case in serial communication) it is received correctly! Can you help me with this? Thank You!
You must remove the Byte from the RX Buffer before the next one comes in. you are reading it too slow, or your baud rate is too fast. Optionally you can read it via the interrupt.
I am using a baud rate of 9600 which i think is not fast at all! And I remove the byte of the buffer too! Ain't I using the interrupt in the following code? I am reading the characters and putting them in an array, if the character is "carriage return" i jump out of the loop.
void get_string(char* s2, length){ int j,i=0; char s1[20],buffer,cr=0x0D; while(1) { while (RI==0); buffer= SBUF; s1[i]=buffer; RI=0; if (s1[i]==cr) goto End; i=i+1; } End: //ignore this part now :) //for (j=0;j<=i-1;j=j+1){ //s2[j]=s1[j];} }
Thank You
Ain't I using the interrupt in the following code? if you want to appear Southern (Ain't ) then do it right! "I Ain't using no interrupt in that thar code"
while(1) { while (RI==0); buffer= SBUF; s1[i]=buffer; RI=0; if (s1[i]==cr) goto End; i=i+1; } End:
where does this wait for RI being set??? what is wrong with "break"
Erik
OK i can remove the goto and put break instead? but this doesn't solve the problem! The code is looping while there is no RI set...if it is set we take the input from the SBUF and then set the RI. I can't get where is the problem..please explain further :) thank you
putting break wont solve the problem ... the problem is in the speed not the syntax i guess because it reads it when the input is inserted slowly.. please give me further explanation! thank you :)
Why should we - for now - ignore your code that tries to move a lot of data? Why are you not doing that incrementally? Every time you receive one character from the serial port, you can place that single character exactly where you need it to be. So no huge extra work when you see a carriage return.
By the way - why do you have a variable for your carriage return? What was wrong with just using a named constant?
View all questions in Keil forum