Вопрос. Отправка и прием структуры через UART

Вопрос

На этом форуме Вы можете задать вопросы знатокам программы и автору.
Ответить
nickass
Рядовой
Сообщения: 61
Зарегистрирован: 01.05.2022{, 14:13}
Репутация: 12
Откуда: Киров
Имя: Николай

Вопрос. Отправка и прием структуры через UART

#1

Сообщение nickass » 07.11.2023{, 18:54}

Подскажите пожалуйста, как можно отправить и принять структуру через UART ?
Задача такая, имеем 4 переменные Integer, нужно их отправить через UART с одного контроллера на другой.
Идеальный вариант с помощью структуры, но в Стандартных блоках вроде бы такой возможности нет.

ecoins
Полковник
Сообщения: 2946
Зарегистрирован: 12.02.2016{, 11:40}
Репутация: 454
Откуда: Шатура
Имя: Энвер

Вопрос. Отправка и прием структуры через UART

#2

Сообщение ecoins » 07.11.2023{, 19:06}

Блок UART есоins может отправлять группы однотипных переменных - можете разместить данные из структуры и отправить.
С уважением,Энвер.

nickass
Рядовой
Сообщения: 61
Зарегистрирован: 01.05.2022{, 14:13}
Репутация: 12
Откуда: Киров
Имя: Николай

Вопрос. Отправка и прием структуры через UART

#3

Сообщение nickass » 07.11.2023{, 21:42}

Энвер, спасибо.

nickass
Рядовой
Сообщения: 61
Зарегистрирован: 01.05.2022{, 14:13}
Репутация: 12
Откуда: Киров
Имя: Николай

Вопрос. Отправка и прием структуры через UART

#4

Сообщение nickass » 08.11.2023{, 16:20}

Разобрался. Оказывается во встроенных блоках Отправка и Прием переменной в UART, FlProg создает структуру.

skrickis
Рядовой
Сообщения: 86
Зарегистрирован: 05.02.2017{, 12:02}
Репутация: 9

Вопрос. Отправка и прием структуры через UART

#5

Сообщение skrickis » 08.11.2023{, 17:03}

ecoins писал(а):
07.11.2023{, 19:06}
Блок UART есоins может отправлять группы однотипных переменных
Тоже интересует этот вариант
я так понимаю отправка с этого блока

а чем принимать ?
Вложения
1.jpg

nickass
Рядовой
Сообщения: 61
Зарегистрирован: 01.05.2022{, 14:13}
Репутация: 12
Откуда: Киров
Имя: Николай

Вопрос. Отправка и прием структуры через UART

#6

Сообщение nickass » 08.11.2023{, 17:40}

skrickis писал(а):
08.11.2023{, 17:03}
а чем принимать ?
Ага, тоже не нашел чем принимать. Решил стандартными блоками попробовать, при компилировании просмотрел скетч, а там все переменные в структуру упакованы.

skrickis
Рядовой
Сообщения: 86
Зарегистрирован: 05.02.2017{, 12:02}
Репутация: 9

Вопрос. Отправка и прием структуры через UART

#7

Сообщение skrickis » 08.11.2023{, 18:14}

вопрос к автору
мне не компилируется и отправка
STM32F407VGT
я правильно тест сделал ?
Вложения
2.png
1.png
uart1.flp
(5.26 МБ) 15 скачиваний

ecoins
Полковник
Сообщения: 2946
Зарегистрирован: 12.02.2016{, 11:40}
Репутация: 454
Откуда: Шатура
Имя: Энвер

Вопрос. Отправка и прием структуры через UART

#8

Сообщение ecoins » 08.11.2023{, 21:16}

Тест написан правильно. Но возможно:
1.используется не то ядро - нужно https://github.com/stm32duino/Arduino_Core_STM32 вроде версия 2.6.0
2.выбран не тот контроллер - поддерживается DevEboxSTM32F407VE - написал по памяти, под рукой нет компьютера.
С уважением, Энвер.

skrickis
Рядовой
Сообщения: 86
Зарегистрирован: 05.02.2017{, 12:02}
Репутация: 9

Вопрос. Отправка и прием структуры через UART

#9

Сообщение skrickis » 08.11.2023{, 22:59}

ecoins писал(а):
08.11.2023{, 21:16}
выбран не тот контроллер - поддерживается DevEboxSTM32F407VE
попробую :smile9:

koba
Рядовой
Сообщения: 8
Зарегистрирован: 11.11.2023{, 02:48}
Репутация: 0
Имя: 4l1kyt

Вопрос. Отправка и прием структуры через UART

#10

Сообщение koba » 11.11.2023{, 17:24}

приветствую всех , кто может помочь , в общем ме нужна принимат данные из UART с контрольной суммои , после блока прием из UART подключаю блок UART_to_4byte
из пользовательских блоков , все конечно работает но при скоростном приема данных сигналы перескакивает (я не имею в виду скорость передача данных 9600) а само скорость интенсивности сигналов , очевидно без етого блока (UART_to_4byte ) скорост нормалная , может я что то нетак делаю напишите пожалуйста как это исправит

nickass
Рядовой
Сообщения: 61
Зарегистрирован: 01.05.2022{, 14:13}
Репутация: 12
Откуда: Киров
Имя: Николай

Вопрос. Отправка и прием структуры через UART

#11

Сообщение nickass » 11.11.2023{, 19:01}

koba писал(а):
11.11.2023{, 17:24}
кто может помочь
Приложите проект сюда, так быстрее помогут.
Золотое правило, чтобы получить грамотный ответ, нужно задать грамотный вопрос, а лучше приложить проект )))

koba
Рядовой
Сообщения: 8
Зарегистрирован: 11.11.2023{, 02:48}
Репутация: 0
Имя: 4l1kyt

Вопрос. Отправка и прием структуры через UART

#12

Сообщение koba » 11.11.2023{, 19:16}

вот схема

Отправлено спустя 10 минут 16 секунд:
nickass писал(а):
11.11.2023{, 19:01}
Приложите проект сюда, так быстрее помогут.
Золотое правило, чтобы получить грамотный ответ, нужно задать грамотный вопрос, а лучше приложить проект )))
обработка данных в (UART_to_4byte ) проходит медленно
Вложения
koba.png

koba
Рядовой
Сообщения: 8
Зарегистрирован: 11.11.2023{, 02:48}
Репутация: 0
Имя: 4l1kyt

Вопрос. Отправка и прием структуры через UART

#13

Сообщение koba » 13.11.2023{, 23:30}

я извеняюс прошу прошение

aidar_i
Полковник
Сообщения: 3130
Зарегистрирован: 24.12.2016{, 16:55}
Репутация: 677
Откуда: Уфа
Имя: Айдар
Контактная информация:

Вопрос. Отправка и прием структуры через UART

#14

Сообщение aidar_i » 14.11.2023{, 19:56}

koba писал(а):
11.11.2023{, 19:26}
кто может помочь
Лучше все таки приложите вот этот кусок проекта , чтобы ответить нужно посмотреть скетч.

koba
Рядовой
Сообщения: 8
Зарегистрирован: 11.11.2023{, 02:48}
Репутация: 0
Имя: 4l1kyt

Вопрос. Отправка и прием структуры через UART

#15

Сообщение koba » 15.11.2023{, 22:07}

aidar_i писал(а):
14.11.2023{, 19:56}
Лучше все таки приложите вот этот кусок проекта , чтобы ответить нужно посмотреть скетч.
из UART выходит такои протокол
1-й байт - стартовый всегда 0xFF (255);
2-й байт - номер модуля 0x01 - 0x20 (1 - 32);
3-й байт - номер канала 0x01 - 0x20 (1 - 32);
4-й байт - контрольная сумма CRC8 2-го и 3-го байта.

передача сигналов происходит как вручную так и автоматически

Отправлено спустя 1 минуту 11 секунд:
а воти скеч самого блока

// Uart_to_4byte
ok = false;
if ((new) and (!new_old))
{
time_old = millis();
switch (N_byte)
{
case 0 : out1 = in; break;
case 1 : out2 = in; break;
case 2 : out3 = in; break;
case 3 : out4 = in; break;
case 4 : bsumm_in = in; break;
}
N_byte++;
}
if (N_byte>0)
{
time = (millis() - time_old);
if (time > TimeOut)
{
N_byte = 0;
bsumm = out1 + out2; // контрольная сумма
bsumm += out3;
bsumm += out4;
bsumm = bsumm xor 255;
bsumm++;
if (bsumm == bsumm_in ) {ok = true;} // если контрольная сумма сошлась
}
}
new_old = new;

Отправлено спустя 7 минут 17 секунд:
попробовал еще с массивами но в этом случае выходи нужно както стабилизироват

Отправлено спустя 10 минут 23 секунды:
контролер arduino uno , переход usb to serial ft232

Отправлено спустя 2 часа 55 минут 55 секунд:
а вот и скомпилированный скетч первоначального проекта

