powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Не получается запрограммировать обмен считывателя с компьютером.
7 сообщений из 7, страница 1 из 1
Не получается запрограммировать обмен считывателя с компьютером.
    #39426590
AlexNon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день! Столкнулся с проблемой нужно при контакте карточки и считывателя получать код карточки и считывателя.
Считыватель UART подключается при помощи usb. Мой адресс устройства 00000002
Пример тестовой программы:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
using System;
using System.IO.Ports;
using System.Threading;
using System.Collections.Generic;

namespace ComPort.Test
{

    public class CommandGenerator
    {

        public List<byte> getCommand0xC1(byte period, byte mode)
        {
            List<byte> command = new List<byte>();
            command.Add(0x10);
            command.Add(0x02);
            command.Add(Commands.CHANGE_MODE);
            command.Add(0x00);
            command.Add(0x00);
            command.Add(0x02);
            command.Add(0x03);
            command.Add(period);
            command.Add(mode);   
            command.Add(0x11);
            command.Add(getCRC(command));
            return command;

            /*
             List<byte> command = new List<byte>();
            command.Add(0x10);
            command.Add(Commands.CHANGE_MODE);
            command.Add(0x00);
            //command.Add(0xXX);
            //command.Add(0xXX);
            //command.Add(0x03);
            command.Add(period);
            command.Add(mode);
            command.Add(0x11);
            command.Add(getCRC(command));
            return command;
             */
        }

        private byte getCRC(List<byte> data)
        {
            byte result = 0;
            foreach (byte item in data)
            {
                result += item;
            }
            return result;
        }

    }

    public static class Commands
    {

        public const byte CHANGE_MODE = 0xC1;

    }

    public class Program
    {

        private static bool _continue;
        private static SerialPort _serialPort;

        public static void Main(string[] args)
        {
            CommandGenerator commandGenerator = new CommandGenerator();

            _serialPort = new SerialPort("COM4", 9600, Parity.Even, 8, StopBits.One); // вот, теперь я вижу что мой первый вариант не подходил по протоколу. Теперь есть контроль чётности.
            _serialPort.ReadTimeout = 1000;
            _serialPort.WriteTimeout = 1000;
            _serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceived);
            _serialPort.Open();

            Thread.Sleep(500); // ждём

            sendCommand(commandGenerator.getCommand0xC1(0x0A, 0x01)); // меняем режим и ждём когда поднесут карточку

            for (; ; )
            {
                Thread.Sleep(200); // даём остальным потокам 200 миллисекунд на работу
            }

            _serialPort.Close(); // недостижимый код, но, для теста сойдёт
        }

        private static void DataReceived(object sender, SerialDataReceivedEventArgs e)
        { // что то пришло от считывателя
            Console.WriteLine(_serialPort.ReadLine()); // пытаемся прочитать что же там пришло
        }

        private static void sendCommand(List<byte> command)
        {
            _serialPort.Write(command.ToArray(), 0, command.Count);
        }

    }

}

/*
 
1  0x10  маркер начала сообщения
2  0xXX  адрес устройства
3  0xC1  код команды
4  0-6   длина параметров
6  0xXX  тип устройства (описание приведено ниже)
7  0xXX  адрес устройства
8  0 – 7 скорость обмена (описание приведено ниже, по умолчанию 3 = 9600бит/с)
9  0xXX  период чтения карты (время хранения карты после ее прочтения, 1=100мс, по умолчанию 10 = 1с)
10 0, 1  режим работы устройства (0 – выдача кода карты по запросу, 1 – выдача кода карты по факту подне-сения карты)
11 0x11  маркер конца сообщения
12 0xXX  контрольная сумма сообщения
*/



Протокол обмена

Обмен между считывателем и компьютером осуществляется с помощью пере-дачи специальных команд и приема ответов.
Считыватель поддерживает два режима чтения карт (режимы программируются командой 0xC1, описание которой приведено ниже):
– выдача кода карты по запросу;
– выдача кода карты по факту поднесения карты.
Если установлен режим работы 0, то для считывания карты могут использовать-ся команды 0xC3, 0xC4 и 0xCE. Если установлен режим работы 1, то идентификатор карты выдается при ее поднесении в формате ответа на команду 0xC3.
Переключение между режимами осуществляется посредством команд. Опи-сание всего набора команд и их формата приведено ниже.
Скорость передачи по RS-232 программируется и может принимать значения 1200, 2400, 4800, 9600, 19200, 38400, 115200 бит/с. По умолчанию установлена ско-рость 9600 бит/с.
Формат слова: 1 старт-бит, 8 бит, контроль по четности,1стоп-бит.
Формат команды представлен в таблице 3.

