PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : problem mit inputbin usw bei rs485 kommunikation



veit
02.03.2006, 17:18
also ich habe ein gerät an nem 485 bus dass ich per printbin ein paar kommandos schicke, das funzt einwandfrei.
das gerät empfängt die befehle und zeigt es auf dem display an.

nun schickt das gerät antworten, die ich jetzt einlesen will, es klappt aber nicht.
(ich kann das ganze mit dem pc testen, da funzt alles über ein terminal programm)

also die antwort auf ein kommando ist z.b. 200 1 0 254 201

(kurze erklärung: 200 ist das startbyte, dann kommt die gerät-id, dann errorcode 0, dann checksum, dann 201 als endbyte
ich will die werte jetzt einfach in variablen einlesen, und versuche das gerade so:





Config Serialin = Buffered , Size = 64

...

Do



Wait 3

Call Transmit_101 'command get start parameters senden

If Ischarwaiting() = 1 Then
Call Receive_101 'sub receive_101 soll empfangen
End If


'Loop
'End If

.......

Loop


Sub Receive_101
Reset Portc.0 'hier nochmal den rs485 auf empfangen schalten
Startcom = 0
Do
Inputbin Startcom

Loop Until Startcom = 200

...

end sub





beim senden checke ich ob alle daten gesendet wurden mit dem txc flag und schalte den 485 wieder auf empfangen ... geht prima.


problem ist beim empfangen auch wenn ich ischarwaiting weglasse geht gar nix.
kann es sein dass er sich bei inputbin irgendwie aufhängt ?

das gerät antwortet innerhalb von 10ms, deshalb dachte ich mir mit ischarwaiting wartet er bis daten kommen, dann in der sub prüft er ob das byte 200 empfangen wird, das ist dann der erste wert, danach die anderen einlesen....


?????????


buhuuuuu

veit
02.03.2006, 18:16
hmmmm muss ich da irgendwie waitkey verwenden oder sowas ???


man die hilfe ist gar nicht mal sooo übersichtlich ...

veit
02.03.2006, 19:46
oh mann jetzt hab ich echt schon etliches versucht .... interrupt, waitkey, usw usw

es klappt einfach nicht

x-ryder
03.03.2006, 13:02
LOL, das problem hatte ich exakt so mit der CMUCam2, daher schreib ich für die ja auch grad nen manual, wo ich das ganze etwas besser beschreibe, und die gibt als startbyte ne 255 ^^ also so iss der code dazu:


Sub Empfangen()
While Isit <> 200
Isit = Waitkey()
Wend
For I = 1 To 4
Isit = Waitkey()
Ar(i) = Isit
Next
End Sub

der wartet also auf die 200, und dann liest er 4 weitere bytes ein, das funzt wunderbar so, und die methode wird DIREKT nach dem senden ausgeführt, also ohne ischarwaiting und son quatsch, tests mal, sollte genau so gehen ^^

Martin

veit
03.03.2006, 14:12
wow prima ich werds gleich mal austesten !

bei mir sinds so 8-10 bytes glaub ich, müsste ja gehen.

ach mist und ich hatte den nachmittag eigentlich für was anderes verplant ;-)

x-ryder
03.03.2006, 14:19
kannst ja auch das andere machen, aber wenn du natürlich der verlockung nicht widerstehen kannst :cheesy:

musst mal testen mit deiner byteanzahl, aber musste eben nur die 4 ersetzen, in dem array sind dann die verwertbaren bytes nur nach der 200 enthalten, also eigentlich einfach, aber knackig ^^

Martin

veit
03.03.2006, 17:07
ok also nach etlichem hin- und her gehts auf einmal, allerdings etwas anders:



do
Wait 3

Call Transmit_102
'commando senden, dann antwort abwarten
'antwort ist 200 1 0 244 201 (start, id, error, checksum, end)

Check = Waitkey()

If Check = 200 Then

For I = 1 To 4
Check = Waitkey()
Ar(i) = Check
Next
End If
If Ar(1) = 1 Then (das erste byte nach der 200 muss 1 sein)
'dann kontroll led blinken lassen
Porta.0 = 0
Waitms 100
Porta.0 = 1
Waitms 100
Porta.0 = 0
Waitms 100
Porta.0 = 1
Waitms 100
Ar(1) = 0
End If
loop

ok also das läuft kontinuierlich durch.
als erstes brauch ich jetzt mal nen timeout, wenn innerhalb von 10ms nicht geantwortet wird soll das kommando erneut gesendet werden.

wenn ich das hab müsst ich eigentlich klar kommen.

vielen dank schonmal und wenn wer tipps zum timeout hat ... ich habe aber noch nie mit timern gearbeitet ....

werd mich mal umschauen, glaub ich hab im forum irgendwo mal was gelesen

veit
03.03.2006, 17:14
hmmm die hilfe sagt mit inkey gehts weiter auch wenn kein character kommt .... aber da werd ich das problem haben das mein gerät bis zu 10ms brauchen kann bis es sendet ....

ich probier mal weiter rum

veit
03.03.2006, 17:55
juhuuu mit $timeout und waitkey klappts ...