FAQ | Points | Add... | Recent posts | Search | Register | Log in


Sterowanie przez rs232, potrzebny schemat układu.


Post new topic  Reply to topic      Main Page -> Forum Index -> Microcontrollers Generally -> Sterowanie przez rs232, potrzebny schemat układu.
Author
Message
zabtom
Poziom 6
Poziom 6


Joined: 08 Jul 2004
Posts: 19

Post#1 Post from the author of the topic 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
Poziom 23


Joined: 23 Dec 2004
Posts: 3131
Location: Łódź

Post#2 09 May 2006 09:51   

Re: sterowanie przez rs232


http://www.elektroda.pl/rtvforum/viewtopic.php?t=156231&start=0&sid=f043ba11a05420bf725fe45b861c998c

http://www.chip.pl/arts/archiwum/n/sub/articlear_18515.html

Niestety układ działa tylko w jedną stronę, a rozbudowa o wejścia wymaga trochę pogłówkowania (musi być inna synchronizacja wyłączająca zatrzask i przesuwająca dane wejściowe w rejestrze - wejście równoległe,wyjście szeregowe synchronizacja z wyjścia RS232)

W sumie najprościej zrobić to na małym procesorku (ATTiny26, ATTiny 2313, ATMega8) i interfejsie MAX232 plus mały programik np. w BASCOMie
Back to top
   
zabtom
Poziom 6
Poziom 6


Joined: 08 Jul 2004
Posts: 19

Post#3 Post from the author of the topic 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
Poziom 23


Joined: 23 Dec 2004
Posts: 3131
Location: Łódź

Post#4 10 May 2006 10:29helpful post - solution   

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



m8.jpg
 Filesize:  51.72 KB

m8.jpg



M8.zip
 Filename:  M8.zip
Download
 Contents:  m8.sch , m8.jpg , m8.brd
See all...
 Filesize:  84.41 KB
 Punkty:  0.00

Back to top
   
Google

Google Adsense


Post# 10 May 2006 10:29helpful post - solution   





Back to top
   
Jaca
Poziom 20
Poziom 20


Joined: 21 Jun 2002
Posts: 831
Location: Ostróda

Post#5 10 May 2006 11:21helpful post - solution   

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
Poziom 23


Joined: 23 Dec 2004
Posts: 3131
Location: Łódź

Post#6 10 May 2006 11:39   

Re: sterowanie przez rs232


Dzięki za czujność. Już poprawiam.
Pozdrawiam
Back to top
   
zabtom
Poziom 6
Poziom 6


Joined: 08 Jul 2004
Posts: 19

Post#7 Post from the author of the topic 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
Poziom 23


Joined: 23 Dec 2004
Posts: 3131
Location: Łódź

Post#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
Poziom 6


Joined: 08 Jul 2004
Posts: 19

Post#9 Post from the author of the topic 10 May 2006 16:44   

Re: sterowanie przez rs232


Ok. A co z programem??
Back to top
   
Google

Google Adsense


Post# Post from the author of the topic 10 May 2006 16:44   





Back to top
   
marek_Łódź
Poziom 23
Poziom 23


Joined: 23 Dec 2004
Posts: 3131
Location: Łódź

Post#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
Poziom 6


Joined: 08 Jul 2004
Posts: 19

Post#11 Post from the author of the topic 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
Poziom 23


Joined: 23 Dec 2004
Posts: 3131
Location: Łódź

Post#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

Google Adsense


Post# 11 May 2006 15:01   





Back to top
   
KanGu
Poziom 11
Poziom 11


Joined: 07 May 2005
Posts: 76
Location: Suwałki / Gdynia

Post#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
Poziom 11


Joined: 19 Sep 2004
Posts: 65

Post#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
Poziom 11


Joined: 07 May 2005
Posts: 76
Location: Suwałki / Gdynia

Post#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
Poziom 14


Joined: 26 Mar 2004
Posts: 157

Post#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
Poziom 11


Joined: 07 May 2005
Posts: 76
Location: Suwałki / Gdynia

Post#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
Poziom 20


Joined: 21 Jun 2002
Posts: 831
Location: Ostróda

Post#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
Poziom 11


Joined: 07 May 2005
Posts: 76
Location: Suwałki / Gdynia

Post#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
Poziom 20


Joined: 21 Jun 2002
Posts: 831
Location: Ostróda

Post#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
Poziom 11


Joined: 07 May 2005
Posts: 76
Location: Suwałki / Gdynia

Post#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
Poziom 20


Joined: 21 Jun 2002
Posts: 831
Location: Ostróda

Post#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
Poziom 11


Joined: 07 May 2005
Posts: 76
Location: Suwałki / Gdynia

Post#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:



odczyt.JPG
 Filesize:  8.79 KB

odczyt.JPG


Back to top
   
Jaca
Poziom 20
Poziom 20


Joined: 21 Jun 2002
Posts: 831
Location: Ostróda

Post#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
Poziom 11


Joined: 07 May 2005
Posts: 76
Location: Suwałki / Gdynia

Post#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
Poziom 20


Joined: 21 Jun 2002
Posts: 831
Location: Ostróda

Post#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...



Temp.rar
 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
Poziom 11


Joined: 07 May 2005
Posts: 76
Location: Suwałki / Gdynia

Post#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.



terminal.JPG
 Filename:  terminal.JPG
Download
 Contents:  
 Filesize:  34.49 KB
 Punkty:  0.00

Back to top
   
Jaca
Poziom 20
Poziom 20


Joined: 21 Jun 2002
Posts: 831
Location: Ostróda

Post#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

Google Adsense


Post# 17 May 2006 09:44   





Back to top
   
marek_Łódź
Poziom 23
Poziom 23


Joined: 23 Dec 2004
Posts: 3131
Location: Łódź

Post#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
Poziom 11


Joined: 07 May 2005
Posts: 76
Location: Suwałki / Gdynia

Post#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
   
Post new topic  Reply to topic      Main Page -> Forum Index -> Microcontrollers Generally -> Sterowanie przez rs232, potrzebny schemat układu.
Page 1 of 2 Go to page 1, 2  Next
Similar topics
Sterowanie przekaźnikami prądu elektrycznego przez RS232. (6)
Sterowanie przekaznikami przez port rs232 na tranzystorach (2)
Sterowanie pwm przez port rs232 (1)
Sterowanie jedną diodą przez RS232 (5)
proste sterowanie komputerem przez rs232 (1)
sterowanie serwem z pc przez rs232 (2)
Zdalne sterowanie przez PC, może być przez rs232 (2)
Sterowanie wyświetlaczem 7 segmentowym przez port RS232 (17)
STEROWANIE SKANEREM LASEROWYM W DELPHI PRZEZ RS232 !!! HELP! (1)
Schemat układu USB-RS232 na FT232RL. (2)

Page generation time: 0.27 seconds


FAQ || Administrator || Moderators || Widgets and banners || Contact
elektroda.pl topic RSS feed