| Author |
Message
|
zabtom Poziom 6

Joined: 08 Jul 2004 Posts: 19
|
#1
09 May 2006 09:10 sterowanie przez rs232 |
|
|
|
Witam
Potrzebuje schemat układu który by sterował i odbierał dane przesyłając je na port rs232. Liń wej/wyj max po 8 . Czy ktoś ma jakieś pomysły jak to zrobić? Musze stworzyć urządzonko ktore by wysyłało na port com ciąg z 8bitami danych oraz oraz odbierało z portu 8bit danych (i sterowało 8 urządzeń). czekam na pomysły. PILNE!!!
mój mail: zabtom(malpa)poczta.fm
Z góry dzięki
Pozdrawiam
|
|
| Back to top |
|
 |
marek_Łódź Poziom 23

Joined: 23 Dec 2004 Posts: 3131 Location: Łódź
|
|
| Back to top |
|
 |
zabtom Poziom 6

Joined: 08 Jul 2004 Posts: 19
|
#3
09 May 2006 11:07 sterowanie przez rs232 |
|
|
|
Ok. A masz jakieś schematy żeby to zrobić???
Czy któś pomógłby mi w napisaniu takiego programu ?
|
|
| Back to top |
|
 |
marek_Łódź Poziom 23

Joined: 23 Dec 2004 Posts: 3131 Location: Łódź
|
#4
10 May 2006 10:29 Re: sterowanie przez rs232 |
|
|
|
W pierwszym podejściu może to wyglądać tak, jek w załącznikach. Kondensatory na zasilaniu po 100uF - tantalowe, zasilanie 5V lub po wlutowaniu stabilizatora 7805 9-24V. Można też zastosować wersję drivera RS232 nie wymagającą zewnętrznych pojemności, co zredukowałoby układ do trzech elementów. Dla zwiększenia stabilności zegara procesora można dodatkowo zastosować kwarc (większa pewność transmisji). Do tego mały program w BASCOMie i drugi na PC (w C, Delphi, VB itp). Wejścia/wyjscia można zbuforować np przy pomocy ULN2803. W załączniku pliki Eagle (schematy poprawione). Złącza:
X1 - RS232,
X2-zasilanie 5V,
X3,X4 wejścia/wyjścia.
X5 - RESET
X6 - zasilanie 9-24V
Podobny temat:
http://www.elektroda.pl/rtvforum/viewtopic.php?p=1470160#1470160
| Filesize: |
51.72 KB |

|
|
|
| Back to top |
|
 |
Google

|
#
10 May 2006 10:29 |
|
|
|
|
|
| Back to top |
|
 |
Jaca Poziom 20

Joined: 21 Jun 2002 Posts: 831 Location: Ostróda
|
#5
10 May 2006 11:21 Re: sterowanie przez rs232 |
|
|
|
Oj chyba trochę zwarć się wkradło w schemat powyżej :) VCC-GND AVCC-AGND. Tak ma być ?
Pozdrawiam...
|
|
| Back to top |
|
 |
marek_Łódź Poziom 23

Joined: 23 Dec 2004 Posts: 3131 Location: Łódź
|
#6
10 May 2006 11:39 Re: sterowanie przez rs232 |
|
|
|
Dzięki za czujność. Już poprawiam.
Pozdrawiam
|
|
| Back to top |
|
 |
zabtom Poziom 6

Joined: 08 Jul 2004 Posts: 19
|
#7
10 May 2006 13:29 sterowanie przez rs232 |
|
|
|
czyli to powinno byc tak: vcc ia vcc zasilanie a gnd i agnd masa??
|
|
| Back to top |
|
 |
marek_Łódź Poziom 23

Joined: 23 Dec 2004 Posts: 3131 Location: Łódź
|
#8
10 May 2006 15:15 Re: sterowanie przez rs232 |
|
|
|
Podmieniłem załączniki na poprawione (poprawne?) przy okazji dołożyłem złącze RESET, co moze być również użyteczne przy programowaniu (ISP). Dołożyłem też stabilizator, pozwalający zasilić całość z 9-24V. Płytkę przerobiłem na jednowarstwową (drobne modyfikacje na pinach we/wy). Przepraszam za zamieszanie, na szczęście koledzy są czujni.
|
|
| Back to top |
|
 |
zabtom Poziom 6

Joined: 08 Jul 2004 Posts: 19
|
#9
10 May 2006 16:44 Re: sterowanie przez rs232 |
|
|
|
Ok. A co z programem??
|
|
| Back to top |
|
 |
Google

|
#
10 May 2006 16:44 |
|
|
|
|
|
| Back to top |
|
 |