Таблица 3 – Формат команды

№ п/п Значение Описание
1 0x10 маркер начала сообщения
2 0xXX адрес устройства
3 0xXX код команды
4 0xXX длина параметров команды
5 [0xXX, … 0xXX] параметры команды
6 0x11 маркер конца сообщения
7 0xXX контрольная сумма сообщения

Формат ответа приведен в таблице 4.

Таблица 4 – Формат ответа

№ п/п Значение Описание
1 0x10 маркер начала сообщения
2 0xXX адрес устройства
3 0xXX код команды
4 0xXX длина результата выполнения команды
5 [0xXX, … 0xXX] код ошибки + результат выполнения команды (для команд, которые возвращают значение)
6 0x11 маркер конца сообщения
7 0xXX контрольная сумма сообщения

Контрольная сумма рассчитывается как арифметическая сумма байт от маркера начала до маркера конца включительно.
В случае возникновения ошибок для любых команд ответ выглядит, как показано в таблице 5.



Таблица 5 – Формат ошибки

№ п/п Значение Описание
1 0x10 маркер начала сообщения
2 0xXX адрес устройства
3 0xXX код команды, в результате получения кото-рой возникла ошибка
4 0x01 длина ошибки
5 1, 21, 22 код ошибки
6 0x11 маркер конца сообщения
7 0xXX контрольная сумма сообщения

Могут возникать следующие ошибки (в десятичном формате):
01 – неправильный код команды, неправильная длина параметров,
21 – ошибка контрольной суммы,
22 – ошибка данных (неправильный параметр, например месяц = 13).

Используются следующие команды:
0xC0 – Прочитать/записать идентификатор устройства

Вид запроса команды приведен в таблице 6. Если в запросе длина параметров равна 0, то производится чтение идентификатора считывателя. Вид ответа приведен в таблице 7. Если длина параметров отличная от приведенной, то выдается ошибка с кодом 1. В случае возникновения ошибки, генерируется ошибка, приведенная в табли-це 8. Будут записаны все параметры, которые соответствуют длине параметров (на-пример, при длине параметров = 3, будут записаны тип устройства и версия прошив-ки).

Таблица 6 – Запрос команды 0xC0

№ п/п Значение Описание
1 0x10 маркер начала сообщения
2 0xXX адрес устройства
3 0xC0 код команды
4 0, 1, 3, 6, 12, 14 длина параметров
5 0xXX тип устройства (описание приведено ниже)
6 0xXXXX версия прошивки (2 байта, начиная со старшего)
7 0-99 дата выпуска прошивки (год)
8 1-12 дата выпуска прошивки (месяц)
9 1-31 дата выпуска прошивки (день)
10 0xXXXXXXXXXXXX Серийный номер устройства (6 байт, начи-ная со старшего)
11 0xXXXX Дополнительная информация (2 байта, на-чиная со старшего)
13 0x11 маркер конца сообщения
14 0xXX контрольная сумма сообщения








Таблица 7 – Ответ на команду 0xC0

№ п/п Значение Описание
1 0x10 маркер начала сообщения
2 0xXX адрес устройства
3 0xC0 код команды
4 15 длина параметров
5 0 код ошибки (0 – ошибки нет)
6 0x00, 0x06 тип устройства (описание приведено ниже)
7 0xXXXX версия прошивки (2 байта, начиная со старшего)
8 0-99 дата выпуска прошивки (год)
9 1-12 дата выпуска прошивки (месяц)
10 1-31 дата выпуска прошивки (день)
11 0xXXXXXXXXXXXX Серийный номер устройства (6 байт, начи-ная со старшего)
12 0xXXXX Дополнительная информация (2 байта, на-чиная со старшего)
13 0x11 маркер конца сообщения
14 0xXX контрольная сумма сообщения


Таблица 8 – Формат ошибки команды 0xC0

№ п/п Значение Описание
1 0x10 маркер начала сообщения
2 0xXX адрес устройства
3 0xС0 код команды, в результате получения кото-рой возникла ошибка
4 0x01 длина ошибки
5 4 код ошибки (ошибка записи в EEPROM)
6 0x11 маркер конца сообщения
7 0xXX контрольная сумма сообщения

