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 секунд:
привожу сам проект