цифровая электроника
вычислительная техника
встраиваемые системы

 
» » Код для взаимодействия микроконтроллера и сканера отпечатков пальцев

Код для взаимодействия микроконтроллера и сканера отпечатков пальцев

Автор: Mike(admin) от 23-07-2014, 06:53

В некоторых приложениях, требующих повышенной безопасности, желательно иметь некоторый модуль для аутентификации пользователя. Таким модулем может служить сканер отпечатков пальцев, например, SM-630.


Встроенный DSP-процессор позволяет без особых проблем организовать взаимодействие между контроллером и сканером благодаря богатому набору управляющих команд. Ниже представлен пример кода такого взаимодействия.


Программа написана на языке C для микроконтроллеров PIC16.



#define cmd_add_fingerprint     0x40
#define cmd_search_fingerprint 0x44
#define cmd_packet      0x10
#define data_packet     0x20
#define res_packet      0x30

#define res_rcv_correct 0x01
#define res_rcv_error   0x02
#define res_opr_success 0x31
#define res_finger_detected     0x32
#define res_timeout     0x33
#define res_process_fail 0x34
#define res_para_error  0x35
#define res_fingerprint_found 0x39
#define res_fingerprint_unfound 0x3A

#use rs232(baud=57600,xmit=PIN_C6,rcv=PIN_C7,bits=8,parity=n,stop=1,stream=Finger,timeout=1000)//,force_sw)

int8 cmd_buffer[10],response_buffer[15];

int8 find_checksum(int8 total_byte)
{
        int8 byte_count;
        int16 check_sum=0;
        for(byte_count=0;byte_count<total_byte;byte_count++)
        {
                check_sum+=cmd_buffer[byte_count];
        }
       
        return(make8(check_sum,0));
}

void cmd_to_sm630(int8 total_byte)
{
        int8 byte_count;
        for(byte_count=0;byte_count<total_byte;byte_count++)
        {
                fputc(cmd_buffer[byte_count],Finger);
                delay_us(10);
        }              
}

void response_from_sm630(int8 total_byte)
{
        int8 byte_count;
        while(fgetc(Finger)!=0x4D);
        response_buffer[0]=0x4D;
        for(byte_count=1;byte_count<total_byte;byte_count++)
        {
                response_buffer[byte_count]=fgetc(Finger);
        }                      
}

int8 add_finger(int16 finger_id)
{
        cmd_buffer[0]=0x4D; //Заголовок пакета
        cmd_buffer[1]=0x58; //Заголовок пакета
        cmd_buffer[2]=cmd_packet; //команда
        cmd_buffer[3]=0x03; //3 byte length
        cmd_buffer[4]=cmd_add_fingerprint; //добавляем cmd
        cmd_buffer[5]=make8(finger_id,1);//старший байт id
        cmd_buffer[6]=make8(finger_id,0);//младший байт id
        cmd_buffer[7]=find_checksum(7);//проверочная сумма 7 байтов

        cmd_to_sm630(8);
        response_from_sm630(6); //считываем 6 байтов
       
        if(response_buffer[4] == res_rcv_correct)
        {
               
                response_from_sm630(7); //считываем 6 байтов
                if(response_buffer[5] == res_opr_success)
                {
                        //отображаем Press finger again
                        //lcd_goto(2,1);
                        //lcd_send_byte("  Press finger again   ");
                        response_from_sm630(7); //считываем 6 байтов
                }
        }
        return (response_buffer[5]);           
}
int8 search_finger(int16& result_id,int16 num_fingerprint)
{
        output_low(PIN_A5);
        cmd_buffer[0]=0x4D; //Заголовок пакета
        cmd_buffer[1]=0x58; //Заголовок пакета
        cmd_buffer[2]=cmd_packet; //команда
        cmd_buffer[3]=0x05; //длина 5 байтов
        cmd_buffer[4]=cmd_search_fingerprint; //поиск cmd
        cmd_buffer[5]=0x00; //старший байт начального id
        cmd_buffer[6]=0x00; //младший байт начального id
        cmd_buffer[7]=make8(num_fingerprint,1);//старший байт числа найденных отпечатков
        cmd_buffer[8]=make8(num_fingerprint,0);//младший байт числа найденных отпечатков
        cmd_buffer[9]=find_checksum(9);//проверочная сумма 9 байтов

cmd_to_sm630(10);
        response_from_sm630(6); //считываем 6 байтов
        if(response_buffer[4] == res_rcv_correct)
        {
                response_from_sm630(7); //считываем 7 байтов
                if(response_buffer[5] == res_opr_success)
                {
                                delay_ms(10);
                                response_from_sm630(6); //считываем 6 байтов
                                //disp_response(6);
                                if(response_buffer[5] == res_fingerprint_found)
                                {
                                        response_buffer[0]=fgetc(Finger);
                                        response_buffer[1]=fgetc(Finger);
                                        result_id=make16(response_buffer[0],response_buffer[1]);
                                }
               
       
                }

        }
        else
                response_buffer[5]=response_buffer[4];         
        return (response_buffer[5]);   
               
}       



<Источник>




Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий
Цитата
  • Группа: Гости
  • ICQ:
  • Регистрация: --
  • Статус:
  • Комментариев: 0
  • Публикаций: 0
^
Заберите у нас потенциальных клиентов для бизнеса, товаров и услуг.

Предлагаем базы данных фирм России, Украины, Белоруссии и Казахстана.

Заказать новую базу данных фирм можно написав ТОЛЬКО на эту почту: baza-gorodov(собака)yandex.ru

Стоимость базы фирм 1 города — от 700 руб. По стране 1 категория — 2000 рублей!

БАЗЫ СОБИРАЕМ СРАЗУ ПОСЛЕ ЗАКАЗА - БЕЗ ПРЕДОПЛАТЫ!
ПРЕДОСТАВЛЯЕМ СКРИНЫ ДЛЯ ПРОСМОТРА И ДЕМО ВЕРСИИ БАЗ!

получать прибыль ооо

Спектр применения баз фирм огромный:

1. Вы можете использовать их для обзвона потенциальных клиентов
2. Для рассылки писем по email
3. Для смс - рассылки
4. Для почтовой рассылки на юридические адреса фирм
5. Для поиска партнеров и новых клиентов в социальных сетях на страничках фирм
6. Для написания Вашего предложения на сайтах фирм и т.д.


Пишите ТОЛЬКО на эту почту для заказа новой базы данных фирм: baza-gorodov(собачка)yandex.ru