STREAM-фреймворк
Введение Здесь stream — это не известная игровая платформа. Stream означает «поток» и относится к фреймворку, который используется для обработки последовательных потоков данных через последовательный порт.
Целью разработки фреймворка stream было решение проблемы длительного времени обработки прерываний при одновременном использовании нескольких протоколов последовательного порта. Фреймворк stream сохраняет данные последовательного порта в буфер, а затем обрабатывает их в основной функции. Это позволяет быстро завершать прерывания без влияния на выполнение других функций.
Структура фреймворка Для обеспечения совместимости с различными протоколами последовательного порта, фреймворк stream не использует структуру, основанную на завершении символа для запуска обработки. Поскольку после добавления новых протоколов каждый раз проверять завершение символа становится затратной операцией, и один протокол может использовать символ завершения другого протокола. Поэтому фреймворк использует структуру записи прерываний и тайм-аута. В большинстве случаев данные в одном кадре передаются непрерывно, а между кадрами есть определённый временной интервал, поэтому эта структура подходит для большинства протоколов последовательного порта.
Фреймворк и компоненты На самом деле этот фреймворк очень прост: он сохраняет данные последовательного порта и проверяет наличие тайм-аутов. Простота означает высокую эффективность выполнения, а также гибкость для расширения.
Что касается расширения, текущий репозиторий git включает в себя встроенный компонент сравнения, а также предоставляет два компонента протокола, которые можно оценить с точки зрения расширяемости фреймворка. Поняв эти компоненты, можно самостоятельно разработать новые компоненты.
Установка и настройка фреймворка STREAM
Процесс установки
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();
}
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;
//в настоящее время пусто, без компонентов.
}
#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.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 легко найти в Интернете, поэтому они здесь не рассматриваются. Этот компонент включает в себя семь часто используемых команд:
Установка отладочного компонента
Первый шаг: добавьте файл 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 )