1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/ecbm-stream

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

STREAM-фреймворк

Введение Здесь stream — это не известная игровая платформа. Stream означает «поток» и относится к фреймворку, который используется для обработки последовательных потоков данных через последовательный порт.

Целью разработки фреймворка stream было решение проблемы длительного времени обработки прерываний при одновременном использовании нескольких протоколов последовательного порта. Фреймворк stream сохраняет данные последовательного порта в буфер, а затем обрабатывает их в основной функции. Это позволяет быстро завершать прерывания без влияния на выполнение других функций.

Структура фреймворка Для обеспечения совместимости с различными протоколами последовательного порта, фреймворк stream не использует структуру, основанную на завершении символа для запуска обработки. Поскольку после добавления новых протоколов каждый раз проверять завершение символа становится затратной операцией, и один протокол может использовать символ завершения другого протокола. Поэтому фреймворк использует структуру записи прерываний и тайм-аута. В большинстве случаев данные в одном кадре передаются непрерывно, а между кадрами есть определённый временной интервал, поэтому эта структура подходит для большинства протоколов последовательного порта.

Фреймворк и компоненты На самом деле этот фреймворк очень прост: он сохраняет данные последовательного порта и проверяет наличие тайм-аутов. Простота означает высокую эффективность выполнения, а также гибкость для расширения.

Что касается расширения, текущий репозиторий git включает в себя встроенный компонент сравнения, а также предоставляет два компонента протокола, которые можно оценить с точки зрения расширяемости фреймворка. Поняв эти компоненты, можно самостоятельно разработать новые компоненты.

  • Компонент сравнения: сравнивает полученные данные со строкой.
  • Modbus-RTU компонент для приёма данных: широко используемый протокол связи для промышленного управления. Подходит для разработчиков встраиваемых систем.
  • Fur компонент: протокол, разработанный ECBM рабочей группой, обеспечивает сильное взаимодействие человека и машины, данные доступны для прямого чтения, подходит для использования с обычным последовательным портом.

Установка и настройка фреймворка STREAM

Процесс установки

  1. Добавьте файл stream.c в проект и загрузите файл заголовка stream.h в main.c.
  2. Определите базовый временной стандарт для проверки тайм-аута в библиотеке ECBM. Для этого активируйте библиотеку TIMER и добавьте код в main.c:
timer_init();//инициализация таймера.
timer_set_timer_mode(0,2000);//таймер 0 срабатывает каждые 2000 микросекунд.
timer_start(0);//запуск таймера 0.

Настройка таймера на срабатывание каждые 2 мс. Затем добавьте функцию проверки тайм-аута в обработчик прерывания таймера:

void tim_fun(void)TIMER0_IT_NUM{
    ECBM_STREAM_TIMEOUT_RUN();
}
  1. Подключите последовательный порт. Так как фреймворк stream основан на последовательном порту, выберите последовательный порт для определения функций ввода и вывода данных фреймворка stream. В библиотеке ECBM это можно сделать следующим образом:
void ecbm_stream_out(esu8 dat){
    uart_char(1,dat);
}
void uart1_receive_callback(void){
    ECBM_STREAM_IN(SBUF);
}

Функция ecbm_stream_out отправляет один байт в последовательный порт 1. Одновременно в функции обратного вызова последовательного порта 1 добавляется ECBM_STREAM_IN, что приводит к выполнению ECBM_STREAM_IN каждый раз при получении байта. 4. Определите функцию выполнения компонентов фреймворка stream. Можно не добавлять компоненты, но эта функция должна быть определена.

void ecbm_stream_exe(esu8 dat){
    dat=dat;
    //в настоящее время пусто, без компонентов.
}
  1. Добавьте функцию ecbm_stream_main фреймворка в цикл. Окончательный эффект выглядит следующим образом:
#include "ecbm_core.h"  //загрузка функций библиотеки.
#include "stream.h"
void main(){            //основная функция, обязательна.
    system_init();      //функция инициализации системы, также обязательна.
    timer_init();       //инициализация таймера.
    timer_set_timer_mode(0,2000);//таймер 0 срабатывает каждые 2000 микросекунд.
    timer_start(0);     //запуск таймера 0.
    while(1){
        ecbm_stream_main();
    }
}
void tim_fun(void)TIMER0_IT_NUM{
    ECBM_STREAM_TIMEOUT_RUN();
}
void ecbm_stream_out(esu8 dat){
    uart_char(1,dat);
}
void uart1_receive_callback(void){
    ECBM_STREAM_IN(SBUF);
}
void ecbm_stream_exe(esu8 dat){
    dat=dat;
    //в настоящее время пусто, без компонентов.
}

Настройка После установки необходимо настроить два параметра в соответствии с фактическими условиями применения. Откройте файл stream.h и перейдите на страницу настройки конфигурации графического интерфейса, где вы увидите два параметра:

  • Размер очереди буфера: фреймворк stream использует очередь буфера «первым пришёл — первым вышел». Размер этой очереди должен быть больше максимального содержимого одного кадра протокола. В противном случае данные могут быть потеряны при переполнении буфера. Например, для протокола fur максимальное содержимое может составлять 20 символов, тогда размер буфера должен быть установлен равным 21. Рекомендуется установить размер буфера как можно больше, чтобы предотвратить потерю данных из-за помех. Если доступно достаточно оперативной памяти, рекомендуется увеличить размер буфера.
  • Время ожидания кадра: фреймворк stream обрабатывает данные только по истечении времени ожидания. Значение этого параметра определяет количество срабатываний таймера перед обработкой данных. Если значение равно 100, а таймер срабатывает каждые 2 миллисекунды, то обработка данных начнётся через 2 * 100 = 200 миллисекунд после получения последнего байта. Затем основная функция цикла ecbm_stream_main будет выполнять проверку состояния тайм-аута, и если тайм-аут не произошёл, обработка не будет выполняться. Если тайм-аут произошёл, но основная функция ещё не была выполнена, обработка также не будет производиться. На это следует обратить внимание, особенно при использовании фреймворка на верхнем уровне.

