Страница 1 из 1

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

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

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

Добавлено: 07 ноя 2023, 19:06
ecoins
Блок UART есоins может отправлять группы однотипных переменных - можете разместить данные из структуры и отправить.
С уважением,Энвер.

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

Добавлено: 07 ноя 2023, 21:42
nickass
Энвер, спасибо.

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

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

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

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

а чем принимать ?

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

Добавлено: 08 ноя 2023, 17:40
nickass
skrickis писал(а): 08 ноя 2023, 17:03 а чем принимать ?
Ага, тоже не нашел чем принимать. Решил стандартными блоками попробовать, при компилировании просмотрел скетч, а там все переменные в структуру упакованы.

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

Добавлено: 08 ноя 2023, 18:14
skrickis
вопрос к автору
мне не компилируется и отправка
STM32F407VGT
я правильно тест сделал ?

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

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

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

Добавлено: 08 ноя 2023, 22:59
skrickis
ecoins писал(а): 08 ноя 2023, 21:16 выбран не тот контроллер - поддерживается DevEboxSTM32F407VE
попробую :smile9:

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

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

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

Добавлено: 11 ноя 2023, 19:01
nickass
koba писал(а): 11 ноя 2023, 17:24 кто может помочь
Приложите проект сюда, так быстрее помогут.
Золотое правило, чтобы получить грамотный ответ, нужно задать грамотный вопрос, а лучше приложить проект )))

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

Добавлено: 11 ноя 2023, 19:26
koba
вот схема

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

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

Добавлено: 13 ноя 2023, 23:30
koba
я извеняюс прошу прошение

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

Добавлено: 14 ноя 2023, 19:56
aidar_i
koba писал(а): 11 ноя 2023, 19:26 кто может помочь
Лучше все таки приложите вот этот кусок проекта , чтобы ответить нужно посмотреть скетч.

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

Добавлено: 16 ноя 2023, 04:51
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 секунд:
привожу сам проект

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

Добавлено: 16 ноя 2023, 08:08
koba
все решилось оказалось из за дисплея тормозил

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

Добавлено: 16 ноя 2023, 08:40
Naladchik
я бы попробовал вот так

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

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

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

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

Добавлено: 16 ноя 2023, 09:04
Naladchik
koba писал(а): 16 ноя 2023, 08:53 из (OK) не выходит никакого сигнала
судя по тексту кода блока на его выходе ok должен сформироваться импульс при совпадении контрольных сумм, но он будет только в течении одного программного цикла, т.е. увидеть его (подав его на выход/светодиод) не получиться, слишком короткий.

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

Добавлено: 16 ноя 2023, 09:20
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