Witam,
Jestem nowy na tym forum. Chciałem się doradzić, w jaki sposób rozgryźć problem wysyłania poszczególnych linijek z pliku txt zawierających po 4 sygnały. Każda linia miałaby mieć obliczaną sumę kontrolną i w chwili jakiejś niezgodności linijek wysłanych z C# i odebranych na arduino miałoby nastąpić ponowne wysłanie tej linii.
Macie pomysł na wygląd takiego protokołu do wysłania? Może jakieś pomocne linki? Na arduino pliki będą zapisywane na karcie SD.
Pierwsze co to powinieneś sobie zaprojektować strukturę ramki danych.
Przykładowa struktura (możesz sobie poszukać jak wyglądają struktury dla TCP i innych):
Całkowita długość ramki(1bajt)
Numer ramki(dwa bajty)
Rodzaj sygnału(1bajt) - jak ten sam sygnał to to jest zbędne
Wartość sygnału
Checksum(2bajty)
Przy projektowaniu struktury tej ramki warto też pomyśleć o dalszym rozwijaniu aplikacji, bo potem jak dodasz jakąś nową funkcjonalność to możesz mieć do przerobienia i kod klienta i serwera, a jak pomyślisz za wczasu to wystarczyć będzie dodawać obsługę nowych wartości z ramki
Dalej
No więc odczytujesz te linijki z pliku, generujesz ramkę i wysyłasz na arduino i wstrzymujesz działanie (nasłuchujesz pakietów - Read()). Na arduino odbierasz ramkę sprawdzasz sumę kontrolną i jeżeli dane się zgadzają to zapisujesz je na karcie i wysyłasz potwierdzenie w formie ramki danych, którą też projektujesz i np. masz w niej 2 wartości 0x00 i 0x01 co oznacza że suma się zgadzała lub też nie. Jeżeli suma się nie zgadzała to danych nie zapisujesz i po prostu dalej nasłuchujesz pakietów. Teraz na aplikacji w Cheszu zostaje odebrane Twoje potwierdzenie z arduino i sprawdzana jest wartość czy wszystko było ok czy nie, jeżeli ok to leci dalej, a jeżeli nie to wysyła znowu tą samą ramkę danych.
Tak bym to widział.
Ja bym jeszcze dodał jakieś znaki początku i końca ramki. W niektórych urządzeniach jest np ">" i "\r"
Checksum może być 1 bajt jeśli będzie to coś w rodzaju modulo(255) z sumy bajtów.
Jeśli ramki nie są duże to szedłbym w kierunku wysyłania w postaci Printable ASCII, łatwiej to podsłuchać w testach jakimś terminalem. Czyli zamiast bajtu o wartości np 10 wysyłasz string "0A".