![](templates/subSilver/images/CCSLogo.jpg) |
![CCS C Software and Maintenance Offers](templates/subSilver/images/forumAd6.jpg) |
View previous topic :: View next topic |
Author |
Message |
mohamed_amine
Joined: 17 Mar 2015 Posts: 4
|
problem GETC(); |
Posted: Sat Mar 21, 2015 5:50 pm |
|
|
Hello, is there a way to receive multiple characters, as getc() allows only receive 3 characters ? |
|
![](templates/subSilver/images/spacer.gif) |
temtronic
Joined: 01 Jul 2010 Posts: 9174 Location: Greensville,Ontario
|
|
Posted: Sat Mar 21, 2015 5:58 pm |
|
|
You need to use an ISR with a buffer. CCS supplies an example 'ex_sisr.c' in the examples folder.
The hardware UART only has a 2-3 byte buffer and if you do not read the data fast enough, an 'overrun' condition (error) will occour.
You also will need to add 'errors' to the use RS232(....options....) as well..
Jay |
|
![](templates/subSilver/images/spacer.gif) |
mohamed_amine
Joined: 17 Mar 2015 Posts: 4
|
|
Posted: Sat Mar 21, 2015 6:26 pm |
|
|
thx ![Smile](images/smiles/icon_smile.gif) |
|
![](templates/subSilver/images/spacer.gif) |
Ttelmah
Joined: 11 Mar 2010 Posts: 19369
|
|
Posted: Sun Mar 22, 2015 1:55 am |
|
|
Let me slightly expand on this.
Getc, only retrieves _one_ character.
However you can receive any number of characters with this. Just call it whenever a character is available.... It can receive thousands (billions) of characters.
There is then a total of typically 2.99999 characters of hardware buffering (depending on the UART involved - this is an example of why you always need to tell us 'what PIC', for some there is only 1.99999, while some of the 'bigger' PIC's have more). The .99999, is because there will be an overflow as soon as the shift register actually fills, but provided you read a character before this happens, a character that was almost totally received before this time will then be transferred correctly.
So, if you have not been calling it and characters have been arriving 'unread', there is a maximum of just under three characters, that may be waiting for you to read.
As Temtronic says, there is an example with the compiler ex_sisr.c which shows how to implement an interrupt driven larger receive buffer (must only be a 'binary' size 4,8,16,32 etc. bytes, with the code as posted). Study this.
There is also a similar buffer now available using the #USE RS232 declaration, by adding 'RECEIVE_BUFFER=xxx' to this. This will automatically create a receive interrupt handler and a buffer for you, but with the caveat that it throws the latest character if it overflows - beware....
You need to get your head round the fact that you are talking directly to the chip's hardware, with the limitations this brings. On the PC for example, the standard UART only has three characters of buffering, while the later 16550 UART (which 99% of PC's will have), has 16 characters of hardware buffering, while some modern chips have even more, yet write code in C, C#, VB etc., and you will have hundreds or even thousands of characters of buffering available. This is because the OS offers an interrupt driven serial buffer already written for you. On the PIC, you have to add this yourself, or tell the compiler to add this. |
|
![](templates/subSilver/images/spacer.gif) |
|
|
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
|