Отправлено спустя 1 минуту 46 секунд:
#include "flprogUtilites.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C _lcd1(0x27, 16, 2);
int _dispTempLength1=0;
boolean _isNeedClearDisp1;
int _AvlDFU0 = 0;
byte in_68984595_1;
bool new_68984595_1;
byte out1_68984595_1;
byte out2_68984595_1;
byte out3_68984595_1;
byte out4_68984595_1;
bool ok_68984595_1;
bool new_old_68984595_1;
byte N_byte_68984595_1;
unsigned long time_68984595_1;
unsigned long time_old_68984595_1;
byte bsumm_68984595_1;
byte bsumm_in_68984595_1;
bool _ByteToBit_1_outArray[8];
int _disp3oldLength = 0;
int _disp2oldLength = 0;
byte _RVFU1Data;
int _disp1oldLength = 0;
int _disp5oldLength = 0;
byte _tempVariable_byte;
void setup()
{
pinMode(4, OUTPUT);
digitalWrite(4, 0);
pinMode(5, OUTPUT);
digitalWrite(5, 0);
pinMode(6, OUTPUT);
digitalWrite(6, 0);
pinMode(7, OUTPUT);
digitalWrite(7, 0);
pinMode(8, OUTPUT);
digitalWrite(8, 0);
pinMode(9, OUTPUT);
digitalWrite(9, 0);
pinMode(10, OUTPUT);
digitalWrite(10, 0);
pinMode(11, OUTPUT);
digitalWrite(11, 0);
pinMode(3, OUTPUT);
digitalWrite(3, 0);
Wire.begin();
delay(10);
_startUart0();
_lcd1.init();
_lcd1.backlight();
}
void loop()
{
if (_isNeedClearDisp1)
{
_lcd1.clear();
_isNeedClearDisp1= 0;
}
if (_AvlDFU0)
{
_AvlDFU0=0;
}
else
{
if (Serial.available())
{
_AvlDFU0=1;
_readByteFromUART((Serial.read()),0);
}
}
//Плата:1
in_68984595_1 = _RVFU1Data;
new_68984595_1 = _AvlDFU0;
// Uart_to_4byte
ok_68984595_1 = false;
if ((new_68984595_1) and (!new_old_68984595_1))
{
time_old_68984595_1 = millis();
switch (N_byte_68984595_1)

{
case 0 : out1_68984595_1 = in_68984595_1;
break;
case 1 : out2_68984595_1 = in_68984595_1;
break;
case 2 : out3_68984595_1 = in_68984595_1;
break;
case 3 : out4_68984595_1 = in_68984595_1;
break;
case 4 : bsumm_in_68984595_1 = in_68984595_1;
break;

}
N_byte_68984595_1++;
}
if (N_byte_68984595_1>0)
{
time_68984595_1 = (millis() - time_old_68984595_1);
if (time_68984595_1 > 30)

{
N_byte_68984595_1 = 0;
bsumm_68984595_1 = out1_68984595_1 + out2_68984595_1; // контрольная сумма
bsumm_68984595_1 += out3_68984595_1;
bsumm_68984595_1 += out4_68984595_1;
bsumm_68984595_1 = bsumm_68984595_1 xor 255;
bsumm_68984595_1++;
if (bsumm_68984595_1 == bsumm_in_68984595_1)
{
ok_68984595_1 = true;
}
// если контрольная сумма сошлась

}
}
new_old_68984595_1 = new_68984595_1;
digitalWrite(3, ok_68984595_1);
if (1)
{
_dispTempLength1 = (((String(out4_68984595_1, DEC)))).length();
if (_disp5oldLength > _dispTempLength1)
{
_isNeedClearDisp1 = 1;
}
_disp5oldLength = _dispTempLength1;
_lcd1.setCursor(0, 0);
_lcd1.print(((String(out4_68984595_1, DEC))));
}
else
{
if (_disp5oldLength > 0)
{
_isNeedClearDisp1 = 1;
_disp5oldLength = 0;
}
}
if (1)
{
_dispTempLength1 = (((String(out3_68984595_1, DEC)))).length();
if (_disp3oldLength > _dispTempLength1)
{
_isNeedClearDisp1 = 1;
}
_disp3oldLength = _dispTempLength1;
_lcd1.setCursor(8, 1);
_lcd1.print(((String(out3_68984595_1, DEC))));
}
else
{
if (_disp3oldLength > 0)
{
_isNeedClearDisp1 = 1;
_disp3oldLength = 0;
}
}
_tempVariable_byte = out2_68984595_1;
for (int i=0; i < 8; i++)
{
_ByteToBit_1_outArray = bitRead(_tempVariable_byte, i);
}
digitalWrite(11, _ByteToBit_1_outArray[7]);
digitalWrite(10, _ByteToBit_1_outArray[6]);
digitalWrite(9, _ByteToBit_1_outArray[5]);
digitalWrite(8, _ByteToBit_1_outArray[4]);
digitalWrite(7, _ByteToBit_1_outArray[3]);
digitalWrite(6, _ByteToBit_1_outArray[2]);
digitalWrite(5, _ByteToBit_1_outArray[1]);
digitalWrite(4, _ByteToBit_1_outArray[0]);
if (1)
{
_dispTempLength1 = (((String(out2_68984595_1, DEC)))).length();
if (_disp1oldLength > _dispTempLength1)
{
_isNeedClearDisp1 = 1;
}
_disp1oldLength = _dispTempLength1;
_lcd1.setCursor(8, 0);
_lcd1.print(((String(out2_68984595_1, DEC))));
}
else
{
if (_disp1oldLength > 0)
{
_isNeedClearDisp1 = 1;
_disp1oldLength = 0;
}
}
if (1)
{
_dispTempLength1 = (((String(out1_68984595_1, DEC)))).length();
if (_disp2oldLength > _dispTempLength1)
{
_isNeedClearDisp1 = 1;
}
_disp2oldLength = _dispTempLength1;
_lcd1.setCursor(0, 1);
_lcd1.print(((String(out1_68984595_1, DEC))));
}
else
{
if (_disp2oldLength > 0)
{
_isNeedClearDisp1 = 1;
_disp2oldLength = 0;
}
}
}
void _readByteFromUART(byte data,int port)
{
if (port==0)
{
_RVFU1Data = data;
}
}
void _startUart0()
{
int code= 6;
Serial.begin(9600, (flprog::serialModeFromInt(code)));
}

