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

На этом форуме Вы можете задать вопросы знатокам программы и автору.
Ответить
nickass
Рядовой
Сообщения: 84
Зарегистрирован: 01 май 2022, 14:13
Откуда: Киров
Имя: Николай
Поблагодарили: 3 раза

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

Сообщение nickass »

Подскажите пожалуйста, как можно отправить и принять структуру через UART ?
Задача такая, имеем 4 переменные Integer, нужно их отправить через UART с одного контроллера на другой.
Идеальный вариант с помощью структуры, но в Стандартных блоках вроде бы такой возможности нет.
ecoins
Полковник
Сообщения: 4007
Зарегистрирован: 12 фев 2016, 11:40
Откуда: Шатура
Имя: Энвер
Благодарил (а): 137 раз
Поблагодарили: 153 раза

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

Сообщение ecoins »

Блок UART есоins может отправлять группы однотипных переменных - можете разместить данные из структуры и отправить.
С уважением,Энвер.
nickass
Рядовой
Сообщения: 84
Зарегистрирован: 01 май 2022, 14:13
Откуда: Киров
Имя: Николай
Поблагодарили: 3 раза

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

Сообщение nickass »

Энвер, спасибо.
nickass
Рядовой
Сообщения: 84
Зарегистрирован: 01 май 2022, 14:13
Откуда: Киров
Имя: Николай
Поблагодарили: 3 раза

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

Сообщение nickass »

Разобрался. Оказывается во встроенных блоках Отправка и Прием переменной в UART, FlProg создает структуру.
skrickis
Сержант
Сообщения: 159
Зарегистрирован: 05 фев 2017, 12:02
Благодарил (а): 4 раза
Поблагодарили: 16 раз

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

Сообщение skrickis »

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

а чем принимать ?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
nickass
Рядовой
Сообщения: 84
Зарегистрирован: 01 май 2022, 14:13
Откуда: Киров
Имя: Николай
Поблагодарили: 3 раза

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

Сообщение nickass »

skrickis писал(а): 08 ноя 2023, 17:03 а чем принимать ?
Ага, тоже не нашел чем принимать. Решил стандартными блоками попробовать, при компилировании просмотрел скетч, а там все переменные в структуру упакованы.
skrickis
Сержант
Сообщения: 159
Зарегистрирован: 05 фев 2017, 12:02
Благодарил (а): 4 раза
Поблагодарили: 16 раз

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

Сообщение skrickis »

вопрос к автору
мне не компилируется и отправка
STM32F407VGT
я правильно тест сделал ?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
ecoins
Полковник
Сообщения: 4007
Зарегистрирован: 12 фев 2016, 11:40
Откуда: Шатура
Имя: Энвер
Благодарил (а): 137 раз
Поблагодарили: 153 раза

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

Сообщение ecoins »

Тест написан правильно. Но возможно:
1.используется не то ядро - нужно https://github.com/stm32duino/Arduino_Core_STM32 вроде версия 2.6.0
2.выбран не тот контроллер - поддерживается DevEboxSTM32F407VE - написал по памяти, под рукой нет компьютера.
С уважением, Энвер.
skrickis
Сержант
Сообщения: 159
Зарегистрирован: 05 фев 2017, 12:02
Благодарил (а): 4 раза
Поблагодарили: 16 раз

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

Сообщение skrickis »

ecoins писал(а): 08 ноя 2023, 21:16 выбран не тот контроллер - поддерживается DevEboxSTM32F407VE
попробую :smile9:
koba
Рядовой
Сообщения: 8
Зарегистрирован: 11 ноя 2023, 02:48
Имя: 4l1kyt

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

Сообщение koba »

