0 / 0 / 0
Регистрация: 09.07.2021
Сообщений: 10

ModBus rtu на stm32f030

09.07.2021, 17:54. Показов 4447. Ответов 13

Студворк — интернет-сервис помощи студентам
Доброго вечер всем! При портировании freemodbus v1.5 на stm32f0 возникли небольшие проблемы.
Код собрал, прошил в мк, правда при тестировании Modbus Poll возникают проблемы.
Pool пишет "insufficient bytes recived", действительно если посмотреть на вкладке communication, приходит не весь пакет,
встал на линию переходника rs485->ftdi232 (rxtx), залез в терминал, получаю нормальный ответ :01 04 0A 00 01 00 02 00 04 00 08 00 10 8E E3. Запрос был такой 01 04 00 00 00 05 30 90.
Т.е. в терминале (terminak v1.9) всё есть, в modbus poll нету. Прикрепляю скрин.
код ниже, может где-то наделал дел?
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
eMBErrorCode    eStatus;
int main(void)
{
 
 
  SystemClock_Config();
 
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  MX_TIM17_Init();
  /* USER CODE BEGIN 2 */
  usRegInputBuf[0] = 0x0001;
  usRegInputBuf[1] = 0x0002;
  usRegInputBuf[2] = 0x0004;
  usRegInputBuf[3] = 0x0008;
  usRegInputBuf[4] = 0x0010;
  /*режим ModBus-а*/        /*ID*/      /*скорость*/
  eStatus = eMBInit( MB_RTU, 0x01, 0, 115200, MB_PAR_NONE );
  eStatus = eMBEnable(  );
  /* USER CODE END 2 */
 
 
 
  while (1)
  {
 
    (void)eMBPoll();
 
  }
}
 
eMBErrorCode eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs )
{
  eMBErrorCode    eStatus = MB_ENOERR;
  int iRegIndex = ( int )( usAddress - usRegInputStart - 1);
  
  if((iRegIndex + usNRegs) > REG_INPUT_NREGS)
  {
    return eStatus;
  }
  
  while( usNRegs > 0 )
  {
    *pucRegBuffer++ = (UCHAR)( usRegInputBuf[iRegIndex] >> 8 );
    *pucRegBuffer++ = (UCHAR)( usRegInputBuf[iRegIndex] & 0xFF );
    iRegIndex++;
    usNRegs--;
  }
 
  return MB_ENOERR;
}
 
}
RXE сбрасывается после считывания
TXE судя по RM "It is cleared by a write to the USART_TDR register"
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void USART2_IRQHandler(void)
{
  
  
  if((__HAL_UART_GET_IT(&huart_m, UART_IT_RXNE) != RESET) && (__HAL_UART_GET_IT_SOURCE(&huart_m, UART_IT_RXNE) != RESET)) { 
    prvvUARTRxISR(  ); 
    __HAL_UART_SEND_REQ(&huart_m, UART_RXDATA_FLUSH_REQUEST); 
    return;
  }
  
  if((__HAL_UART_GET_IT(&huart_m, UART_IT_TXE) != RESET) && (__HAL_UART_GET_IT_SOURCE(&huart_m, UART_IT_TXE) != RESET)) {
      prvvUARTTxReadyISR(  );
      return;
  }
Таймер тикает как надо, смотрел осликом.
Да собственно везде ок, иначе стек бы не двbгался. в portserial .c
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  if(xRxEnable)
  {
 
     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET);
    __HAL_UART_ENABLE_IT(&huart_m, UART_IT_RXNE);
   
  }
  else
  {
    __HAL_UART_DISABLE_IT(&huart_m, UART_IT_RXNE);
  }
  
  if(xTxEnable)
  {
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_SET);
    __HAL_UART_ENABLE_IT(&huart_m, UART_IT_TXE); 
    
  }
  else
  {  
    __HAL_UART_DISABLE_IT(&huart_m, UART_IT_TXE);
  }
}
Читал в гуглах, что часто бывает проблема с 1 байтом, лечится затычкой отправки доп.байта, но мне не помогло.

Вопрос, с таким кто-нибудь сталкивался? Вводит в заблуждение нормальный пакет в терминале. Неправильное подключение исключаю, по причине того, что ничего бы не передавалось.
Миниатюры
ModBus rtu на stm32f030  
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.07.2021, 17:54
Ответы с готовыми решениями:

Modbus RTU
Здравствуйте, пытаюсь решить задачу. Нужно послать значение какой-либо переменной с микроконтроллера на панель по протоколу modbus. ...

Modbus RTU на STM32F10x
Доброго времени суток. Столкнулся с задачей реализации Modbus на STM32f100C4T6B. До этого момента знакомства с Modbus не было, начал...

