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.