0xC1 – Прочитать/записать параметры устройства

Вид запроса команды приведен в таблице 9. Если в запросе длина параметров равна 0, то производится чтение параметров считывателя. Вид ответа приведен в таб-лице 10. Если длина параметров больше 6, то выдается ошибка с кодом 1. В случае возникновения ошибки, генерируется ошибка, приведенная в таблице 11. Будут запи-саны все параметры, которые соответствую длине параметров (например, при длине параметров = 3, будут записаны тип устройства, его адрес и скорость обмена).


Таблица 9 – Запрос команды 0xC1

№ п/п Значение Описание
1 0x10 маркер начала сообщения
2 0xXX адрес устройства
3 0xC1 код команды
4 0-6 длина параметров
6 0xXX тип устройства (описание приведено ниже)
7 0xXX адрес устройства
8 0 – 7 скорость обмена (описание приведено ниже, по умолчанию 3 = 9600бит/с)
9 0xXX период чтения карты (время хранения карты после ее прочтения, 1=100мс, по умолчанию 10 = 1с)
10 0, 1 режим работы устройства (0 – выдача кода карты по запросу, 1 – выдача кода карты по факту подне-сения карты)
11 0x11 маркер конца сообщения
12 0xXX контрольная сумма сообщения

Таблица 10 – Ответ на команду 0xC1

№ п/п Значение Описание
1 0x10 маркер начала сообщения
2 0xXX адрес устройства
3 0xC0 код команды
4 6 длина параметров
5 0 код ошибки (0 – ошибки нет)
6 0xXX тип устройства (описание приведено ниже)
7 0xXX адрес устройства
8 0 – 7 скорость обмена (по умолчанию 3 = 9600бит/с)
9 0xXX период чтения карты (время хранения карты после ее прочтения, 1=100мс, по умолчанию 10 = 1с)
10 0, 1 режим работы устройства
11 0x11 маркер конца сообщения
12 0xXX контрольная сумма сообщения

Таблица 11 – Формат ошибки команды 0xC1


№ п/п Значение Описание
1 0x10 маркер начала сообщения
2 0xXX адрес устройства
3 0xС1 код команды, в результате получения кото-рой возникла ошибка
4 0x01 длина ошибки
5 4 код ошибки (ошибка записи в EEPROM)
6 0x11 маркер конца сообщения
7 0xXX контрольная сумма сообщения

При перезаписи адреса необходимо учитывать, что ответ будет с новым адре-сом. Скорость изменится после выключения/включения питания.
Используются следующие параметры для записи скорости обмена:
0 - 1200 бит/с;
1 - 2400 бит/с;
2 - 4800 бит/с;
3 - 9600 бит/с;
4 - 19200 бит/с;
5 - 38400 бит/с;
6 - 57600 бит/с;
7 - 115200 бит/с.
Для определения типа устройства используются параметры приведенные ниже:
0 – Тип не определен;
6 – Контрольный считыватель СBK-01 с интерфейсом RS232, предназначенный для считывания карт совместимых с Em-Marin H4001 (125кГц);
7 – Контрольный считыватель СBK-01TM с интерфейсом RS232, предназначен-ный для считывания ключей Touch Memory;
8 - контрольный считыватель c интерфейсом USB, предназначенный для считы-вания карт совместимых с Em-Marin H4001 (125кГц);
9 - контрольный считыватель c интерфейсом USB, предназначенный для считы-вания ключей Touch Memory;

0xC2 – Прочитать параметры устройства

Команда используется только для чтения параметров. Формат команды пред-ставлен в таблице 3. Длина параметров в запросе всегда равна 0 (параметры не пере-даются). Формат ответа аналогичен формату команды 0xC2, приведенному в таблице 12. Единственное отличие: код команды = 0xC2.

0xC3 – Прочитать состояние устройства

Команда используется для чтения состояния устройства. Формат команды пред-ставлен в таблице 3. Длина параметров в запросе всегда равна 0 (параметры не пере-даются). Если есть прочитанная карты, то вид ответа показан в таблице 12, если нет, то в таблице 13. Во избежание потери идентификатора прочитанной карты, учитывать, что период опроса считывателя, должен быть меньше, чем период чтения карты.

Таблица 12 – Ответ 1 на команду 0xC3