Отправлено спустя 3 часа 27 минут 10 секунд:
привожу сам проект
Вложения
111.flp
(468.67 КБ) 10 скачиваний
123456.png

koba
Рядовой
Сообщения: 8
Зарегистрирован: 11.11.2023{, 02:48}
Репутация: 0
Имя: 4l1kyt

Вопрос. Отправка и прием структуры через UART

#16

Сообщение koba » 16.11.2023{, 08:08}

все решилось оказалось из за дисплея тормозил

Naladchik
Капитан
Сообщения: 824
Зарегистрирован: 04.10.2015{, 19:10}
Репутация: 153
Откуда: Новосибирск
Имя: Павел

Вопрос. Отправка и прием структуры через UART

#17

Сообщение Naladchik » 16.11.2023{, 08:40}

я бы попробовал вот так
Вложения
123.png
123.png (10.28 КБ) 343 просмотра
Win10-64. FLProg Portable.
Изображение

koba
Рядовой
Сообщения: 8
Зарегистрирован: 11.11.2023{, 02:48}
Репутация: 0
Имя: 4l1kyt

Вопрос. Отправка и прием структуры через UART

#18

Сообщение koba » 16.11.2023{, 08:51}

Naladchik писал(а):
16.11.2023{, 08:40}
я бы попробовал вот так
спасибо но проблема в том что из (OK) не выходит никакого сигнала

Отправлено спустя 1 минуту 38 секунд:
в самом блоке назначена другие пини для контрольной суммы

Naladchik
Капитан
Сообщения: 824
Зарегистрирован: 04.10.2015{, 19:10}
Репутация: 153
Откуда: Новосибирск
Имя: Павел

Вопрос. Отправка и прием структуры через UART

#19

Сообщение Naladchik » 16.11.2023{, 09:04}

koba писал(а):
16.11.2023{, 08:53}
из (OK) не выходит никакого сигнала
судя по тексту кода блока на его выходе ok должен сформироваться импульс при совпадении контрольных сумм, но он будет только в течении одного программного цикла, т.е. увидеть его (подав его на выход/светодиод) не получиться, слишком короткий.
Win10-64. FLProg Portable.
Изображение

koba
Рядовой
Сообщения: 8
Зарегистрирован: 11.11.2023{, 02:48}
Репутация: 0
Имя: 4l1kyt

Вопрос. Отправка и прием структуры через UART

#20

Сообщение koba » 16.11.2023{, 09:06}

попробую поставит тт тригер

Отправлено спустя 7 минут 32 секунды:
нет не выходит ничего

Отправлено спустя 4 минуты 29 секунд:
в блоке указан так (bsumm = out1 + out2; // контрольная сумма)

а протокол у меня другои

1-й байт - стартовый всегда 0xFF (255);
2-й байт - номер модуля 0x01 - 0x20 (1 - 32);
3-й байт - номер канала 0x01 - 0x20 (1 - 32);
4-й байт - контрольная сумма CRC8 2-го и 3-го байта.

Отправлено спустя 1 минуту 25 секунд:
по моиму должен быт так out2+out3

Ответить

Вернуться в «Спросить у знатоков»