RS 232 - bit startu i brak bitu stopu

0

Witam,
mam problem z ustawieniami rs'a. Posiadam płytkę z akcelerometrem ADXL202 i chcę zrobić programik czytający dane z czujnika. Protokół producent podaje następujący:

"The default RS-232 parameters are 38400 baud, 8
data bits, 1 start bit, no stop bits. The RS-232
protocol consists of a single ASCII command ‘G’
which returns a 4 byte data packet. The data packet
consists of 2 bytes each of X-axis and Y-axis duty
cycle data. See Tables 1,2, and 3.

Table 1: Data Commands
ASCII Decimal/(Hex) Description
G 71/(0x47) Request data

Table 2: Packet Structure
Byte Number Value Description
1 0-255 X Axis MSB
2 0-255 X Axis LSB
3 0-255 Y Axis MSB
4 0-255 Y Axis LSB</span>"

Mam delphi 7 i testuje cport. Po otwarciu portu płytka reaguje poprawnie (błyski diody) ale nie odpowiada. W cport nie ma możliwości braku bitu stopu, nie ma wzmianki o bicie startu.
Czy do komunikacji z ADXL muszę napisać własną obsługę COM1 mającą bit startu i brak bitu stopu czy jest możliwość użycia gotowego komponentu?
Jeżeli ktoś posiada komponent który mi obsłuży ADXL będę bardzo wdzięczny lub jeśli napisanie obsługi jest banalne, proszę o źródło - prostą formatkę gdzie dane wrzucane są do memo.
Za wszelkie wskazówki z góry dziękuję.

0

polecam komponenty APRO
http://sourceforge.net/projects/tpapro/
uzywam ich w pracy i sa bardzo proste i przyjemne.
oczywsicie w paczce jest milion innych, pewnie calkiem
przydatnych komponentow ale ja z nich nie korzystam.

0

dzięki, bardzo ładny zestaw komponentów. Potestuję trochę i dam znać czy chodzi z ADXL. pzd

0

Witam,
obecnie ADXL mi odpowiada na komponencie SerialNG (mimo ża bit stopu ustawiony jest na 1). Jest jednak kłopotliwa zabawa w konwersje. Jaki jest najprostrzy sposób wysłania 1 bajtu i w odpowiedzi pobrania 4 bajtów z portu? Zależy mi na szybkich pomiarach. pzd

0

Siemanko,
nie bardzo rozumie twoje pytanie, jeśli chodzi Ci o odbiór danych to jest event
to obsługujący, a swoją drogą SerialNG jest fajny bo też z niego korzystałem ale jak masz to uruchomić przemysłowo to lepiej z niego zrezygnuj i przejdź na ComPort.

0

Odpaliłem programik czytający wartości PWM dla akceleracji. Ponieważ ADXL potrzebuje zapytania, wysyłam 'G' na timerze = 10ms i czytam odpowiedź, jest ok. Wynik wyświetlam w memo. Dodałem drugie memo z przeliczeniem na g i tu już jest problem, program zaczyna działać ale po chwili wiesza kompa tak, że tylko twardy reset działa. Wydaje mi się, że wszystko za długo trwa (może się mylę, nie wiem bo z COM'em dopiero zaczynam). Generalnie musi to być jak najmniejsze obciążenie dla PC ponieważ mam jeszcze dwa inne czujniki do 'czytania' przez COM'a. Czy zostać przy PORTCOM czy może zrobić to na WINAPI? W WINAPI wygląda to dość prosto -> uchwyt do portu przez FileCreate, odczyt ->FileRead i zapis FileWrite. Jutro wrzucę źródła na serialNG i WinApi dla zainteresowanych (bo net mam tylko w pracy a źródła w domu :) ) żeby łatwiej było prowadzić dalsze rozmowy. pzd

0

Winapi jest najprostszym rozwiązaniem, a co do wieszania aplikacji to zastosuj wątki (wieszanie całego kompa jest już nieporozumieniem). Obsługa takiego czujnika (czy nawet kilku) nie powinna systemowi nastręczać większych problemów w związku z ograniczoną szybkością RS232.

0

Podoba mi się WinApi ale jeszcze wszystkiego do końca nie wiem. Czy maskowanie jest ważne (SetCommMask)? Czy muszę ustawiać TimeOut czy jest jakoś domyślnie ustawiany? W moim kodzie wysyłam 'G', w ilości wysłanych bajtów (lBytesWritten) zwraca 1 - czyli wysyła - i zatrzymuje się na czytaniu. Oto kody Send i Read:

procedure SendCom;
var
sukcess : boolean;
lBytesWritten : LongWord ;
begin
  S := 'G';
  sukcess := WriteFile(hPort, S, 1, lBytesWritten, 0);

end;

procedure ReadCom;
var
  znak : Char;
  lBytesRead : LongWord;
begin
    ReadFile(hPort, znak, 4, lBytesRead, 0);  
end;

co trzeba zrobić żeby odczytać odpowiedź po wysłaniu zapytania?

0

SetCommMask jest przydatne, jeśli chcesz monitorować stan dodatkowych linii modemowych portu RS232 (RTS, DTR, itd.). Jeśli wykorzystujesz jedynie linie transferowe RX, TX - a tak właśnie jest zapewne u Ciebie - to nie potrzebujesz korzystać z tej funkcji (ewentualnie, jedynie aby wyłączyć monitorowanie zdarzeń).

Masz tu w kodzie błąd, jak sądzę. O ile przy wysłaniu S jest zapewne typu char, o tyle przy odczycie znak musi być albo tablicą znaków (znak: array[0..3] of char), albo ogólnie zmienną o rozmiarze 4 bajtów (na przykład dword), bo tyle odczytujesz.

Do ustawiania timeout'ów masz funkcję SetCommTimeouts.

0

dzięki, właśnie tuż po wysłaniu postu zauważyłem że jest błąd w typie zmiennej odczytywanej. Niestety zmiana na dword nie zmienia faktu że wykonywanie programu zatrzymuje się na ReadFile i dalej nie chce iść (ustawiam tam breakpoint, program przechodzi w stop, daję run a program stoi w linii ReadFile). Czy jest to związanie z TimeOut? czeka bez końca na kolejne znaki? Niestety nie rozumiem do końca tego mechanizmu więc sam sobie nie radzę :(

1 użytkowników online, w tym zalogowanych: 0, gości: 1