Очень хочется разобраться, но туплю по-страшному. Именно в программировании на Си (Ардуино IDE). Ещё два месяца тому назад я понятия не имел с данным синтаксисом. В наличии китайская Ардуино UNO (на CH340G). Кое-что ужЕ понимаю. На Спекке очень давно писал на Басике и Ассме, но без фанатизма. Сейчас есть цель написать поддержку автономного программатора для отечественного микроконтроллера 1986ВЕ91Т на базе Ардуино. Связь через UART (Rx-Tx с преобразователем UART TTL <-> RS-422), чтение с SD. Железо всё ужЕ разработал и собрал - всё работает. Фото будет чуть позже. Нужен человек (люди), способный спокойно подсказать по алгоритму и синтаксису.
Сейчас дошло время до процедуры начальной синхронизации с МК. Там по даташиту и исходникам для ПЦ (тоже на Си++ ) всё довольно "протсто":
1. Цикле заслали в порт 512 байт с кодом 0х00 (512 нулей). На ПЦ это делается дважды.
2. МК должен ответить тремя (3) байтами - 0d, 0a, 3e - это успешная синхронизация. На ПЦ просто проверяют, что пришло 3 байта и НЕ парсят их.
3. Если ответил иное - ошибка.
На ПЦ это выглядит так:
Код:
txdbuf[0] = 0x0;
for(i=0;i<512;i++)
com.WriteBlock(txdbuf,1);
if (!com.ReadBlock(rxdbuf,3))
{
for(i=0;i<512;i++)
com.WriteBlock(txdbuf,1);
if (!com.ReadBlock(rxdbuf,3))
{
str = "ошибка синхронизации!";
InsertStrToList();
com.Close();
return;
}
}
m_list.DeleteString(m_list.GetCount()-1);
str = "Синхронизация...ОК!";
Я родил вот это, но оно всегда пишет (у меня вывод на LCD 16X2) "Succes!".
Код:
void SYNC_1986(){ //функция синхронизации с 1986ВЕ91
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Try to Sync...");
lcd.setCursor(5,1); //подготовим позицию для печати результата ("Failed!" / "Succes!")
while(Serial.available()) Serial.read(); //вот это работает - очищает буфер UART'перед работой!!!
for (int i=0; i < 512; i++){
Serial.write(0); //выдали в порт 512 байт 0х00
}
if (!Serial.available() == 3){ //приняли 3 байта от контроллера?
lcd.print("Failed!"); }
else {
lcd.print("Succes!");
}
}
Добавил фото программатора (внутри Ардуино УНО с обвесом).