№ п/п Значение Описание
1 0x10 маркер начала сообщения
2 0xXX адрес устройства
3 0xC3 код команды
4 8 длина параметров
5 0 код ошибки (0 – ошибки нет)
6 0x80 состояние устройства (0x80 – прочитана карта)
7 0xID0…0xID5 идентификатор карты (5 байт, начиная с младшего)
8 0x00 старший байт идентификатора (равен 0x00 для со-вместимости с ключами Touch Memory)
9 0x11 маркер конца сообщения
10 0xXX контрольная сумма сообщения





Таблица 13 – Ответ 2 на команду 0xC3

№ п/п Значение Описание
1 0x10 маркер начала сообщения
2 0xXX адрес устройства
3 0xC3 код команды
4 2 длина параметров
5 0 код ошибки (0 – ошибки нет)
6 0x00 состояние устройства (0x00 – нет прочитаной карты)
7 0x11 маркер конца сообщения
8 0xXX контрольная сумма сообщения

0xC4, 0xCE – Прочитать состояние устройства

Команда используется для чтения карты из памяти считывателя. Формат коман-ды представлен в таблице 3. Длина параметров в запросе всегда равна 0 (параметры не передаются). Если есть прочитанная карта, то вид ответа показан в таблице 14, ес-ли нет, то в таблице 15.

Таблица 14 – Ответ на команду 0xC4, 0xCE

№ п/п Значение Описание
1 0x10 маркер начала сообщения
2 0xXX адрес устройства
3 0xС4, 0xСE код команды
4 7 длина параметров
5 0 код ошибки (0 – ошибки нет)
6 0xID0…0xID5 идентификатор карты (5 байт, начиная с младшего)
7 0x00 старший байт идентификатора (равен 0x00 для со-вместимости с ключами Touch Memory)
8 0x11 маркер конца сообщения
9 0xXX контрольная сумма сообщения

Таблица 15 – Формат ошибки команды 0xC4, 0xCE


№ п/п Значение Описание
1 0x10 маркер начала сообщения
2 0xXX адрес устройства
3 0xС4, 0xСE код команды
4 0x01 длина ошибки
5 20 код ошибки (нет прочитанной карты)
6 0x11 маркер конца сообщения
7 0xXX контрольная сумма сообщения
...
Рейтинг: 0 / 0
Не получается запрограммировать обмен считывателя с компьютером.
    #39426597
AlexNon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема в том что данные не проходят в консоль.
...
Рейтинг: 0 / 0
Не получается запрограммировать обмен считывателя с компьютером.
    #39426614
АкФурсов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlexNonПроблема в том что данные не проходят в консоль.
Программ нет, сниффера тоже, пишу по приборам.
...
Рейтинг: 0 / 0
Не получается запрограммировать обмен считывателя с компьютером.
    #39426709
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Варианта три
1. Неправильно открываешь порт
2. Неправильно шлешь команду
3. Устройство не настроено или не работает

Сначала надо удостовериться что устройство фурычит. Для этого берешь 2-3 программ для общения по ком порту и шлешь данные и считываешь ответ. Дальше пляшешь от результатов - либо ищешь ошибку у себя в коде, либо выбрасываешь устройство
...
Рейтинг: 0 / 0
Не получается запрограммировать обмен считывателя с компьютером.
    #39426802
AlexNon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Порт тулс пойдет для проверки?
...
Рейтинг: 0 / 0
Не получается запрограммировать обмен считывателя с компьютером.
    #39426875
МегаБосс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlexNonПорт тулс пойдет для проверки?
son456 ты можешь как-нибудь по-другому начинать свои темы? "Здравствуйте! Столкнулся с проблемой...." ты за что ни возьмешься - все время сталкиваешься с проблемами. Может тебе уже лучше взяться за метлу? Ато с такими потугами "програмистом" можно назвать любого кто умеет кликать мышкой и дубасить по клавиатуре.
...
Рейтинг: 0 / 0
Не получается запрограммировать обмен считывателя с компьютером.
    #39428257
СвинопасЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlexNonПроблема в том что данные не проходят в консоль.
Похоже автор совершенно не понимает что делает. Для начала стоит разобраться в принципе работы имеющегося устройства, во-вторых нужно не тупо передрать чей-то пример и расчитывать что он будет сразу работать, а сесть разобраться с командами устройства, тем более что есть справка что где и как. Вобщем сложилось такое впечатление, что автор скорее всего не имеет отношения ни к программированию ни к ИТ вцелом.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Не получается запрограммировать обмен считывателя с компьютером.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]