приветствую всех , кто может помочь , в общем ме нужна принимат данные из UART с контрольной суммои , после блока прием из UART подключаю блок UART_to_4byte
из пользовательских блоков , все конечно работает но при скоростном приема данных сигналы перескакивает (я не имею в виду скорость передача данных 9600) а само скорость интенсивности сигналов , очевидно без етого блока (UART_to_4byte ) скорост нормалная , может я что то нетак делаю напишите пожалуйста как это исправит
nickass
Рядовой
Сообщения: 84
Зарегистрирован: 01 май 2022, 14:13
Откуда: Киров
Имя: Николай
Поблагодарили: 3 раза

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

Сообщение nickass »

koba писал(а): 11 ноя 2023, 17:24 кто может помочь
Приложите проект сюда, так быстрее помогут.
Золотое правило, чтобы получить грамотный ответ, нужно задать грамотный вопрос, а лучше приложить проект )))
koba
Рядовой
Сообщения: 8
Зарегистрирован: 11 ноя 2023, 02:48
Имя: 4l1kyt

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

Сообщение koba »

вот схема

Отправлено спустя 10 минут 16 секунд:
nickass писал(а): 11 ноя 2023, 19:01 Приложите проект сюда, так быстрее помогут.
Золотое правило, чтобы получить грамотный ответ, нужно задать грамотный вопрос, а лучше приложить проект )))
обработка данных в (UART_to_4byte ) проходит медленно
У вас нет необходимых прав для просмотра вложений в этом сообщении.
koba
Рядовой
Сообщения: 8
Зарегистрирован: 11 ноя 2023, 02:48
Имя: 4l1kyt

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

Сообщение koba »

я извеняюс прошу прошение
aidar_i
Полковник
Сообщения: 3360
Зарегистрирован: 24 дек 2016, 16:55
Откуда: Уфа
Имя: Айдар
Благодарил (а): 13 раз
Поблагодарили: 100 раз
Контактная информация:

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

Сообщение aidar_i »

koba писал(а): 11 ноя 2023, 19:26 кто может помочь
Лучше все таки приложите вот этот кусок проекта , чтобы ответить нужно посмотреть скетч.
koba
Рядовой
Сообщения: 8
Зарегистрирован: 11 ноя 2023, 02:48
Имя: 4l1kyt

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

Сообщение koba »

aidar_i писал(а): 14 ноя 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 секунд:
привожу сам проект
У вас нет необходимых прав для просмотра вложений в этом сообщении.
koba
Рядовой
Сообщения: 8
Зарегистрирован: 11 ноя 2023, 02:48
Имя: 4l1kyt

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

Сообщение koba »

все решилось оказалось из за дисплея тормозил
Naladchik
Капитан
Сообщения: 908
Зарегистрирован: 04 окт 2015, 19:10
Откуда: Новосибирск
Имя: Павел
Благодарил (а): 20 раз
Поблагодарили: 22 раза

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

Сообщение Naladchik »

я бы попробовал вот так
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Win10-64. FLProg Portable.
Изображение
koba
Рядовой
Сообщения: 8
Зарегистрирован: 11 ноя 2023, 02:48
Имя: 4l1kyt

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

Сообщение koba »

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

Отправлено спустя 1 минуту 38 секунд:
в самом блоке назначена другие пини для контрольной суммы
Naladchik
Капитан
Сообщения: 908
Зарегистрирован: 04 окт 2015, 19:10
Откуда: Новосибирск
Имя: Павел
Благодарил (а): 20 раз
Поблагодарили: 22 раза

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

Сообщение Naladchik »

koba писал(а): 16 ноя 2023, 08:53 из (OK) не выходит никакого сигнала
судя по тексту кода блока на его выходе ok должен сформироваться импульс при совпадении контрольных сумм, но он будет только в течении одного программного цикла, т.е. увидеть его (подав его на выход/светодиод) не получиться, слишком короткий.
Win10-64. FLProg Portable.
Изображение
koba
Рядовой
Сообщения: 8
Зарегистрирован: 11 ноя 2023, 02:48
Имя: 4l1kyt

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

Сообщение koba »

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

Отправлено спустя 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
Ответить

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

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость