Ви не увійшли.
ReadSerial виглядає по наркоманськи
Та там весь код наркоманський.
Навіщо аж три таймера з однаковим інтервалом?
В ReadSerial()
if (Buffer[0] == 0X5A & Buffer[3] == 0X83) {
if (Buffer[4] == 0X50) {
виконується навіть коли прочитано лише 1 байт, а в Buffer[3] і Buffer[4] може бути хто зна шо.
Точніше, в Buffer[3] і Buffer[4] значення ніколи і не записуються, бо як тільки прочитано один байт, Buffer_Len скидається в нуль.
І хіба дисплей відповідає такими ж командами, якими сам керується? Я в документацію не вчитувався, але це було би дуже дивно. Зазвичай керуючий пристрій видає команду на читання, потім зчитує результат.
Взагалі, якщо Serial читається побайтно, навіщо зайвий раз перевіряти available()?
Це:
if (Buffer[0] == 0X5A & Buffer[3] == 0X83)
з логічної точки зору працюватиме, але семантично мабуть малось на увазі
if (Buffer[0] == 0X5A && Buffer[3] == 0X83)
Активний
я б порадив підключити дисплей до software serial, а в Serial виводити якийсь debug. І переписати згідно з тим, як воно повинно працювати. копіпаста кусків коду то погано . складно зрозуміти що там відбувається.
Доброго дня, панове!
зробив так я ви радили. пишу код сам. Але якась херня виходить повна
посадив дисплей на softserial.
написав ось це:
if (dwinSerial.available()){
Buffer[l]=dwinSerial.read();
l++;
bufflag=true;
}
if (bufflag && Buffer[0] == 0X5A && Buffer[3] == 0X83 && Buffer[4]==0X50){
Serial.println();
Serial.print(Buffer[0], HEX);
Serial.print(Buffer[1], HEX);
Serial.print(Buffer[2], HEX);
Serial.print(Buffer[3], HEX);
Serial.print(Buffer[4], HEX);
Serial.print(Buffer[5], HEX);
Serial.print(Buffer[6], HEX);
Serial.print(Buffer[7], HEX);
Serial.print(Buffer[8], HEX);
l=0;
bufflag=!bufflag;
}
при натисканні будь якої кнопки на дисплеї отримую:
5A A 66 83 5000 0 0 0
а повинен отримати: 5A A5 06 83 50 00 01 00 01 (перша кнопка натиснута)
і скільки б я не натискав кнопки скетч чомусь не видає нічого.
Остання редакція Primaangel88 (2025-03-18 16:14:03)
Неактивний
виправив
if(bufflag && l>=20){
if (bufflag && Buffer[0] == 0X5A && Buffer[3] == 0X83 && Buffer[4]==0X50){
Serial.println();
Serial.print(Buffer[0], HEX);
Serial.print(Buffer[1], HEX);
Serial.print(Buffer[2], HEX);
Serial.print(Buffer[3], HEX);
Serial.print(Buffer[4], HEX);
Serial.print(Buffer[5], HEX);
Serial.print(Buffer[6], HEX);
Serial.print(Buffer[7], HEX);
Serial.print(Buffer[8], HEX);
}
l=0;
bufflag=!bufflag;
}
тепер читає але не кожен раз. треба задовбат кнопку натисканням і тільки разу з 10 спрацьовує
нижче те що в серіал піля 30-40 натискань:
5AA5683500104
5AA5683500107
5AA5683500107
5AA5683500103
5AA5683500106
від одного до 7 стани реле. комбінація 3 реле.
Остання редакція Primaangel88 (2025-03-18 16:26:00)
Неактивний
Але якась херня виходить повна
Так завжди виходить, коли код пишеться одразу, без чіткого розуміння що він має робити, та без попередньої розробки алгоритму (на папері з олівцем, так).
при натисканні будь якої кнопки на дисплеї отримую:
5A A 66 83 5000 0 0 0
Ну, значення Buffer[0], Buffer[3] та Buffer[4] відповідають тим, на які перевіряєте. Що не так?
а повинен отримати: 5A A5 06 83 50 00 01 00 01 (перша кнопка натиснута)
Ви впевнені, що саме таку послідовність має видавати дисплей? Це десь зазначено в описі протоколу?
if(bufflag && l>=20){ if (bufflag && Buffer[0] == 0X5A && Buffer[3] == 0X83 && Buffer[4]==0X50){ }
тепер читає але не кожен раз. треба задовбат кнопку натисканням і тільки разу з 10 спрацьовує
Так умова спрацьовує тільки коли набереться 20 байт ТА байти у певних позиціях мають певні значення.
Для початку сформулюйте словами, що конкретно має робити код? Знаходити певну послідовність байтів у вхідному потоці з послідовного порта?
Serial.print(Buffer[0], HEX); Serial.print(Buffer[1], HEX); Serial.print(Buffer[2], HEX); Serial.print(Buffer[3], HEX); Serial.print(Buffer[4], HEX); Serial.print(Buffer[5], HEX); Serial.print(Buffer[6], HEX); Serial.print(Buffer[7], HEX); Serial.print(Buffer[8], HEX);
Тут же всі символи зливатимуться, "1 23" не відрізнити від "12 3".
for (auto i : Buffer) {
Serial.print(i, HEX);
Serial.print(' ');
}
Або, з лідируючими нулями:
for (auto i : Buffer) {
char s[4];
snprintf(s, sizeof(s), "%02x ", i);
Serial.print(s);
}
Взагалі, якщо вся комунікація з дисплеєм іде по послідовному порту, а чіткого опису протоколу немає, я би для початку підʼєднав би його до компа і відлагодив комунікацію у програмі для компа, без всяких ардуін. На будь якій мові, яку знаєте, хоч C#, хоч Python, чи що інше. Потім би уже портував на ардуіну.
Остання редакція dimich (2025-03-18 17:33:34)
Активний
коли я бачу змінні buffer і flag, в мене трохи глазік смикається;)
спробуйте пояснити, що за комунікація повинна відбуватися.
Так то дисплей з контроллером спілкуються, півділа зроблено.
Ура!!! запрацювало....
коли скоротив до 9 символів масив.
алгоритм роботи такий.
поки ми не чіпаємо дисплей нічого не передається.
коли дисплей відпрацював натискання кнопки він посилає наступні данні в порт:
5A A5 06 83 50 00 01 00 01
5А А5 маска
06 довжина передачі в байтах починаючи з наступного після цього тобто (6)
83 команда читання данних з RAM памяті, я так зрозумів так дисплей каже що він наступні данні прочитав з своєї RAM
50 00 адреса в памяті
01 кількість слів що читаються(апдейт)
00 01 данні що там лежать
при підключенні до программи DWIN, кожне опрацювання дотику передається саме в такому вигляді(в HEX)
отже коли я отримую що за адресою 5000 данні
0001(->bin 0001) перша кнопка активна (інші неактивні )
0002(->bin 0010) друга
0003(->bin 0100) третя
Остання редакція Primaangel88 (2025-03-19 14:15:50)
Неактивний
перероблю код за вашими прикладами, та викладу. Дякую за допомогу.
Неактивний
коли дисплей відпрацював натискання кнопки він посилає наступні данні в порт:
5A A5 06 83 50 00 01 00 01
Цікаво. Це він сам ініціює передачу чи відповідає на команду читання?
Якщо ініціює сам, що відбудеться, коли керуючий хост відправляє якусь команду і очікує відповіді, а в цей момент на дисплеї натиснули кнопку?
5А А5 маска
Я би назвав це заголовком (frame header) або маркером.
06 довжина передачі в байтах
83 команда читання данних з RAM памяті, я так зрозумів так дисплей каже що він наступні данні прочитав з своєї RAM
50 00 адреса в памяті
Тут наче має бути ще 01 - розмір даних у 16-бітних словах.
00 01 данні що там лежать
І що, ніхто досі не написав для цього протокола людського парсера? Всі оперують масивом байтів?
Активний