marek_Łódź Poziom 23

Joined: 23 Dec 2004 Posts: 3131 Location: Łódź
|
#10
10 May 2006 22:24 Re: sterowanie przez rs232 |
|
|
|
Z jakim? Bo potrzebujesz dwa. Jeden w sterowniku, drugi w pececie. Ten pierwszy można naskrobać w BASCOMie w 15 minut, ale ten drugi musi obsługiwać Twój algorytm sterowania. W czym go chcesz napisać i co ma robić?
|
|
| Back to top |
|
 |
zabtom Poziom 6

Joined: 08 Jul 2004 Posts: 19
|
#11
11 May 2006 08:13 sterowanie przez rs232 |
|
|
|
Na pc bede pisał w delphi , natomiast z bacomem sobie nie poradzę bo nigdy nie pisałem
|
|
| Back to top |
|
 |
marek_Łódź Poziom 23

Joined: 23 Dec 2004 Posts: 3131 Location: Łódź
|
#12
11 May 2006 15:01 Re: sterowanie przez rs232 |
|
|
|
Mam pewne obiekcje, bo z tym językiem się specjalnie nie lubimy, poza tym symulator to nie to samo, co płytka, ale pewnie to będzie jakoś tak. Wersja najprostsza z możliwych - pobranie znaku z RS, wysłanie na port, pobranie danych z portu i wysłanie przez RS. Całość synchronizowana znakami wysyłanymi z peceta. Oczywiście przy braku pełnych portów 8-bitowych, transfer jest trochę koślawy (pomiędzy wysłaniem bitów na kolejne kawałki złącza we/wy są odstępy czasowe). Można temu zaradzić stosując np ATMega16.
W wersji "profesjonalnej" trzeba by dodać jakąś kontrolę poprawności danych na RS ("suma kontrolna").
| Code: |
'***********************************
'* ATMega8 *
'***********************************
' fusebits : 10 0100
'***********************************
$regfile = "m8def.dat"
$crystal = 8000000 '8 MHz na wewnętrznym oscylatorze
$baud = 9600
Config Portc = Input 'Konfiguracja kierunku na portach złącze X3
Config Pind.2 = Input
Config Pind.3 = Input
Config Portb = Output 'Konfiguracja kierunku na portach złącze X4
Config Pind.4 = Output
Config Pind.5 = Output
Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8
Dim B As Byte
Do
'*** Output ***
Inputbin B 'RS232 Read byte
Portb = B 'Bits 0..5
If B.7 <> 0 Then Set Portd.5 Else Reset Portd.5 '7..6
If B.6 <> 0 Then Set Portd.4 Else Reset Portd.4
'*** Input ***
B = Portc 'Bits 0..5
If Portd.3 <> 0 Then Set B.7 Else Reset B.7 '7..6
If Portd.2 <> 0 Then Set B.6 Else Reset B.6
Printbin B 'RS232 Send byte
Loop
|
Przy ustawianiu fusebitów uważać na standard (logika ujemna), bo programy ISP są w tym miejscu mało czytelne, a po np uwolnieniu portu na linii RESET nie będzie dostępu do szeregowego programowania ISP.
Do pierwszych testów proponuję HyperTerminal
Powodzenia.
|
|
| Back to top |
|
 |
Google

|
#
11 May 2006 15:01 |
|
|
|
|
|
| Back to top |
|
 |
KanGu Poziom 11

