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

pic16f886 serial read problem

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



Joined: 12 Jun 2014
Posts: 4

View user's profile Send private message

pic16f886 serial read problem
PostPosted: Thu Jun 12, 2014 4:24 pm     Reply with quote

I am using the pic16f886 with the fingerprint sensor ZFM-20 Series, which is communicated using serial. By checking the Arduino example, and the data sheet i was able to send the handshake command. But i am unable to read all the acknowledgment sent by the sensor, only able to read the header of the acknowledge.
I am able to receive data from the hyper terminal of a pc using a max232, and i am able to read a message sent by the pic by connecting rx to tx. The problem is that i am unable to read all the information sent from the sensor.
The baud rates are the correct ones, I can see the acknowledge in the hyper terminal and it sends all the information.

This is the function I use to read from the serial port:
Code:

void sscanf(){
     int i;
     while(!kbhit){}
          for(i=0;i<=11;i++){
              packet[i]=getc(COM_A);
}
}

With this function i expect 12 bytes sent from the sensor.

Thanks in advance.
asmboy



Joined: 20 Nov 2007
Posts: 2128
Location: albany ny

View user's profile Send private message AIM Address

PostPosted: Thu Jun 12, 2014 4:45 pm     Reply with quote

Code:

while(!kbhit)

DUH get rid of the not sign !!!!
but that is just part of your trouble
consider using the serial receive interrupt system and parse out your data .
you just have a failure prone approach , as the construct you use is faulty

look at EX_SISR in the examples folder
Ttelmah



Joined: 11 Mar 2010
Posts: 19535

View user's profile Send private message

PostPosted: Fri Jun 13, 2014 12:28 am     Reply with quote

The 'not' is not the problem. The layout is so bad, that it looks as if it is...:
Code:

void sscanf()
{
     int i;
     while(!kbhit) ; //wait for character to arrive - pointless
     for(i=0;i<=11;i++)
     {
          packet[i]=getc(COM_A);
     }
}

However the while if not needed (since 'getc' will just wait if a character is not available). Problem is though that like gets, the function will 'block' till 12 bytes are received, and there is nothing to check the synchronisation of received data with the array.

Big problem is that the packets aren't necessarily 12 bytes,
The format is:

Header (2 bytes)
Adder (4* 'FF' bytes - used as a marker)
ID (1 byte)
Length (2 bytes)
Length*bytes (0 to 256 bytes)
Csum (2 bytes)

So generically the packet can be anything from 11 bytes, to 267 bytes in length.
The code has to read the 'adder' bytes, and reject the packet if 0xFF is not received in these, then read the 'length' value, and loop for up to 256 data characters depending on the value received in this.
Then read the checksum, and again reject the packet if this is wrong.

Now the acknowledge packet is sometimes 12 bytes long. On this one the length is '1', and a single data byte is sent to gives status. However depending on the status, and what command was issued, extra bytes may be included:

"Acknowledge packet includes 1 byte confirmation code and maybe also the returned parameter."

Obviously with the fixed 'length' fetch code, if the parameter is returned, then the code will go wrong, and an extra byte will then be sitting 'unread' in the UART. Future fetches will make the problem worse as extra bytes build up not being read, and the data will no longer align with the array....

So the read code, needs to handle the generic packet, taking the 'length' value and using this to handle how many bytes are sent. The 'returned parameter', varies with the command being sent, but is documented in the data sheet.
raKzo_82



Joined: 12 Jun 2014
Posts: 4

View user's profile Send private message

PostPosted: Fri Jun 13, 2014 12:31 pm     Reply with quote

thanks for the reply.

The code I posted earlier was a reduced function of the one i actual use, in the actual code, instead of using a fixed value, I use a variable that it's value is determined before the function is called by the main program.
The problem that I have is that i only received 2 bytes from the sensor, and when I checked what was sent by it using the hyper terminal, it sent a bigger string.
My problem is that this code doesn't read all the characters the sensor sends.

thanks in advance.
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Fri Jun 13, 2014 1:07 pm     Reply with quote

Quote:
The problem that I have is that i only received 2 bytes from the sensor

The hardware UART's receive fifo is only 2 bytes deep. If the UART
receives more than 2 bytes, and you don't quickly remove them
from the buffer (with getc), the UART will lock up. You won't be
able to read any more bytes. This is probably what is happening.
You are very likely waiting, or doing something else in your program
when you should be reading the bytes out of the UART's receive buffer.

The recommended fix for this problem is to use an interrupt-driven
software receive fifo (circular buffer) for the incoming serial bytes.
The #int_rda interrupt routine will automatically read bytes from
the UART and save them in a RAM buffer.

Look at the Ex_sisr.c example file in the CCS directory:
c:\program files\picc\examples\ex_sisr.c
raKzo_82



Joined: 12 Jun 2014
Posts: 4

View user's profile Send private message

PostPosted: Fri Jun 13, 2014 1:15 pm     Reply with quote

thanks i will try that
raKzo_82



Joined: 12 Jun 2014
Posts: 4

View user's profile Send private message

PostPosted: Tue Jun 24, 2014 1:49 pm     Reply with quote

i tried what you suggested me to do(used the example to create a program), and it worked on the first try, and i left to my house that weekend, then on Monday i returned to continuing programming to finish the project, and it didn't work, at all.
do you know a reason of how something that worked fine, suddenly didn't work at all?
thanks in advance
ezflyr



Joined: 25 Oct 2010
Posts: 1019
Location: Tewksbury, MA

View user's profile Send private message

PostPosted: Tue Jun 24, 2014 2:15 pm     Reply with quote

Hi,

Based on the information you provided, it could be anything at all. A loose connection, a failed component, not running the code you think you are running, or it never *really8 worked in the first place, etc., etc...... All these possibilities come to mind..... Are you sure the PIC is still operating? You should have a power LED connected to an I/O pin that flashes a few times on every start-up. This clearly, and unequivocally shows that your code is actually running....

If that is working, show us the code that you've got now, and let us have a look!

John
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