Реализация ModBus rtu на stm32f103
Доброго времени суток. При портировании freemodbus v1.5, по примеру от Динара (https://habr.com/ru/post/307622/), возникает проблеме с...

13
0 / 0 / 0
Регистрация: 09.07.2021
Сообщений: 10
09.07.2021, 18:07  [ТС]
Думаю правильно будет добавить картинку конфигурации чтения Modbus poll
Миниатюры
ModBus rtu на stm32f030  
0
0 / 0 / 0
Регистрация: 09.07.2021
Сообщений: 10
09.07.2021, 18:25  [ТС]
Хммм, дополню ещё. Если поставить тайм-аут 10000 мСек в настройках модбас пула и отладчиком, в течении этого времени прощёлкать отравку байтов, то отправка проходит и пакет приходит весь. Чтож не так-то?
Буд-то бы что-то мешает отправке, хотя других прерываний нет.


Вот так, реализованы критические секции, честно содрано с просторов интернета, тут нет rtos.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
void __critical_enter(void)
{
  __disable_irq();
  ++lock_nesting_count;
}
void __critical_exit(void)
{
  /* Unlock interrupts only when we are exiting the outermost nested call. */
  --lock_nesting_count;
  if (lock_nesting_count == 0) {
    __enable_irq();
  }
}
Миниатюры
ModBus rtu на stm32f030  
0
0 / 0 / 0
Регистрация: 09.07.2021
Сообщений: 10
09.07.2021, 23:30  [ТС]
Подозреваю, что нужно мониторить флаг "TC: Transmission complete", про него сказано в RM. У меня нигде не используется.
Тут я вижу два пути:
1 лобовой - после отправки ждать установки TC.
2 более сложный - TCIE, включить прерывание, по завершению передачи
0
0 / 0 / 0
Регистрация: 09.07.2021
Сообщений: 10
12.07.2021, 14:08  [ТС]
Сам спросил, сам отвечу, почему же в терминале всё было видно а в modbus poll нет.
Ответ: Нажимаем connection->advanced снимаем галочку remove echo.

Флаги дополнительно чистить в прерывании не надо.
UART_IT_RXNE - It is cleared by a read to the USART_RDR register
UART_FLAG_TXE - . It is cleared by a write to the USART_TDR register
Т.е. по прерыванию прочитали очистили, по прерыванию написали очистили.
Чтобы не терять последний байт, мониторим TC: Transmission complete.
0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
12.07.2021, 14:13
Лучший ответ Сообщение было отмечено skvorc как решение

Решение

skvorc, если у вас rs485 то DE надо поднимать после события TC.
Варанты вы уже озвучили сами:
1) полить TC после последнего байта - не интересно
2) включать прерывание TC после последнего байта, уже лучше но, тоже не интересно.
3) Использовать функцию аппаратного DE, которая есть в USART. Он сам будет прижимать линию DE на время отправки и отпускать по окончинию. Почти лучший вариант.
4) Использовать DMA в связке с аппаратным DE и аппаратным таймером таймаута RTO встроенным в USART для практически полной автоматизации приема-передачи Modbus
1
0 / 0 / 0
Регистрация: 09.07.2021
Сообщений: 10
12.07.2021, 15:25  [ТС]
Спасибо за ответ.
@Использовать функцию аппаратного DE, которая есть в USART. Он сам будет прижимать линию DE на время отправки и отпускать по окончинию. Почти лучший вариант." - хорошо бы, всегда лучше не тратить напрасно ресурсы, но PA1 уже занят. Сейчас посмотрю, можно ли его заремапить.

Добавлено через 44 минуты
Использую USART2. На stm32f0c8 USART2_DE на PA1, у меня на PA12...
На USART1 не махнёшь, тогда нужны пины PA10 и PA9, для RX/TX, у меня PA2, PA3.