Joined: 07 May 2005 Posts: 76 Location: Suwałki / Gdynia
|
#13
12 May 2006 08:10 Re: sterowanie przez rs232 |
|
|
|
Moze tu ktoś będzie w stanie mi pomóc.
Wysyałem dwie temperatury z mikrokontrolera
| Code: |
Print Temp1
Print Temp2
'obie moga byc typu Integer albo String
|
W hyperterminalu nie mam problemu widze je jedna pod drugą, jednak kiedy odbieram je w delphi wyswietlaja mi sie niezrozumiałe znaczki. Czy ktos wie jak wygląda komunikacja między mikrokontrolerem a delphi tzn jesli wysyłam typ String i odpieram w delphi jako Pchar to nie robi róznicy? Bo jak wysyłan znak z delphi jako Pansiichar to mikrokontroler mi go normalnie wyświetla.
| Code: |
var
query : PChar = 'CDAT?'+#13+#10; // przykładowe zapytanie
// zakończone parą znaków CR LF
Buffer_O : ARRAY[0..cbOutQueue] of Char; // bufor wyjściowy
Buffer_I : ARRAY[0..cbInQueue] of Char; // bufor wejściowy
//----------------------------------------------------------------------------------
function TForm1.Read_Comm(hCommDev: THANDLE;
Buf_Size: DWORD): Integer;
var
nNumberOfBytesToRead: DWORD;
begin
ClearCommError(hCommDev, Errors, @Stat);
if (Stat.cbInQue > 0) then
begin
if (Stat.cbInQue > Buf_Size) then
nNumberOfBytesToRead := Buf_Size
else
nNumberOfBytesToRead := Stat.cbInQue;
ReadFile(hCommDev, Buffer_I, nNumberOfBytesToRead,
Number_Bytes_Read, NIL);
Read_Comm := 1;
end
else
begin
Number_Bytes_Read := 0;
Read_Comm := 0;
end;
end;
//----------------------------- urzywam timera do właczenia tej procedury
StrCopy(Buffer_O, query);
//----------------------------- nastepnie wyswietlam wartosc z bufora odbiorczego
FlushFileBuffers(hCommDev);
Until (Write_Comm(hCommDev, StrLen(Buffer_O)) <> 0);
if (Read_Comm(hCommDev, SizeOf(Buffer_I)) > 0) then // odbiór
// danych
RichEdit1.Text := Buffer_I
else
RichEdit1.Text := 'Brak danych';
|
|
|
| Back to top |
|
 |
GrEG0 Poziom 11

Joined: 19 Sep 2004 Posts: 65
|
#14
12 May 2006 09:04 Re: sterowanie przez rs232 |
|
|
|
Masz w Delphi ustawiona te sama predkosc transmisji co w kontrolerze ?
Jezeli tak to zmien np.
Buffer_O : ARRAY[0..cbOutQueue] of Char; // bufor wyjściowy
Buffer_I : ARRAY[0..cbInQueue] of Char; // bufor wejściowy
na
Buffer_O : ARRAY[0..cbOutQueue] of byte; // bufor wyjściowy
Buffer_I : ARRAY[0..cbInQueue] of byte; // bufor wejściowy
i powinno byc mniej klopotow, chyba ze musisz odbierac znak jako char ale wg mnie to i tak nie ma roznicy bo bajt (kod zanku) mozna na char w Delphi latwo zamienic.
|
|
| Back to top |
|
 |
KanGu Poziom 11

Joined: 07 May 2005 Posts: 76 Location: Suwałki / Gdynia
|
#15
12 May 2006 09:36 Re: sterowanie przez rs232 |
|
|
|
Po zmianie takiej jak mowiłeś przy kompilacji pojawia się mi błąd
| Code: |
Incompatible types 'Array' and 'PAnsiChar'
|
Co do transmisji jestem pewien że jest dobrze ustawiona bo jak wysyłam jakis znak
| Code: |
c := '1';
StrCopy(Buffer_O, c);
c := Buffer_O;
Write_Comm(hCommDev, StrLen(Buffer_O));
FlushFileBuffers(hCommDev);
|
to jestem go w stanie normalnie odebrac w mikrokontrolerze i wyświetlic na LCD
:cry: POMOCY
|
|
| Back to top |
|
 |
kochzg Poziom 14

Joined: 26 Mar 2004 Posts: 157
|
#16
12 May 2006 09:57 Re: sterowanie przez rs232 |
|
|
|
A czy nie interesuje cie sterowanie poprzez LPT z protokołem EPP (dwukierunkowo i do tego 256 układów mozna sterować)???
Bowiem mam takie rozwiązanie.
Zdrówko
Kochzg
|
|
| Back to top |
|
 |
KanGu Poziom 11

Joined: 07 May 2005 Posts: 76 Location: Suwałki / Gdynia
|
#17
12 May 2006 10:53 Re: sterowanie przez rs232 |
|
|
|
Wolałbym rs232 i nie chodzi mi o gotowca ja chce to zrozumieć w sumie teoretycznie to powinno działać, jednak nie rozumiem tych zapytań czy w kodzie który mam po wysłaniu zapytania CDAT? +#13+#10 komputer ma otrzymać wiadomość i ja wyświetlić przy pomocy bufora (nie wiem czy powinien wyświetlić wszystko co przychodzi czy tylko linijkę która przyszła po zapytaniu) czy też chodzi o coś innego bo jak ja mam 2 temperatury to jak je wysłać z mikrokontrolera żeby komputer odczytał je jako oddzielne i do tego widział która pochodzi z którego termometru i np. jeszcze otrzymał status 2 wejść mikrokontrolera.
|
|
| Back to top |
|
 |
Jaca Poziom 20

