Zaczynasz dobrze. Wg protokołu inicjację "/?!\r\n" wysyłasz na prędkości 300 bd (ustawienie transmisji 7E1). Nie żadnej innej - 300, bo tak mówi norma. Licznik energii ma wówczas maksymalnie 2 sekundy na odpowiedź, a odpowiedzią jest wpierw ramka identyfikatora licznika, który ma postać "/XXXZD<CR><LF>", gdzie XXX jest identyfikatorem producenta, D oznacza identyfikator licznika (maksymalnie 16 znaków) a Z oznacza identyfikator prędkości, z jaką licznik może się komunikować, aby zwiększyć prędkość transmisji z 300 bd na większą. Jeśli chodzi o zmianę transmisji danych z licznika, należy to wykonać dopiero po otrzymaniu ramki identyfikatora, ale jeśli tego nie zrobisz, licznik udostępni dane na prędkości 300 bd. Jeśli zaś chcesz zmienić transmisję, należy wysłać do licznika ramkę "<ACK>VZY<CR><LF?" (po otrzymaniu identyfikatora), gdzie V to cyfra 0 (pole V norma precyzuje jako opcję dla dalszych rozszerzeń protokołu), pole Z pełni tę samą rolę co znak w ramce identyfikatora, a Y identyfikuje rodzaj wykonywanej operacji w i „0” oznacza czytanie danych, a „1” programowanie.
Z tego wniosek, że należy wysłać "0Z0<CR><LF>" i jednocześnie zmienić prędkość transmisji w komputerze/urządzeniu czytającym. Po chwili licznik powinien transmitować dane.
Teraz trochę o prędkości transmisji, czyli polu Z. Od licznika możemy otrzymać cyfry, które kolejno oznaczają:
0: 300 bd
1: 600 bd
2: 1200 bd
3: 2400 bd
4: 4800 bd
5: 9600 bd
Jak widać to licznik decyduje o tym, na jaką prędkość trzeba się przełączyć. Ale nie ma obowiązku zmieniać transmisji. Jak już wspomniałem - jeśli nie wyślesz tej drugiej ramki, licznik i tak po krótkim czasie wyśle pełne dane na prędkości 300 bd.
Nie wiem w jaki sposób podłączasz się do licznika, ale jeśli podłączenie jest poprawne, nie ma możliwości, aby licznik nie odpowiedział. Twoje problemy mogą świadczyć o błędzie w podłączeniu lub o uszkodzeniu interfejsu licznika. Dodam, że inicjacja działa również na zwykłym Hyperterminalu, gdzie ręcznie wpisujesz znaki /?! po czym wciskasz enter i trzymając ctrl znów enter - licznik powinien odpowiedzieć.
Ja odczytuję dane z licznika za pomocą głowicy odczytowej firmy Meter-Test (najtańsza głowica dostępna jest w tej firmie). Na ich stronie jest również darmowy program, który pozwala odczytać liczniki wg IEC1107. Sam również napisałem program, który od czasu do czasu wykorzystuję i również mam zamiar zaimplementować ten protokół w AVR, ale ciągle brakuje mi czasu.
Licznik energii może udostępnić dosyć sporo bajtów danych (miałem taki, co udostępnił 4kB), więc AVR musiałby te dane gdzieś przechowywać, aby móc je później "obrobić", no chyba że potrzebujesz odczytać tylko wybrane rejestry, ale tu również będzie trzeba je odnajdywać za pomocą jakiegoś algorytmu. Licznik bowiem nie wysyła tylko stanu swojego rejestru energii, ale również wiele więcej informacji jednym ciągiem - dostajesz plik tekstowy, np taki:
/LGZ4ZMD120AMt
F.F(00020000)
0.0( )
C.1(********)
1.8.1(000000.0*kWh)
1.8.2(000005.3*kWh)
1.8.0(000005.3*kWh)
21.8.0(000000.2*kWh)
41.8.0(000001.8*kWh)
61.8.0(000003.2*kWh)
22.8.0(000000.0*kWh)
42.8.0(000000.7*kWh)
62.8.0(000000.6*kWh)
C.7.0(00000265)
C.7.1(00000033)
C.7.2(00000028)
C.7.3(00000263)
C.2.1(99-04-29 15:25)
C.8.1(00000000)
C.8.2(00118724)
C.8.0(00118724)
!
W dalszym etapie potrzebujesz zdekodować informacje, które te licznik "wypluwa". Jest to identyfikowane wg standardu EDIS opisanego w innej normie. Są to te znaki umieszczone przed nawiasami. Jeśli będziesz zainteresowany, służę pomocą.