Hej! Hej Jag tror din microdator hinner ta emot och skicka. Då får vänta lite innan du läser input. Vet inte om du kan använda sleep. Testa att vänta en millisekund. Tack för tipset om sleep. Det löste lite annat för mig. Problemet här tycks vara Hej Hej Du kan ju testa med en bytearray: Prova att skicka med andra datatyper, tex en sträng innehållandes noll: TACKAR! Både Andreas H och Anders D förslag fungerar utmärkt nu. Jag har sett i hjälpen att det går bra med både string och byte array men det senare har jag inte fått riktigt kläm på (ännu).Handskakning med nolla i serieporten
Jag skall via serieporten kommunicera med en microprocessor som skall styra två stegmotorer. Hanskakningen sker genom att jag skickar en nolla och om det finns förbindelse får jag tillbaka en nolla.
Koden borde se ut så här:
<code>
' Initieringshandskakning
Private Sub cmdAnslut_Click()
' Skapar en "binär nolla"
Dim bytData As Byte
bytData = 0
' Ställer in COM1
MSComm.CommPort = 1
' Inställningar för överföringen
MSComm.Settings = "9600,N,8,1"
'Hela buffern ska läsas vid mottagande
MSComm.InputLen = 0
' Inkommande information i binär mode
MSComm.InputMode = comInputModeBinary
' Öppna porten
MSComm.PortOpen = True
'Ingen standardiserad handskakning
MSComm.Handshaking = comNone
' Skickar en nolla som handskakning
MSComm.Output = bytData
' En nolla tillbaka OK, annars ingen kontakt
If MSComm.Input <> bytData Then
' Uppkopplingen fungerade inte
Else
' Uppkopplingen fungerade
End If
End Sub
</code>
Men MSComm.Output vill inte ta emot min nolla. Tips?
I tidigare VB-versioner fanns kommandona SENDBYTE(0) och READBYTE för detta. Hur ersätter man dem?
/NnSv: Handskakning med nolla i serieporten
Testa att ändra denna rad
>'Ingen standardiserad handskakning
MSComm.Handshaking = comNone
Till någon av dessa
comNone 0 ' No handshaking.
comXonXoff 1 ' XOn/XOff handshaking.
comRTS 2 ' Request-to-send/clear-to-send handshaking.
comRTSXOnXOff 3 'Both request-to-send and XOn/XOff handshaking.
OBS OBS Om du väljer 2 eller 3 härovan så måste du sätta
RTSEnabled = True
<Url:http://search.microsoft.com/default.asp?qu=MsComm&boolean=ALL&nq=NEW&so=RECCNT&p=1&ig=01&i=00&i=01&i=02&i=03&i=04&i=05&i=06&i=07&i=08&i=09&i=10&i=11&i=12&i=13&i=14&i=15&i=16&i=17&i=18&i=19&i=20&i=21&i=22&i=23&i=24&i=25&i=26&i=27&i=28&i=29&i=30&i=31&i=32&i=33&i=34&i=35&i=36&i=37&i=38&i=39&i=40&i=41&siteid=us/dev>
Kör du bipolär stegmotorstyrning ?
/Sven Sv: Handskakning med nolla i serieporten
<code>
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Sub cmdAnslut_Click()
Dim bytData As Byte
'Skapar en "binär nolla"
bytData = 0
' Ställer in COM1
MSComm.CommPort = 1
' Inställningar för överföringen
MSComm.Settings = "9600,N,8,1"
'Hela buffern ska läsas vid mottagande
MSComm.InputLen = 0
' Inkommande information i binär mode
MSComm.InputMode = comInputModeBinary
' Öppna porten
MSComm.PortOpen = True
'Ingen standardiserad handskakning
MSComm.Handshaking = comNone
' Skickar en nolla som handskakning
MSComm.Output = bytData
Sleep 1
' En nolla tillbaka OK, annars ingen kontakt
If MSComm.Input <> bytData Then
' Uppkopplingen fungerade inte
Debug.Print "Inget resultat"
Else
' Uppkopplingen fungerade
Debug.Print "OK"
End If
End Sub
</code>
Testa med 1. Du kan ju öka till 10 och 100 om det inte funkar då, så går det inte med sleep. Du kan då prova med en timer.Sv: Handskakning med nolla i serieporten
<code>
Dim bytData As Byte
bytData = 0
</code>
som strular i
<code>
MSComm.Output = bytData
</code>
och i
<code>
If MSComm.Input <> bytData Then
</code>
Jag är ute efter att skicka en "binär nolla", dvs åtta bitar som alla är satta till noll. Den mottagande microprocesorn (PIC16C63) väntar sig en sådan binär nolla. Fler tips?
SvenPon: Vet ännu inte. Först måste jag få denna bit att fungera men troligtvis kommer jag att avända 4pin 5V stegmotor från Kjell & Co.
/NnSv: Handskakning med nolla i serieporten
Ser lurigt ut , verkar rätt som du skriver.
Vad händer om du skickar tex 255
Vad får du för felkod ?
Är det bara Input som strular ?
Har du testat:
comXonXoff 1 ' XOn/XOff handshaking.
comRTS 2 ' Request-to-send/clear-to-send handshaking.
med RTSEnabled = True
DSSv: Handskakning med nolla i serieporten
Kolla på http://www.eggertelectronics.com. De använder comporten
till sina stegmotorstyrningar. De går via comporten till en MAX232 Dual RS-232 Interface sedan vidare till en Philips 87C51. Där finns kanske något att snappa upp.
Har själv köpt en av deras styrningar som jag håller på att modifiera
efter egna behov. Det medföljer programexempel både för VB6 och
QuickBasic.
/IvanSv: Handskakning med nolla i serieporten
<code>
Dim bytData() As Byte
Redim bytData(0)
bytData(0) = 0 'Behövs egentligen inte. Men för förtydligande
MSComm.Output = bytData
Sleep 1
Select MSComm.InBufferCount
Case 0
Debug.print "No response"
Case 1
bytData = MSComm.Input
If bytData(0) = 0 Then
Debug.print "OK!"
Else
Debug.print "Invalid response!"
End If
Case Else
Debug.print "Invalid response!"
End Select
</code>Sv: Handskakning med nolla i serieporten
<code>
Dim str As String
str = Chr$(0)
MSComm1.OutPut = str
</code>
Prova också att sätta
<code>
MSComm1.InputMode = comInputModeBinary
</code>
innan du skriver och läser från serieporten. Var då noga med att läsa in data i en bytearray.
I hjälpen om output står också följande:
To send binary data, you must pass a Variant which contains a byte array to the Output property. Prova det.
Mvh
AndersSv: Handskakning med nolla i serieporten
Dessutom tror jag det funkar med integer. Efter handskakning skall övriga instruktioner bestå av 8 bitar och då använde jag först integer i kombination med bitmanipulering vilket fungerade. Kanske skippar microprocessorn övriga bitar.
Normalt arbetar jag i C++ och Java men vill göra ett försök i VB. I de böcker som jag har skaffat mig om VB står det nästan ingenting om hur man arbetar med bitmanipulering men det är kanske meningen att man inte skall använda VB för sådana här tillämpningar?
Får jag allt att fungera så lägger jag ut programmet här på Pellesoft.
/Nn