Kontynuuję temat, który już kiedyś tutaj poruszałem. Jak wspominałem, potrzebuję rozwiązania, które umożliwiłoby mi przesyłanie przez magistralę CAN danych o rozmiarze większym, niż pozwala na to pojedyncza ramka (8 bajtów). Chciałbym skomunikować urządzenia przy pomocy komend AT, przesyłać teksty do wyświetlenia na zdalnym LCD itp.
Proste zapisywanie komend w jakimś buforze odbiorczym nie wchodzi w grę, bo jak wiadomo magistrala CAN jest magistralą multimaster. Istnieje więc możliwość, że w trakcie odbierania wiadomości od jednego urządzenia, wtrąci się jakieś inne i poszczególne ramki przemieszają się w jednym buforze odbiorczym. Stosowanie osobnego bufora dla każdego z odbiorców nie wchodzi w grę w małych MCU, a więc widzę tutaj jedynie dwa rozwiązania:
- Jakieś sprytne wydzielanie z bufora tylko tego, czego nam potrzeba, już po stwierdzeniu odebrania końca wiadomości. Ramki składające się na przychodzące wiadomości od niepasujących nadawców trzeba by wtedy przepisywać do innych komórek, robiąc coś w rodzaju "defragmentacji", uważając jednocześnie, by nic nie zostało nadpisane w momencie jednoczesnego przyjścia przerwania RX.
- Upewnienie się, że nic nie zacznie nadawać kolejnej wiadomości, zanim nie skończymy odbierać obecnej. Innymi słowy urządzenie wysyła prośbę o nawiązanie połączenia. Jeśli mamy wolną linię (i pusty bufor) wysyłamy mu ACK. Od tego momentu do otrzymania końca wiadomości (albo timeoutu) w buforze zapisywane są tylko ramki z tego adresu. Zapytania od innych chętnych do nawiązania transmisji skutkują prośbą o chwilowe wstrzymanie się.
Nie chciałbym wyważać otwartych drzwi, jeśli istnieje już jakieś rozwiązanie. Ktoś kiedyś polecał standard ISO-TP. Znalazłem dzisiaj coś takiego:
"The current version supports only single frame ISO-TP messages. This is fine for OBD-II diagnostic messages, for example, but this library needs some additional work before it can support sending larger messages."
Ktoś może mi powiedzieć o co chodzi? To chyba jakaś pomyłka? Po co tworzyć taką bibliotekę, skoro koniec końców nie potrafiłaby ona przesłać więcej danych, niż potrafi obsłużyć sprzętowo sam kontroler CAN? Jeśli jednak przy pomocy tej biblioteki mógłbym wysyłać i odbierać większe porcje danych, to czy istnieje szansa, że odpalę ją na jednym z większych ośmiobitowych AVR-ów (Mega644, Mega128, AT90CAN128)?