Wysyłanie plików z aplikacji C# do arduino z sumą kontrolną przez serial port (bluetooth)

0

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.

0

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ł.

0

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".

1 użytkowników online, w tym zalogowanych: 0, gości: 1