Joined: 21 Jun 2002 Posts: 831 Location: Ostróda
|
#18
12 May 2006 11:26 Re: sterowanie przez rs232 |
|
|
|
Jeśli masz program w uC napisany przez Ciebie to nie rozumiem w czym problem. To Ty ustalasz protokół transmisji i to Ty wybierasz sobie format zapytań i odpowiedzi. Przykładowo:
uC - urządzenie podrzędne
PC - urządzenie nadrzędne
1. Wysyłasz zapytanie z PC do uC w formacie np: T1 lub T2 lub P
2. uC odbiera to za pomocą pętli interpretującej, wyglądającej np tak:
| Code: |
'[...]
Dim Command As String * 1
Dim Temp1 As Word
Dim Temp2 As Word
Dim Status As Byte
Dim Numer As Byte
'[...]
Do
If Ischarwaiting() = 1 Then
Command = Inkey()
Select Case Command
Case "T":
Inputbin Numer
Select Case Numer
Case 1:
Printbin Temp1 'temperatura #1
Case 2:
Printbin Temp2 'temperatura #2
End Select
Case "P":
Printbin Status 'bajt stanu portu
End Select
End If
Loop |
i wysyła daną odpowiednią do zadanego zapytania (bez znaczników końca linii).
3. PC oczekuje na dane i odbiera je. W zależności od wysłanego zapytania oczekuje na ciąg 2 bajtów (przy zapytaniu T1 lub T2) lub 1 bajtu (przy zapytaniu P). Nie zapomnij użyć Timeout'u w uC i PC.
ps. Radziłbym skorzystać z komponentu ComPort do komunikacji po RS232 ponieważ jest bardzo prosty do oprogramowania.
Pozdrawiam...
|
|
| Back to top |
|
 |
KanGu Poziom 11

Joined: 07 May 2005 Posts: 76 Location: Suwałki / Gdynia
|
#19
12 May 2006 22:53 Re: sterowanie przez rs232 |
|
|
|
| Code: |
$crystal = 8000000
$baud = 9600
Config Lcd = 40 * 2
Config Serialin = Buffered , Size = 20
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
Enable Interrupts
Dim Command As String * 1
Dim Temp1 As Integer
Dim Temp2 As Integer
Dim Status As Byte
Dim Numer As Byte
Temp1 = 12.1
Temp1 = 30.1
Status = 1
Do
If Ischarwaiting() = 1 Then
Command = Inkey()
Select Case Command
Case "T":
Inputbin Numer
Select Case Numer
Case 1:
Printbin Temp1 'temperatura #1
Case 2:
Printbin Temp2 'temperatura #2
End Select
Case "P":
Printbin Status 'bajt stanu portu
End Select
End If
Waitms 500
Loop
|
napisałem taki kod w bascomie
a następnie taki w Delphi
PS co oznacza case 1: (mam na myśli czy BASCOM odczytuje to jako ciąg T1 czy tez jakoś inaczej)
| Code: |
query : pchar = 'P'; // +#13+#10; przykładowe zapytanie
// zakończone parą znaków CR LF
Buffer_O : ARRAY[0..cbOutQueue] of char; // bufor wyjściowy
Buffer_I : ARRAY[0..cbInQueue] of char; // bufor wejściowy
Number_Bytes_Read : DWORD;
hCommDev : THANDLE;
lpFileName : PChar;
fdwEvtMask : DWORD;
Stat : TCOMSTAT;
Errors : DWORD;
dcb : TDCB;
// dalej
function TForm1.Read_Comm(hCommDev: THANDLE;
Buf_Size: DWORD): Integer;
var
nNumberOfBytesToRead: DWORD;
begin
ClearCommError(hCommDev, Errors, @Stat);
if (Stat.cbInQue > 0) then
begin
if (Stat.cbInQue > Buf_Size) then
nNumberOfBytesToRead := Buf_Size
else
nNumberOfBytesToRead := Stat.cbInQue;
ReadFile(hCommDev, Buffer_I, nNumberOfBytesToRead,
Number_Bytes_Read, NIL);
Read_Comm := 1;
end
else
begin
Number_Bytes_Read := 0;
Read_Comm := 0;
end;
end;
procedure TForm1.rpClick(Sender: TObject);
begin
if (hCommDev > 0) then
begin
StrCopy(Buffer_O, query);
Timer1.Enabled := TRUE;
end
else
Application.MessageBox('Niewłaściwa nazwa portu lub jest on'+
' aktywny ', 'Uwaga !',MB_OK);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Repeat
// wysłanie zapytania
FlushFileBuffers(hCommDev);
Until (Write_Comm(hCommDev, StrLen(Buffer_O)) <> 0);
if (Read_Comm(hCommDev, SizeOf(Buffer_I)) > 0) then // odbiór
// danych
RichEdit1.Text := Buffer_I
else
RichEdit1.Text := 'Brak danych';
end;
// koniec
|
jesli uruchomie hyperterminal to po wpisaniu literki "P" pojawia mi sie usmiechnieta mordka :| a w delphi pionowa kreska czyli komunikacja jest ale czemu nie widzi poprawnie tego znaku przecież chyba oba programy maja dobrze ustawiony typ danych (ANSII)
Interesuje mnie tez kwestia jak odczytac ten ciag tzn jak ułozyć funkcje w delphi żeby każdą cześć oddzielnie wyświetlało mi na elementach typu RichEdit.
|
|
| Back to top |
|
 |
