реклама на сайте
подробности

 
 
> STM32F051K8 передача данных с UART1 на UART2 и обратно, мост между UART-ами
Alla_student
сообщение Aug 13 2016, 07:18
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 5-04-11
Пользователь №: 64 146



Здравствуй All!

Необходимо написать программную поддержку передачи данных между встроенными портами UART1 и UART2 STM32F051.

Алгоритм такой:
1. Прием данных с порта UART1 микроконтроллера, он подключен к PC, который всегда является мастером и запрашивает данные с устройства, которое подключено к порту UART2 микроконтроллера.
2. Загрузка принятых данных с UART1 в буфер1 256 байт, принятый пакет всегда меньше.
3. Передача данных из буфера1 в UART2.
4. Ожидание ответа внешнего устройства подключенного к UART2, и после получение данных в другой буфер2, то же 256 байт, иначе выход по таймауту 10 сек.
5. Передача данных из буфера2 в UART1 в сторону PC.

PS: Скорость передачи на портах UART1 и UART2 разная!

Я понимаю, что надо использовать прерывания, но запуталась с флагами, и пока ничего рабочего не получается. С DMA просто боюсь связываться.
В конференциях аналогичного ничего рабочего не нашла.
Буду признательна, если кто нибудь объяснит и даст пример рабочего кода для этой задачи.

С уважением. Вечный студент Алла.

Сообщение отредактировал Alla_student - Aug 14 2016, 05:34
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
x893
сообщение Aug 14 2016, 08:35
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Алгоритм работы раскрыт не полностью.
1. Что происходит если приходит байт из устройства, а
а. буфер от PC не заполнен
б. буфер от PC передан на устройство не полностью

2. Что проиодит, если данные передаются в PC, а
а. Приходят данные от устройства
б. приходят данные от PC

Нарисуйте на бумажке диаграмму работы (из стрелок и квадратиков).
Начальных точек входа у Вас 4
1. Приняты данные от PC
2. Отправлены данные в PC
3. Приняты данные от устройства
4. Отправлены данные в устройство.

Коды наколбасить для STM или любого другого - два часа максимум.
Go to the top of the page
 
+Quote Post
Alla_student
сообщение Aug 14 2016, 15:30
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 5-04-11
Пользователь №: 64 146



Цитата(x893 @ Aug 14 2016, 12:35) *
Алгоритм работы раскрыт не полностью.
1. Что происходит если приходит байт из устройства, а
а. буфер от PC не заполнен

Я выше писала, что работа PC в режиме мастера, уточняю - работа PC запрос устройства посылкой пакета данных со стороны PC и через промежуток времени в течении 10сек ответ устройства. Работа в режиме только запрос - ответ.
Цитата
б. буфер от PC передан на устройство не полностью

- нет и ответа от устройства. Пакетный режим - известно начало и конец пакета, но пока я не хотела его определять, а тупо принимать - передавать.
Цитата
2. Что проиодит, если данные передаются в PC, а
а. Приходят данные от устройства

Не придут без запроса - см. выше.
Цитата
б. приходят данные от PC

Пока PC не получит ответ полностью от устройства, ничего передавать не будет.

Цитата
Нарисуйте на бумажке диаграмму работы (из стрелок и квадратиков).
Начальных точек входа у Вас 4
1. Приняты данные от PC
2. Отправлены данные в PC
3. Приняты данные от устройства
4. Отправлены данные в устройство.

Коды наколбасить для STM или любого другого - два часа максимум.

Вроде бы без диаграммы я ясно написала, но если надо - то нарисую.

С уважением, Вечный студент Алла.

Цитата(adnega @ Aug 14 2016, 10:55) *
Я бы сделал реализацию кольцевого FIFO-буфера. Создал бы два экземпляра - на прием и на передачу.
Далее все просто:
1. При приеме символов из UART1 помещал бы их в первый буфер.
2. При приеме символов из UART2 помещал бы их во второй буфер.
3. При наличии символов в первом буфере и готовности передатчика UART2 выбирал бы их оттуда и записывал в UART2.
4. При наличии символов во втором буфере и готовности передатчика UART1 выбирал бы их оттуда и записывал в UART1.

Пример реализации кольцевого FIFO-буфера:
CODE
//-----------------------------------------------------------------------------
// void sp_tx_push(sSERIAL_PORT *port, const BYTE x)
//-----------------------------------------------------------------------------
void sp_tx_push(sSERIAL_PORT *port, const BYTE x)
{
int tmp_t;
port->tx_buf[port->tx_t] = x;
tmp_t = port->tx_t + 1;
if(tmp_t >= port->tx_size) tmp_t -= port->tx_size;
if(tmp_t != port->tx_b) port->tx_t = tmp_t;
}

//-----------------------------------------------------------------------------
// BYTE sp_tx_pop(sSERIAL_PORT *port)
//-----------------------------------------------------------------------------
BYTE sp_tx_pop(sSERIAL_PORT *port)
{
BYTE x;
if(port->tx_b == port->tx_t) return 0;
x = port->tx_buf[port->tx_b];
port->tx_buf[port->tx_b++] = 0;
if(port->tx_b >= port->tx_size) port->tx_b -= port->tx_size;
return x;
}


Опрос флагов UART, запись и чтение регистра данных UART, инициализация UART - тривиально.


Спасибо за код кольцевого буфера FIFO, но как я выше писала, не могу с флагами и приоритетами разобраться, чтобы алгоритм приема передачи между портами работал. Вот полный код с инициализацией мне бы помог.
Заранее спасибо! Вечный студент Алла.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Alla_student   STM32F051K8 передача данных с UART1 на UART2 и обратно   Aug 13 2016, 07:18
- - RabidRabbit   По-моему, с таким алгоритмом и прерываний не требу...   Aug 13 2016, 18:54
|- - toweroff   Цитата(RabidRabbit @ Aug 13 2016, 21:54) ...   Aug 13 2016, 20:26
||- - TSerg   Цитата(toweroff @ Aug 13 2016, 23:26) ну ...   Aug 13 2016, 20:29
|- - Alla_student   Цитата(RabidRabbit @ Aug 13 2016, 22:54) ...   Aug 14 2016, 05:32
- - adnega   Я бы сделал реализацию кольцевого FIFO-буфера. Соз...   Aug 14 2016, 06:55
|- - RabidRabbit   Цитата(Alla_student @ Aug 14 2016, 19:30)...   Aug 14 2016, 16:36
|- - adnega   Цитата(RabidRabbit @ Aug 14 2016, 19:36) ...   Aug 14 2016, 17:00
|- - Alla_student   Цитата(adnega @ Aug 14 2016, 21:00) Т.к. ...   Aug 14 2016, 20:33
|- - adnega   Цитата(Alla_student @ Aug 14 2016, 23:33)...   Aug 14 2016, 22:35
|- - Alla_student   Цитата(adnega @ Aug 15 2016, 01:35) Обычн...   Aug 16 2016, 06:32
|- - adnega   Цитата(Alla_student @ Aug 16 2016, 09:32)...   Aug 16 2016, 08:19
- - RabidRabbit   Цитата(adnega)Т.к. скорости разные, то предположим...   Aug 14 2016, 17:28
|- - adnega   Цитата(RabidRabbit @ Aug 14 2016, 20:28) ...   Aug 14 2016, 18:08
- - x893   Доктору без анализов трудно помочь больному. Так ж...   Aug 16 2016, 10:18


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 13:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.01394 секунд с 7
ELECTRONIX ©2004-2016