Вопрос. Отправка и прием структуры через UART
-
- Рядовой
- Сообщения: 85
- Зарегистрирован: 01 май 2022, 14:13
- Откуда: Киров
- Имя: Николай
- Поблагодарили: 4 раза
Вопрос. Отправка и прием структуры через UART
Подскажите пожалуйста, как можно отправить и принять структуру через UART ?
Задача такая, имеем 4 переменные Integer, нужно их отправить через UART с одного контроллера на другой.
Идеальный вариант с помощью структуры, но в Стандартных блоках вроде бы такой возможности нет.
Задача такая, имеем 4 переменные Integer, нужно их отправить через UART с одного контроллера на другой.
Идеальный вариант с помощью структуры, но в Стандартных блоках вроде бы такой возможности нет.
-
- Полковник
- Сообщения: 4007
- Зарегистрирован: 12 фев 2016, 11:40
- Откуда: Шатура
- Имя: Энвер
- Благодарил (а): 137 раз
- Поблагодарили: 153 раза
Вопрос. Отправка и прием структуры через UART
Блок UART есоins может отправлять группы однотипных переменных - можете разместить данные из структуры и отправить.
С уважением,Энвер.
С уважением,Энвер.
-
- Рядовой
- Сообщения: 85
- Зарегистрирован: 01 май 2022, 14:13
- Откуда: Киров
- Имя: Николай
- Поблагодарили: 4 раза
Вопрос. Отправка и прием структуры через UART
Разобрался. Оказывается во встроенных блоках Отправка и Прием переменной в UART, FlProg создает структуру.
-
- Сержант
- Сообщения: 159
- Зарегистрирован: 05 фев 2017, 12:02
- Благодарил (а): 4 раза
- Поблагодарили: 16 раз
Вопрос. Отправка и прием структуры через UART
Тоже интересует этот вариант
я так понимаю отправка с этого блока
а чем принимать ?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- Рядовой
- Сообщения: 85
- Зарегистрирован: 01 май 2022, 14:13
- Откуда: Киров
- Имя: Николай
- Поблагодарили: 4 раза
Вопрос. Отправка и прием структуры через UART
Ага, тоже не нашел чем принимать. Решил стандартными блоками попробовать, при компилировании просмотрел скетч, а там все переменные в структуру упакованы.
-
- Сержант
- Сообщения: 159
- Зарегистрирован: 05 фев 2017, 12:02
- Благодарил (а): 4 раза
- Поблагодарили: 16 раз
Вопрос. Отправка и прием структуры через UART
вопрос к автору
мне не компилируется и отправка
STM32F407VGT
я правильно тест сделал ?
мне не компилируется и отправка
STM32F407VGT
я правильно тест сделал ?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- Полковник
- Сообщения: 4007
- Зарегистрирован: 12 фев 2016, 11:40
- Откуда: Шатура
- Имя: Энвер
- Благодарил (а): 137 раз
- Поблагодарили: 153 раза
Вопрос. Отправка и прием структуры через UART
Тест написан правильно. Но возможно:
1.используется не то ядро - нужно https://github.com/stm32duino/Arduino_Core_STM32 вроде версия 2.6.0
2.выбран не тот контроллер - поддерживается DevEboxSTM32F407VE - написал по памяти, под рукой нет компьютера.
С уважением, Энвер.
1.используется не то ядро - нужно https://github.com/stm32duino/Arduino_Core_STM32 вроде версия 2.6.0
2.выбран не тот контроллер - поддерживается DevEboxSTM32F407VE - написал по памяти, под рукой нет компьютера.
С уважением, Энвер.
Вопрос. Отправка и прием структуры через UART
приветствую всех , кто может помочь , в общем ме нужна принимат данные из UART с контрольной суммои , после блока прием из UART подключаю блок UART_to_4byte
из пользовательских блоков , все конечно работает но при скоростном приема данных сигналы перескакивает (я не имею в виду скорость передача данных 9600) а само скорость интенсивности сигналов , очевидно без етого блока (UART_to_4byte ) скорост нормалная , может я что то нетак делаю напишите пожалуйста как это исправит
из пользовательских блоков , все конечно работает но при скоростном приема данных сигналы перескакивает (я не имею в виду скорость передача данных 9600) а само скорость интенсивности сигналов , очевидно без етого блока (UART_to_4byte ) скорост нормалная , может я что то нетак делаю напишите пожалуйста как это исправит
-
- Рядовой
- Сообщения: 85
- Зарегистрирован: 01 май 2022, 14:13
- Откуда: Киров
- Имя: Николай
- Поблагодарили: 4 раза
Вопрос. Отправка и прием структуры через UART
Приложите проект сюда, так быстрее помогут.
Золотое правило, чтобы получить грамотный ответ, нужно задать грамотный вопрос, а лучше приложить проект )))
Вопрос. Отправка и прием структуры через UART
вот схема
Отправлено спустя 10 минут 16 секунд:
Отправлено спустя 10 минут 16 секунд:
обработка данных в (UART_to_4byte ) проходит медленноnickass писал(а): 11 ноя 2023, 19:01 Приложите проект сюда, так быстрее помогут.
Золотое правило, чтобы получить грамотный ответ, нужно задать грамотный вопрос, а лучше приложить проект )))
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- Полковник
- Сообщения: 3360
- Зарегистрирован: 24 дек 2016, 16:55
- Откуда: Уфа
- Имя: Айдар
- Благодарил (а): 13 раз
- Поблагодарили: 100 раз
- Контактная информация:
Вопрос. Отправка и прием структуры через UART
Лучше все таки приложите вот этот кусок проекта , чтобы ответить нужно посмотреть скетч.
Вопрос. Отправка и прием структуры через UART
из UART выходит такои протоколaidar_i писал(а): 14 ноя 2023, 19:56 Лучше все таки приложите вот этот кусок проекта , чтобы ответить нужно посмотреть скетч.
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 секунд:
привожу сам проект
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- Капитан
- Сообщения: 908
- Зарегистрирован: 04 окт 2015, 19:10
- Откуда: Новосибирск
- Имя: Павел
- Благодарил (а): 20 раз
- Поблагодарили: 22 раза
Вопрос. Отправка и прием структуры через UART
я бы попробовал вот так
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Вопрос. Отправка и прием структуры через UART
спасибо но проблема в том что из (OK) не выходит никакого сигнала
Отправлено спустя 1 минуту 38 секунд:
в самом блоке назначена другие пини для контрольной суммы
-
- Капитан
- Сообщения: 908
- Зарегистрирован: 04 окт 2015, 19:10
- Откуда: Новосибирск
- Имя: Павел
- Благодарил (а): 20 раз
- Поблагодарили: 22 раза
Вопрос. Отправка и прием структуры через UART
судя по тексту кода блока на его выходе ok должен сформироваться импульс при совпадении контрольных сумм, но он будет только в течении одного программного цикла, т.е. увидеть его (подав его на выход/светодиод) не получиться, слишком короткий.
Вопрос. Отправка и прием структуры через UART
попробую поставит тт тригер
Отправлено спустя 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
Отправлено спустя 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
Кто сейчас на конференции
Сейчас этот форум просматривают: Murtaza и 1 гость