Jaca Poziom 20

Joined: 21 Jun 2002 Posts: 831 Location: Ostróda
|
#20
13 May 2006 09:35 Re: sterowanie przez rs232 |
|
|
|
Zauważ, że w pętli interpretacyjnej wykonywane są czynności:
1. Sprawdzenie czy w buforze odbiorczym istnieje bajt do odebrania (nasza komenda T lub P)
2. Jeśli komendą jest T to program czeka na numer temperatury. Po odebraniu numeru (1 lub 2) wysyła do PC odpowiednią temperaturę
3. Jeśli komendą jest P to program wysyła status portu.
...dlaczego do zmiennych typu integer ładujesz wartości typu single (Temp1=12.1) ? Jeśli masz temperaturę z 1 miejscem po przecinku to pomnóż ją przez 10 i jako taką wyślij do PC a po odebraniu podziel przez 10 i wyświetl na PC. Pamiętaj także, że zmienna typu integer zawiera 2 bajty, nie jeden !
Przykład komunikacji za pomocą komponentu ComPort:
| Code: |
procedure TForm1.Button1Click(Sender: TObject);
var
Bufor: string;
begin
with ComPort1 do
begin
ClearBuffer(True,True); //czyszczenie buforów io
WriteStr('T'); //komenda T - odczyt temperatury
WriteStr(Chr(1)); //numer temperatury
ReadStr(Bufor,2); //odbiór 2 bajtów temperatury
if Trim(Bufor)='' then
//brak danych, TimeOut !!!
else
//w tym miejscu zamieniasz ciąg odebranych znaków na
//wartość typu integer
end;
end; |
Nie jest trudne, prawda ?
Pozdrawiam...
|
|
| Back to top |
|
 |
KanGu Poziom 11

Joined: 07 May 2005 Posts: 76 Location: Suwałki / Gdynia
|
#21
14 May 2006 19:59 Re: sterowanie przez rs232 |
|
|
|
W sumie to samo mam zrobione tyle że nie wiem jak zamienic wartość z bufora która jest typu char na jedną wartośćtypu integer tzn jak podzielić odebrane dane?
|
|
| Back to top |
|
 |
Jaca Poziom 20

Joined: 21 Jun 2002 Posts: 831 Location: Ostróda
|
#22
15 May 2006 10:07 Re: sterowanie przez rs232 |
|
|
|
Można tak ale musisz przerobić kod dla bufora w formie tablicy:
| Code: |
function TfrmMain.StrToNum(Bufor: string): integer;
var
Bajt: integer;
Liczba: integer;
Waga: integer;
begin
Liczba:=0;
Waga:=1;
for Bajt:=1 to Length(Bufor) do //Length(bufor) - liczba odebranych znaków, może być stała np. 2
begin
Liczba:=Liczba+Waga*Ord(Bufor[Bajt]); //Bufor[Bajt] - kolejne znaki z bufora odczytu, może być array zamiast string
Waga:=Waga*256;
end;
Result:=Liczba;
end; |
Pozdrawiam...
|
|
| Back to top |
|
 |
KanGu Poziom 11