Пока работает "2) включать прерывание TC после последнего байта, уже лучше но, тоже не интересно", по такому варианту.
Надо плату переразвести. Спасибо за ответы.
Как закрыть тему?
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
12.07.2021, 19:21
Цитата Сообщение от skvorc Посмотреть сообщение
Как закрыть тему?
никак
правила п 2.3
Сообщения и темы, а также другой контент, размещаемый на форуме, по просьбам пользователей не удаляется и не закрывается.
1
0 / 0 / 0
Регистрация: 09.07.2021
Сообщений: 10
12.07.2021, 19:22  [ТС]
Хорошо, спасибо
0
0 / 0 / 0
Регистрация: 09.07.2021
Сообщений: 10
29.09.2021, 09:04  [ТС]
"3) Использовать функцию аппаратного DE, которая есть в USART. Он сам будет прижимать линию DE на время отправки и отпускать по окончинию. Почти лучший вариант", переделал, работает.
Чуть позже надо почитать RM и сделать
"4) Использовать DMA в связке с аппаратным DE и аппаратным таймером таймаута RTO встроенным в USART для практически полной автоматизации приема-передачи Modbus"
Ещё раз спасибо.
0
0 / 0 / 0
Регистрация: 04.10.2021
Сообщений: 2
04.10.2021, 20:52
Через STM cube портировали и собирали?
Нужно тоже собрать модбас под stm f0 серии,что то особо не получается.
0
0 / 0 / 0
Регистрация: 09.07.2021
Сообщений: 10
05.10.2021, 12:55  [ТС]
Да, сейчас наоборот стараюсь больше через cmsis, так сказать обучение задом наперёд пошло.
Что именно не получается, на каком моменте встали?
Под рукой есть чем тестить, переходник uart-usb, modbas pool, осциллограф?
0
0 / 0 / 0
Регистрация: 04.10.2021
Сообщений: 2
05.10.2021, 20:48
Есть релейная плата из китая У нее 8 входов,8 выходов, собрана на STM32F030. Стандартная прошивка нормально не работает с модбасом,и др.косяки.
Цитата Сообщение от skvorc Посмотреть сообщение
Что именно не получается, на каком моменте встали?
Первый мой опыт работы с STM, до этого опыт с ардуиной и ESP, по этому тут темный лес, как портировать протокол модбас и прочее...
Цитата Сообщение от skvorc Посмотреть сообщение
Под рукой есть чем тестить, переходник uart-usb, modbas pool, осциллограф?
Есть stlink,USB to RS485 есть, осциллограф есть.
0
0 / 0 / 0
Регистрация: 09.07.2021
Сообщений: 10
05.10.2021, 21:33  [ТС]
Хмм, первый опыт и сразу в modbus. Ну да ладно, дело не моё, скажу лишь, что отвечать вот прям сразу не смогу, сейчас здоровьем занимаюсь, но чем смогу.
Для начала нужно качнуть даташит и reference manual, хотя бы бегло пройтись по схеме тактирования, посмотреть на плате какие ножки контроллера rx tx у вас используются и подключены к физике 485. Открыть в rm usart, почитать, что-то понять, что-то нет, там же почитать про таймера и их настройки, нам это тоже понадобится.

На этом этапе уже кое какие моменты должны в голове проясниться. Далее наступает момент когда вы должны решить, будете всё руками настраивать, через регистры и офсеты, записывая туда настройки периферии, либо пойти путем hal_driver, устраивать вечный дискусс о том что лучше не буду. Скажу, что в дальнейшем всё равно придётся разобраться, что под капотом.
Теперь нужно решить, какой ide пользоваться или какая у вас есть в наличии? Вы под windows работаете или Linux?
Нужно создать и настроить проект, если вы будете делать это через куб, не составит труда.
Потом качаем саму библиотеку, modbus, портируем в проект нужные файлы. Когда будете качать библиотеку, нагуглите, там достаточно подробная инструкция. Там же будет иерархия проекта.
Скажу пока, что дальше нужно будет настроить тактирования контроллера (опять-таки hal с кубом и структурами или регистры), тактирование периферии, настроить работу uart, таймера, без него никак, и все эти дела впихнуть в xMBPortSerialInit().

А и вопрос, стандартный прошивка не работает с modbus,вы как определили? А то порой такие смешные ошибки бывают (я про себя).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.10.2021, 21:33
Помогаю со студенческими работами здесь

STM32F103 подключение через UART-RS485 счетчик Modbus RTU не отзывается
Электрически все подключается через UART2->конвертер-RS485->счетчик 1. Проверка счетчика через ПК->USB-конвертер-RS485->счетчик,...

Modbus RTU - разобрать сформированный запрос к Slave
Добрый день Не могу разобраться с работой modbus rtu что значит запрос 024600e260? 02 - номер модуля 46 - функция и нет нигде...

Modbus RTU через интерфейс rs-485
Всем привет! Разбираюсь с Modbus RTU. Просто хочу быть уверен, что двигаюсь в правильном направлении. Задача: ПК - мастер;...

Modbus rtu или asci на mega128
Доброго времени суток уважаемые форумчане! Стоит задача реализовать modbus на mega128 для связи МК с преобразователем частоты Omron/...

Modbus RTU помогите разобраться с прогой (прототипом).
Доброго времени суток уважаемые форумчане. Хотелось бы посоветоваться с Вами по поводу одного вопроса. Проблема заключается в следующем:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru