Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

rs232,at89c52,problem z odbiorem informacji

vahooz
-
-
Posty:16
Rejestracja:4 mar 2004, o 01:49
Lokalizacja:Wrocek
Kontaktowanie:
rs232,at89c52,problem z odbiorem informacji

Postautor: vahooz » 16 maja 2004, o 01:33

Witam!

Kod: Zaznacz cały

$regfile = "reg51.dat" $crystal = 11059200 Dim A As Byte , S As String * 16 , I As Byte , Dum As Byte Open "Com3.1:9600" For Output As #1 Open "Com3.0:9600" For Input As #2 P3.3 = 0 Wait 1 P3.3 = 1 Do Get #2 , A If A = 100 Then *)nadajemy P3.3 = 0 Do S = "test" Dum = Len(s) For I = 1 To Dum A = Mid(s , I , 1) Put #1 , A Next Wait 1 Loop End If Loop End
Przy pomocy visual basica wysyłam układowi komendę startu "100" *) i układ wtedy nadaje, problem polega na tym, że zamiast upragnionego napisu "test" otrzymuje dziwne znaczki (krzaczki?pałeczki?).
Z moich obserwacji doszedłem do wniosku skoro, dane układ odbiera prawidłowo to chyba coś sprzęt szwankuje?
Pozdrawiam.

euromatic
-
-
Posty:77
Rejestracja:27 lip 2003, o 21:38
Lokalizacja:00000

Re: rs232,at89c52,problem z odbiorem informacji

Postautor: euromatic » 16 maja 2004, o 09:57

Witam!

Kod: Zaznacz cały

$regfile = "reg51.dat" $crystal = 11059200 Dim A As Byte , S As String * 16 , I As Byte , Dum As Byte Open "Com3.1:9600" For Output As #1 Open "Com3.0:9600" For Input As #2 P3.3 = 0 Wait 1 P3.3 = 1 Do Get #2 , A If A = 100 Then *)nadajemy P3.3 = 0 Do S = "test" Dum = Len(s) For I = 1 To Dum A = Mid(s , I , 1) Put #1 , A Next Wait 1 Loop End If Loop End
Przy pomocy visual basica wysyłam układowi komendę startu "100" *) i układ wtedy nadaje, problem polega na tym, że zamiast upragnionego napisu "test" otrzymuje dziwne znaczki (krzaczki?pałeczki?).
Z moich obserwacji doszedłem do wniosku skoro, dane układ odbiera prawidłowo to chyba coś sprzęt szwankuje?
Pozdrawiam.


Witam,
pozwoliłem sobie zmienić znacznie wygląd twojego kodu ( nawet bardzo)
jest to procedura odbioru z rs 232 bez "przerwania ". strasznie namieszałeś.
Po co używasz programowej obsługi transmisji jeżeli masz sprzętową?
Pomińmy to i tak jak widać to poniżej

z VB musisz wysłać :
MSComm1.Output = "100" & vbcr

zwróci ci "Test" (If Rozkaz = "100" Then Print "Test")


wypróbuj też inne rozkazy:


If Rozkaz = "ABC" Then Print "wyslales ABC"


If Rozkaz = "200" Then Print "wyslales DEF"

If Rozkaz = "END" Then Print "wyslales Koniec"







$crystal = 11059200
dim znak as byte
dim odebrane as string * 16
dim rozkaz as string * 3
dim licznik as integer
odebrane =""
licznik = 0


Do

Znak = Inkey() ' czeka na znak z portu szeregowego
incr licznik
If licznik >= 2000 Then Exit Do ' licznik który spowoduje wyjście z procedury odbiorczej po przepelnieniu się zmiennej tzw Time out
If Znak > 0 Then
odebrane = odebrane + Chr(Znak) 'jeśli wynik odbioru większy od "0" to dodaje znaki do zmiennej typu string
End If
Loop Until Znak = 13 ' enter kończy odbiór transmisji
rozkaz = mid(odebrane,1,3)
if rozkaz = "100" then print "Test"
if rozkaz = "ABC" then print "wyslales ABC"
if rozkaz = "200" then print "wyslales DEF"
if rozkaz = "END" then print "wyslales Koniec"
print "Odebrałem dane " ; odebrane
odebrane =""
licznik = 0
rozkaz = ""


End



procesor zwróci ci dane (max 16 znaków, możesz skrócić lub zwiększyć)
wysyłaj do niego dane tekstowo np " wykonaj1" lub w postaci "hex"
zawsze dostaniesz zwrot tego co wysłałeś , jeżeli nie chcesz tego to skasuj linijkę "print "Odebrałem dane " ; odebrane"

życzę miłej zabawy
Pozdrawiam

vahooz
-
-
Posty:16
Rejestracja:4 mar 2004, o 01:49
Lokalizacja:Wrocek
Kontaktowanie:

Postautor: vahooz » 16 maja 2004, o 12:17

Witam to jeszcze raz ja.Wykożystałem Twój kod (wgralem go do procesora) i niestety nic sie nie dzieje... wlutowałem nawet diodę by sprawdzić czy dane (kod 100) są przez procesor odbierane ale niestety nie są.
Kod Bascoma:

Kod: Zaznacz cały

$crystal = 11059200 dim znak as byte dim odebrane as string * 16 dim rozkaz as string * 3 dim licznik as integer odebrane ="" licznik = 0 Do Znak = Inkey() incr licznik If licznik >= 2000 Then Exit Do If Znak > 0 Then odebrane = odebrane + Chr(Znak) End If Loop Until Znak = 13 rozkaz = mid(odebrane,1,3) if rozkaz = "100" then p3.3=0 'jezeli odbierze 100 to zaswieci dioda print "Test" end if if rozkaz = "ABC" then print "wyslales ABC" if rozkaz = "200" then print "wyslales DEF" if rozkaz = "END" then print "wyslales Koniec" print "Odebrałem dane " ; odebrane odebrane ="" licznik = 0 rozkaz = "" End
Kod Visual basic:

Kod: Zaznacz cały

private sub comman1_click() MSComm1.PortOpen=True Timer1.Enabled=True End Sub Private Sub Timer1_Timer() Do DoEvents Loop Until MSComm1.InBufferCount >= 2 dane=MSComm1.Input Text1.Text=Dane End Sub
Dodałem jeszcze "enable serial","$baud=9600" i "enable interrupts", układa działa, wypisuje "Odebrałem dane", ale jak podaje mu kod "100" lub "ABC" itp... to ich nie zwraca... dioda też się nie zapala. :?

euromatic
-
-
Posty:77
Rejestracja:27 lip 2003, o 21:38
Lokalizacja:00000

witam ponownie

Postautor: euromatic » 16 maja 2004, o 17:26

Nie czytałeś uważnie poprzedniego postu. napisałem tam jak masz wysłać komendę z VB.
poniżej podaję ci wszystko tak jak masz wkleić do VB6




komenda wysłania to:
MSComm1.Output = "100" & Vbcr' gdzie "100" to rozkaz a Vbcr to "enter" bez którego procesor nic nie odbierze!!!!!


i wywal ten timer.....
nie jest potrzebny do wysłania
wstaw kontrolkę mscomm i nic w niej nie zmieniaj.
ewentualnie podaj mi maila to wyślę ci przykładzik z vb6

jednym słowem postaw na formie "button" i wpisz w niego
MSComm1.Output = "100" & Vbcr
i to wszystko



oraz dodaj jeden do...loop w kodzie baskoma

bo procedurka tego nie miała, był to tylko fragment odbioru........

'**************************************************

Do ' bez tego program raz przeleci i zatrzyma się na "End"





Do
Znak = Inkey()
incr licznik
If licznik >= 2000 Then Exit Do
If Znak > 0 Then
odebrane = odebrane + Chr(Znak)
End If
Loop Until Znak = 13
rozkaz = mid(odebrane,1,3)
if rozkaz = "100" then
p3.3=0 'jezeli odbierze 100 to zaswieci dioda
print "Test"
end if
if rozkaz = "ABC" then print "wyslales ABC"
if rozkaz = "200" then print "wyslales DEF"
if rozkaz = "END" then print "wyslales Koniec"
print "Odebrałem dane " ; odebrane
odebrane =""
licznik = 0
rozkaz = ""

Loop
End
'*****************************************************





natomiast w vb6 zrób tak:





Private Sub Form_Load()' ustawienia
MSComm1.CommPort = 1
MSComm1.Settings = "9600,n,8,1"
Debug.Print "----------"
MSComm1.RThreshold = 1
End Sub



Private Sub MSComm1_OnComm()' procedura odbioru z koma
Select Case MSComm1.CommEvent
Case comEvReceive
DANE = MSComm1.Input
Label1 = Label1 & DANE' daj zmienną string o nazwie "dane" i postaw label1 gdzie będziesz widział to co wraca z procesora
End Select
End Sub

Private Sub Command1_Click()' wysłanie rozkazu
MSComm1.Output = "100" & Vbcr
End Sub





pozdrawiam

vahooz
-
-
Posty:16
Rejestracja:4 mar 2004, o 01:49
Lokalizacja:Wrocek
Kontaktowanie:

Postautor: vahooz » 16 maja 2004, o 19:45

Dziękuje dziła!
Pozdrawiam!

euromatic
-
-
Posty:77
Rejestracja:27 lip 2003, o 21:38
Lokalizacja:00000

witam

Postautor: euromatic » 16 maja 2004, o 22:17

cieszę się, powinieneś jednak zrobić to na przerwaniach, a tak wogóle to zamień 89C51 na AVR
osiągniesz cel szybciej i lepiej.
pozdrawiam

Wróć do „Projektowanie PCB, programy EDA, CAD, narzędziowe”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 30 gości