Joined: 07 May 2005 Posts: 76 Location: Suwałki / Gdynia
|
#23
15 May 2006 23:08 Re: sterowanie przez rs232 |
|
|
|
nie daje rady ułożyć funkcji czy nie dało by tego rady zrobić w taki sposób:
| Code: |
var
mam : String;
Bajt: integer;
Liczba: integer;
Waga: integer;
begin
Repeat
// wysłanie zapytania
FlushFileBuffers(hCommDev);
Until (Write_Comm(hCommDev, StrLen(Buffer_O)) <> 0);
if (Read_Comm(hCommDev, SizeOf(Buffer_I)) > 0) then // odbiór
for Bajt:=1 to Length(Buffer_I) do //Length(bufor) - liczba odebranych znaków, może być stała np. 2
begin
Liczba:= Liczba+Buffer_I[Bajt]); //Bufor[Bajt] - kolejne znaki z bufora odczytu, może być array zamiast string
mam := Liczba
end;
RichEdit1.Text := mam
else
RichEdit1.Text := 'Brak danych';
end;
|
Powyższa cześć kodu próbowałem ułożyć do odebrania jednej temperatury jednak zależało by mi żeby odebrać też stan portu i powiedzmy zapisac go w zmiennej boolea tak że przy odczytaniu N zmienna ma wartość FALSE a w przypadku odebrania S ma ona wartość true.
to moje wypociny kompilują same błędy słaby jestem w programowaniu.
a tak wygląda screen z hyperterminala są to na zmianę, odebrana temperatura i stan portu N oznacza ze jest w stanie niskim S ze w stanie wysokim.
:cry:
| Filesize: |
8.79 KB |

|
|
|
| Back to top |
|
 |
Jaca Poziom 20

Joined: 21 Jun 2002 Posts: 831 Location: Ostróda
|
#24
16 May 2006 10:13 Re: sterowanie przez rs232 |
|
|
|
1. Masz gotową funkcję zamieniającą tablicę char na integer w zależności od odebranych danych:
| Code: |
function TForm1.CharToNum(Bufor: array of char): integer;
var
Bajt: integer;
Liczba: integer;
Waga: integer;
begin
Liczba:=0;
Waga:=1;
for Bajt:=1 to Length(Bufor) do
begin
Liczba:=Liczba+Waga*Ord(Bufor[Bajt]);
Waga:=Waga*256;
end;
Result:=Liczba;
end; |
2. Po wyglądzie danych w [...]terminalu widzę, że z BASCOM'a wysyłasz dane w postaci ciągu tekstowego (Print Temp1) a nie jak pisałem wyżej za pomocą 2 bajtów (Printbin Temp1). Jeśli będziesz wysyłać za pomocą Print to nici z powyższej procedury do zamiany odebranych danych na integer.
3. W czym problem z tym stanem portu ? Już mówiłem, że to Ty wysyłasz zapytanie do procka (wiesz, że wysyłasz zapytanie o Temp1 i wiesz, że procek odpowie 2 bajtami, więc odbierasz 2 bajty i zamieniasz je na integer lub wiesz, że wysyłasz zapytanie o stan portu więc w odpowiedzi oczekujesz 1 bajtu i zamieniasz ten bajt na True lub False w zależności od wartości odebranego bajtu)
4. Innym sposobem jest wysłanie zapytania globalnego, które w odpowiedzi da cały ciąg danych zawartych w ramce, np:
zapytanie PC: Z
odpowiedź uC: [T1.T1].[T2.T2].[S] - (5 bajtów), gdzie T1T1-2 bajty Temp1, T2T2-2 bajty Temp2, S-1 bajt stanu portu
Przy "rozbieraniu" ramki wiemy, że bajty na pozycji 1 i 2 to Temp1, 3 i 4 to Temp2 oraz 5 to stan portu.
Pozdrawiam...
|
|
| Back to top |
|
 |
KanGu Poziom 11

Joined: 07 May 2005 Posts: 76 Location: Suwałki / Gdynia
|
#25
16 May 2006 13:03 Re: sterowanie przez rs232 |
|
|
|
| Quote: |
2. Po wyglądzie danych w [...]terminalu widzę, że z BASCOM'a wysyłasz dane w postaci ciągu tekstowego (Print Temp1) a nie jak pisałem wyżej za pomocą 2 bajtów (Printbin Temp1). Jeśli będziesz wysyłać za pomocą Print to nici z powyższej procedury do zamiany odebranych danych na integer.
|
Ale ja wysyłam przy pomocy ptintbin jakbym wysyłał przy pomocy print dane w terminalu za każdym razem pojawiały by mi się w nowym wierszu gdyż bascom po komendzie print automatycznie dodaje znaczniki końca.
4. Podpunkt w pełni rozumiem i właśnie tak robię.
Mam problem ze zrozumieniem pozostałych podpunktów.
Co do funkcji nie rozumiem do końca jak ona działa
.
| Code: |
Liczba:=Liczba+Waga*Ord(Bufor[Bajt]);
Waga:=Waga*256;
|
zwłaszcza tych wierszy
za słaby jestem w programowaniu i potrzebowałbym szerszego wytłumaczenia. Nigdy nie miałem programowania, a jak wiadomo z książek i samemu się ucząc często bywają braki w podstawach.
Czy mógłbyś przekształcić tą funkcje żeby odbierała mi tą temperaturę i stan portu i wyświetlała na elementach typu richedit? Wtedy przyjrzałbym się dokładniej jak to funkcjonuje i może byłbym w stanie zrozumieć.
|
|
| Back to top |
|
 |
