kategoria: ANSI C
[#1] Serial Port - inicjalizacja
Jest taki "case". Podłączam sobie Arduino do Amigi przez port szeregowy, oczywiście "po Bożemu" przez konwerter sygnałów TTL. Zasilanie ciągnę z portu Amigi i zbijam 12V na 5V za pomocą przetwornicy. Na Amidze odpalam Term'a i wszystko działa doskonale. Arduino wysyła dane na port szeregowy, Amiga je odbiera. Wyłączam Amigę, włączam ponownie i próbuję odczytać dane przesyłane przez Arduino za pomocą swojego prostego programu:

https://github.com/marekhac/AmigaSerialReadAsync

I tu zonk. Program bezproblemowo otwiera serial.device i... niczego nie jest w stanie odczytać. Jednak jeśli zamknę go i przejdę do Terma, to w jego oknie dane z Arduino są widoczne. Kiedy zamknę Terma i znowu otworzę swój program to (eureka!) dane są odczytywane przez Amigę. Jaki z tego morał ? Czy Term inicjalizuje jakoś inaczej połączenie z urządzeniem podpiętym do portu szeregowego ? Dlaczego po "odblokowaniu" portu Termem, mój program działa poprawnie? Co ciekawe, działa poprawnie nawet po resecie Amigi. Dopiero wyłączenie i włączenie komputera powoduje, że mój program znowu nie odczytuje danych z seriala.

I teraz pytanie, czy mogę jakoś programowo zresetować połączenie między Amigą a urządzeniem podpiętym do seriala ? Albo chociażby zainicjalizować je na nowo ? Chyba, że problem leży zupełnie gdzieś indziej. Jak myślicie ?
[#2] Re: Serial Port - inicjalizacja

@MarX, post #1

A gdzie w Twoim programie ustawienie parametrów transmisji dla portu SERIAL?
[#3] Re: Serial Port - inicjalizacja

@*y, post #2

A gdzie w Twoim programie ustawienie parametrów transmisji dla portu SERIAL?

Bazuję na ustawieniach w Prefs -> Serial, to wystarczy do prostych testów. Ale żeby była pewność to dodałem je również w kodzie. Niestety nic to nie zmieniło.
[#4] Re: Serial Port - inicjalizacja

@MarX, post #3

https://wiki.amigaos.net/wiki/Serial_Device

CMD_RESET Reset the serial port to its initialized state. All active and queued I/O requests will be aborted and the current buffer will be released.
[#5] Re: Serial Port - inicjalizacja

@juen, post #4

CMD_RESET Reset the serial port to its initialized state. All active and queued I/O requests will be aborted and the current buffer will be released.

Dodałem ale też to nic nie pomaga. Chyba, że tej funkcji inaczej się używa (wywołuję ją po OpenDevice())?

Ostatnia aktualizacja: 19.04.2023 11:10:40 przez MarX
[#6] Re: Serial Port - inicjalizacja

@MarX, post #1

Z tego co wyczytałem link to powinny być ustawione flagi przed otwarciem serial. Jakie to flagi to musisz to wiedzieć lista jest tu link
Niestety moja wiedza jest bardzo ograniczona w tym temacie, ale ja bym zaczął od tego właśnie.
[#7] Re: Serial Port - inicjalizacja

@MarX, post #1

W tym podanym programie z GitHuba widzę jeden dosyć poważny błąd.

Przy odczycie za pomocą CMD_READ trzeba określić rozmiar bufora. A tam jest wpisane -1.

Należy to poprawić na: SerialIO->IOSer.io_Length = READ_BUFFER_SIZE.

Prawdopodobnie też trzeba załadować pola struktury SerialIO przed kolejnym wywołaniem SendIO().
[#8] Re: Serial Port - inicjalizacja

@Hexmage960, post #7

@Hexmage960
Przy odczycie za pomocą CMD_READ trzeba określić rozmiar bufora. A tam jest wpisane -1.

Dzięki Hex, już to poprawiłem.

Prawdopodobnie też trzeba załadować pola struktury SerialIO przed kolejnym wywołaniem SendIO().

Spróbowałem, nie przynosi to żadnych efektów.

@asman
Z tego co wyczytałem to powinny być ustawione flagi przed otwarciem serial. Jakie to flagi to musisz to wiedzieć lista jest tu

Ustawiłem te flagi przed wywołaniem OpenDevice(). Bez rezultatu. Oczywiście wypełniam flagi bez wywołania DoIO(), bo wtedy dostaję błąd Illegal instruction
[#9] Re: Serial Port - inicjalizacja

@MarX, post #8

Spróbuj najpierw coś wysłać z Amigi do Arduino a potem zacznij czytać z portu. Jeśli to zadziała, mam hipotezę dlaczego.
1
[#10] Re: Serial Port - inicjalizacja

@*y, post #9

Spróbuj najpierw coś wysłać z Amigi do Arduino a potem zacznij czytać z portu. Jeśli to zadziała, mam hipotezę dlaczego.

Ale masz nosa! To było to. Wysłałem krótki string do Arduino, potem zacząłem nasłuchiwać i wszystko działa idealnie! Dzięki wielkie za pomoc, chylę czoła. Napisz tylko, czemu tak się dzieje ?

Tutaj poprawiona wersja na GitHub

Aha i jeszcze jedno. Musiałem zmienić io_Length z powrotem na -1 dla CMD_READ. Doczytałem w "Amiga Programmers Handbook Vol. II", że to całkowicie poprawne jeśli transferuje się dane zakończone EOF. Arduino tak mi właśnie wysyła.

"(...) A value of -1 can be used to indicate variable-length data transfers terminated by some EOF (end of file) condition. EOF characters, where appropriate, are defined separately for each device. Not all devices require this value."

Ostatnia aktualizacja: 19.04.2023 18:39:38 przez MarX
[#11] Re: Serial Port - inicjalizacja

@MarX, post #10

Aha i jeszcze jedno. Musiałem zmienić io_Length z powrotem na -1 dla CMD_READ. Doczytałem w "Amiga Programmers Handbook Vol. II", że to całkowicie poprawne jeśli transferuje się dane zakończone EOF. Arduino tak mi właśnie wysyła.

Ale skąd serial.device wie ile zaalokowałeś przestrzeni na bufor?

Masz starszą dokumentację. W AutoDocs wyjaśniono, że jeżeli chcesz dane zakończone NULL, należy użyć io_TermArray.

Proszę, oto cytat:

Old documentation mentioned a mode where io_Length was set to -1.
If you want a NULL terminated read, use the io_TermArray instead.
[#12] Re: Serial Port - inicjalizacja

@MarX, post #10

1. Wszystkie programy terminalowe działają w trybie zapisu i odczytu "z kanału", służą przecież do dwustronnej komunikacji. Mogą więc oczekiwać na odpowiedź z drugiej strony.

2. Niektóre algorytmy obsługi portu szeregowego potrafią automatycznie wykryć prędkość transmisji. Tak może być w wypadku sterownika portu szeregowego w Arduino. Żeby jednak tę prędkość wykryć transmisja do danego urządzenia musi mieć miejsce.
1
[#13] Re: Serial Port - inicjalizacja

@*y, post #12

@*y OK

@Hex: rzeczywiście jest tak jak piszesz. Znalazłem w Amiga ROM Kernal Reference Manual Devices opis tych "terminatorów". Zaraz spróbuję to ogarnąć. Dzięki!
[#14] Re: Serial Port - inicjalizacja

@MarX, post #13

Ogarnąłem i działa jak należy. Arduino wysyła na końcu każdego stringa znak 0x00. Znak ten wrzuciłem do tablicy "terminatorów", a tablicę podpiąłem pod io_TermArray. Rzeczywiście dopiero teraz Amiga wie dokładnie ile bajtów odczytała z seriala i na jakim znaku ma się zatrzymać. Dzięki Hexmage960 jeszcze raz! Tutaj poprawiony kod programu.
2
[#15] Re: Serial Port - inicjalizacja

@MarX, post #14

Ja korzystam zawsze po prostu z tej dokumentacji Elowar
A czasami nawet z tej Aros Docs (tutaj interesuje raczej tylko mnie RTG)
1
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem