Witam. Temat który tutaj postanowiłem utworzyć dotyczy projektu który w ostatnim czasie napisałem pod Arduino Uno R3, choć z powodzeniem może mieć zastosowanie chociażby w Mega 2560 ale to mniej istotne.
Konkretniej ten projekt to jest taki interpreter komend AT, używanych do celów konfiguracji i komend IO, coś w stylu OBDII, zaczynających się od 00, 01 itd.
Tu jest kod źródłowy tego projektu
https://github.com/dariuszrorat/arduino-examples/tree/master/at-command-interpreter
I tak np. przykładowe komendy AT (wpisuje się je przez jakiś terminal pod COM)
AT I - wyświetlenie manufaktury, np. Arduino Uno
AT Z - reset ustawień
AT SM 09 O - ustawienie pinu cyfrowego 9 jako wyjście
AT MA - monitorowanie wszystkich wejść analogowych (w pętli)
AT SS - zapis ustawień do EEPROM
I przykładowe komendy I/O
00 00 - odczyt wartości na wejściu analogowym A0
10 0D - przykładowy odczyt wartości cyfrowej na pinie cyfrowym 13
31 09 03E8 03E8 - wygenerowanie tonu 1kHz przez 1 s na pinie 9 (PWM)
I byłoby wszystko GIT, gdyby nie problem którego na chwilę obecną nie potrafię rozwiązać i nie wiem gdzie jest tak naprawdę problem. Chodzi mi tu właśnie o to ostatnie czyli generowanie tonu.
Czyli tak, najpierw wpisuję sobie:
AT SM 09 O (ustawienie pinu 9 jako wyjście)
31 09 03E8 03E8 - generowanie tonu 1kHz przez 1 sek.
Ale zrobiłem coś takiego, że w przypadku tych operacji typu odczyt wejść czy wysyłanie sygnałów do wyjść zostanie przesłana jako odpowiedź ramka danych, w tym konkretnym przypadku powinno to być coś takiego:
7E 31 09 0B 20 31 30 30 30 20 31 30 30 30 C8 EA
ale dostaję:
7E 31 09 0B
Ramka to jest po prostu:
znacznik początku | sterowanie | pin | długość danych | dane | CRC16 CCITT
To jak to jest implementowane to jest tam w pliku frames.cpp na tym repo, jako część tego projektu. Na tą chwilę nie wiem dlaczego ATMega mi jakby ucina po prostu dłuższe ciągi znaków (String), wysyłane przez COM, a z krótkimi nie ma tego problemu. Co takiego powoduje problemy z poprawnym wysyłaniem dłuższych ciągów znaków w zmiennych String? Może konkatenacja stringów jest nieprawidłowa?
Tu jest implementacja ramki
https://github.com/dariuszrorat/arduino-examples/blob/master/at-command-interpreter/frames.cpp
Miał ktoś jakieś doświadczenia z tym? Dodam tylko że używam chińskiego klona z CH340 G zamiast FT 232 ale nie sądzę żeby to powodowało problem.