Jaca Poziom 20

Joined: 21 Jun 2002 Posts: 831 Location: Ostróda
|
#26
16 May 2006 13:56 Re: sterowanie przez rs232 |
|
|
|
W załączniku masz gotowy projekt. Dodaj tylko swoją obsługę RS232 i ew. zmień nazwę bufora odczytu.
| Code: |
for Bajt:=0 to Length(Bufor)-1 do
begin
Liczba:=Liczba+Waga*Ord(Bufor[Bajt]);
Waga:=Waga*256;
end; |
Co do sposobu działania tej procedury to działa ona wg wzoru:
| Code: |
| integer = starszy_bajt * 256 + młodszy_bajt |
1. Ord(Bufor[Bajt]) - zamienia kolejny znak z tablicy na kod ASCII
2. Waga* - mnoży kod ASCII przez wagę bajtu (1, 256)
3. Liczba+ - wynik z powyższych działań dodaje do poprzednich obliczeń
Pozdrawiam...
| Filename: |
Temp.rar |
 Download |
| Contents: |
Project1.cfg
, Project1.dof
, Project1.dpr
, Project1.exe
, Project1.res
, Unit1.dfm
, Unit1.pas
, _clean.bat
, Temp
See all... |
| Filesize: |
164.74 KB |
| Punkty: |
0.00 |
|
|
| Back to top |
|
 |
KanGu Poziom 11

Joined: 07 May 2005 Posts: 76 Location: Suwałki / Gdynia
|
#27
16 May 2006 23:07 Re: sterowanie przez rs232 |
|
|
|
Przykład bardzo pomógł teraz bardziej już rozumiem tą całą transmisję jednak nadal nie udaje mi się odebrać temperatur. Nie wiem czemu bo widzę że ta funkcja działa wyświetla mi liczby i to zmienno przecinkowe jednak nie mogę znaleźć logiki w uch wartościach
| Code: |
Case "3":
Printbin Temp1
Printbin Temp2
Case "4":
Printbin Temp1
Print Temp2
|
Napisałem taki kod w bascom pierwszy wyświetla mi wartości jedna obok drugiej natomiast w drugim przypadku są one wyświetlane za każdym razem w nowym wierszu.
| Code: |
procedure TForm1.rpClick(Sender: TObject);
begin
if (hCommDev > 0) then
begin
StrCopy(Buffer_O, status);
Timer1.Enabled := TRUE;
end
else
Application.MessageBox('Niewłaściwa nazwa portu lub jest on'+
' aktywny ', 'Uwaga !',MB_OK);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
mam : String;
Bajt: integer;
Liczba: integer;
Waga: integer;
begin
Repeat
// wysłanie zapytania
FlushFileBuffers(hCommDev);
Until (Write_Comm(hCommDev, StrLen(Buffer_O)) <> 0);
if (Read_Comm(hCommDev, SizeOf(Buffer_I)) > 0) then // odbiór
RichEdit1.Text:=FloatToStr(CharToNum([Buffer_I[0],Buffer_I[1]])/10);//pewnie tutaj jest błąd
RichEdit2.Text:=FloatToStr(CharToNum([Buffer_I[2],Buffer_I[3]])/10);//
end; |
zmienna status wysyła zapytanie '3' lub '4' testowałem dla obu przypadków wszystko jest w pętli. No i teraz nie rozumiem czy w buforze odbiorczym musze zapisać odebrane zmienne i dopiero później przepuścić przez funkcję którą napisałeś czy też teraz już powinno odbierać a diabeł tkwi w czymś innym.
| Filename: |
terminal.JPG |
 Download |
| Contents: |
|
| Filesize: |
34.49 KB |
| Punkty: |
0.00 |
|
|
| Back to top |
|
 |
Jaca Poziom 20