Компонент сравнения Компонент сравнения довольно прост и уже интегрирован в файл stream.c, поэтому нет необходимости изменять проект. Достаточно добавить функцию сравнения компонентов в функцию ecbm_stream_exe.

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

Пример:

u8 cmp_on=0,cmp_off=0;
void ecbm_stream_exe(esu8 dat){
    dat=dat;
    ecbm_stream_strcmp(dat,"LED_ON" ,&cmp_on );
    ecbm_stream_strcmp(dat,"LED_OFF",&cmp_off);
    if(cmp_on ==6){P55=0;}
    if(cmp_off==7){P55=1;}
}

Объяснение: сначала определяются две переменные для хранения результатов сравнения. Переменная cmp_on соответствует строке «LED_ON», и когда значение cmp_on равно количеству символов в «LED_ON», светодиод включается (P5.5 устанавливается в низкий уровень). Аналогично, когда значение переменной cmp_off равно количеству символов в строке «LED_OFF», светодиод выключается (P5.5 устанавливается в высокий уровень).

Modbus-RTU отладочный компонент

Обзор Modbus-RTU — это широко используемый коммуникационный протокол в промышленности. Существует множество вариантов этого протокола, наиболее распространёнными из которых являются modbus-rtu и modbus-ascii. Основное различие между ними заключается в том, что rtu использует необработанные данные для представления данных, а ascii использует символьное представление данных. ascii более удобен для человеческого восприятия, а rtu более удобен для машинного считывания, поэтому здесь используется modbus-rtu.

Использование Методы использования, принципы и форматы связи modbus легко найти в Интернете, поэтому они здесь не рассматриваются. Этот компонент включает в себя семь часто используемых команд:

  1. Чтение катушек (01).
  2. Запись одной катушки (05).
  3. Чтение регистров (03).
  4. Запись одного регистра (06).
  5. Запись нескольких регистров (10).
  6. Чтение дискретных входов (02).
  7. Чтение входных регистров (04).

Установка отладочного компонента

Первый шаг: добавьте файл stream_modbus.c в проект, а затем загрузите файл заголовка stream_modbus.h в файл main.c. Второй шаг: определите функцию обратного вызова для ошибок CRC es_modbus_rtu_crc_err_callback. Вы можете написать код для повторной отправки команды на верхний уровень или оставить его пустым. Однако эту функцию необходимо определить, иначе микроконтроллер выйдет из строя.

void es_modbus_rtu_crc_err_callback(void){
//не выполнять обработку, можно оставить пустым.
}

Определите функцию получения идентификатора es_modbus_rtu_get_id. Она может возвращать переменную или константу. Но она не должна быть широковещательным адресом и должна быть уникальной в сети. Идентификатор используется для связи по протоколу modbus, и только данные с соответствующим идентификатором будут приняты этим устройством.

esu8 es_modbus_rtu_get_id(void){
    return 1;
}

Третий шаг: в зависимости от требований определите функции нижнего уровня для чтения и записи. Например, если требуется чтение и запись катушек (битовых переменных), необходимо определить функции es_modbus_cmd_write_bit и es_modbus_cmd_read_bit. Функция es_fur_data_out — это функция, которая выводит число из регистра. В качестве параметра функции задаётся адрес регистра, а затем необходимо самостоятельно написать часть кода, возвращающую значение регистра. Поскольку эта часть должна быть написана вручную, степень свободы очень велика, и даже можно объединить два массива:

esu16 es_fur_data_out(esu16 addr){
    if(addr<1024){//Если адрес меньше 1024, то возвращается оперативная память OLED.
        return oled_buf[addr];
    }else if((addr>=1024)&&(addr<=1033)){
//Если адрес находится в диапазоне от 1024 до 1033, то возвращаются значения от 0 до 9 из main_info.
        return main_info[addr-1024];
    }else if(addr==65535){//Также можно вернуть константу.
        return (UART_BAUD/100);//При обращении к адресу 65535 возвращается скорость передачи UART (конечно, значение скорости передачи будет очень большим, например, 115200, что превышает диапазон значений, которые может отобразить u16, поэтому значение делится на 100. Таким образом, отображается только 1152).
    }
    return 0;
}

Функция es_fur_data_in — это функция, которая помещает число в регистр. Параметрами функции являются адрес регистра и значение, которое нужно поместить. Как и в предыдущем случае, степень свободы очень высока:

void es_fur_data_in(esu16 addr,esu16 dat){
    if((addr>=1024)&&(addr<=1033)){
//Если адрес находится в диапазоне от 1024 до 1033, то соответствующие значения из main_info изменяются от 0 до 9.
        main_info[addr-1024]=dat;
    }else if(addr==65535){//Когда значение записывается по адресу 65535, оно увеличивается в 100 раз и устанавливается как новая скорость передачи.
        uart_set_baud((u32)dat*100);
    }
}

Третий шаг: после определения основных функций выше, функцию es_fur_exe можно поместить в ecbm_stream_exe.

void ecbm_stream_exe(esu8 dat){
    dat=dat;
    es_fur_exe(dat);
}

Теперь компонент FUR готов к использованию.

Руководство по использованию на хосте

Продолжение следует...

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Библиотека для обработки потока данных через последовательный порт. Развернуть Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/ecbm-stream.git
git@api.gitlife.ru:oschina-mirror/ecbm-stream.git
oschina-mirror
ecbm-stream
ecbm-stream
master