Joined: 21 Jun 2002 Posts: 831 Location: Ostróda
|
#28
17 May 2006 09:44 Re: sterowanie przez rs232 |
|
|
|
Pytanie za 100 pkt.: jakiego typu są zmienne Temp1 i Temp2 ? Dziwi mnie fakt, że w terminalu wartości są wyświetlane w postaci ciągu string. Jeśli zmienna jest typu integer i wysyłana jest za pomocą Printbin to w terminalu wyświetlałoby temperaturę w postaci 2 bajtów (znaków ASCII). Dla przykładu:
| Code: |
$regfile = "m8def.dat"
$crystal = 8000000
$baud = 9600
Dim Temp1 As Integer
Temp1 = 366 'temperatura 36.6 oC
Do
Printbin Temp1
Waitms 500
Loop
End |
wysyła do PC 2 bajty (znaki) o kodach ASCII odpowiednio 110 i 1 (1*256+110=366) a nie ciąg tekstowy 366 ! Podaj swoje źródło z BASCOM'a.
Pozdrawiam...
|
|
| Back to top |
|
 |
Google

|
#
17 May 2006 09:44 |
|
|
|
|
|
| Back to top |
|
 |
marek_Łódź Poziom 23

Joined: 23 Dec 2004 Posts: 3131 Location: Łódź
|
#29
17 May 2006 10:21 Re: sterowanie przez rs232 |
|
|
|
Faktycznie z tych kawałków ciężko o obraz całości. Z pewnością nie powinieneś łączyć transmisji znakowej Print z binarną Printbin bo oprócz tego, że nie wiadomo po co, dodatkowo utrudnia to zdekodowanie w odbiorniku.
Dlatego wersja opisana jako Case 4 nie jest za dobra. W takim przypadku pierwszą zmienną musiałbyś odebrać jako dwa bajty (jeśli jest integer), natomiast drugą czytać do łańcucha aż do wykrycia końca linii.
Zakładając, że dane są wysyłane jako integer w centystopniach (1/10 stopnia na jednostkę) przeliczenie jest chyba dobre, co widać na wydruku
W odbiorniku masz warunkowe wypełnienie pierwszego RichEdit
powinno być:
| Code: |
if (Read_Comm(hCommDev, SizeOf(Buffer_I)) > 0) then // odbiór
begin
RichEdit1.Text:=FloatToStr(CharToNum([Buffer_I[0],Buffer_I[1]])/10);
RichEdit2.Text:=FloatToStr(CharToNum([Buffer_I[2],Buffer_I[3]])/10);
end; |
i też nie do końca, bo trzeba by sprawdzać, czy przesłał 4 bajty, a najlepiej dołożyć do tego jeszcze jakiś bajt(y) startu (np &FF &FE) identyfikujący(e) początek ramki, bo inaczej mogą Ci się rozjechać dane i wtedy będziesz sobie składał niewiadomoco.
|
|
| Back to top |
|
 |
KanGu Poziom 11

Joined: 07 May 2005 Posts: 76 Location: Suwałki / Gdynia
|
#30
21 May 2006 11:42 Re: sterowanie przez rs232 |
|
|
|
męcze się od paru dni i nadal mi się nie udaje :|
| Code: |
Dim N As String * 1
Dim S As String * 1
Dim Star As Byte
Dim Sto As Byte
'------------------------------
N = "N"
S = "S"
Star = 0
Sto = 1
'------------------------------
Case "m":
If Err5 = 0 Then
Print Temp1 ; " odczyt temperatury z czujnika 1" 'temperatura #1
End If
Case "n":
If Err4 = 0 Then
Print Temp2 ; " odczyt temperatury z czujnika 2" 'temperatura #2
End If
Case "i":
Print W1 ; " Stan wejscia 1"
Case "j":
Print W2 ; " Stan wejscia 2"
Case "k":
Print W3 ; " Stan wejscia 3"
Case "M":
If Err5 = 0 Then
Printbin Temp1 'temperatura #1
End If
Case "N":
If Err4 = 0 Then
Printbin Temp2 'temperatura #2
End If
Case "I":
If W1 = 1 Then Printbin S Else Printbin N
Case "J":
If W2 = 1 Then Printbin S Else Printbin N
Case "K":
If W3 = 1 Then Printbin S Else Printbin N
Case "S":
Printbin Star 'start
Case "s":
Printbin Sto 'stop
Case "a":
|
To jest częśc kodu z bascoma ułożyłem to tak aby widoczne były temperatury i stany w hyperterminalu wysyłane sa przy urzyciu print a przy popmocy printbin chce odbierać przy pomocy delphi jednak z tym mam problem jakbym nie ułozył funkcji i tak odbiera mi dziwen wartości nie pasujące do niczego.
Myslalem zeby z poziomu delphi wysłac ciąg 'SMIs' i odebrac temperature i stan portu i wyswietlic na 2 elementach jednak nie udaje mi sie odebranie tego w delphi. Z poziomy hyperterminala widze ze wszystko działa poprawnie.
:cry:
|
|
| Back to top |
|
 |