Toon posts:

[VB6.0] PictureBox + picture sending + serial comm.

Pagina: 1
Acties:

Verwijderd

Topicstarter
Wij moeten voor een project een testomgeving maken in VB6.0 (waar wij nog niks van ervaring in hebben => dit is ons eerste ontwerp) waar we foto's (die in een picturebox gezet wordt) willen doorzenden via de seriele poort (COM1) naar een IC (een FPGA, voorlopig zenden we ze direct terug => zender=ontvanger) die ze bewerkt en terugzendt. Na een beetje programmeren en uitzoeken kunnen we al 1 pixel uit een foto halen en deze doorsturen via de poort en ontvangen en op het scherm zetten. We gebruiken volgende functie voor het terugkrijgen van de pixel uit de foto:

waarde = Picture_send.Point(a, b)

*****************************************

uit deze long halen we de RGB kleuren via

'uit een kleur dat van type LONG is halen wij de waarde van de RODE kleur die zich in de pixel bevindt
Private Function getRed(colour As Long) As Integer
getRed = Int(colour Mod 256)
End Function

'uit een kleur dat van type LONG is halen wij de waarde van de GROENNE kleur die zich in de pixel bevindt
Private Function getGreen(colour As Long) As Integer
getGreen = Int((colour / 256) Mod 256)
End Function

'uit een kleur dat van type LONG is halen wij de waarde van de BLAUWE kleur die zich in de pixel bevindt
Private Function getBlue(colour As Long) As Integer
getBlue = Int((colour / 256) / 256)
End Function

****************************************

en zenden ze door via de procedure:

Private Sub sending(data As Integer)
MSComm1.Output = Chr(data)
End Sub

****************************************

(alle communicatievariabelen zijn gedecl. en geinit.)
=> deze combinatie werkt perfect!!!!!

Wanneer we nu de ganse foto pixel per pixel willen inlezen en doorsturen doormiddel van 2 for-lussen en dezelde herkeningsfunctie en sending() procedure willen gebruiken geeft ie een foutmelding (terwijl hij vroeger voor 1 pixel wel werkte) ...

ie geeft de volgende foutmelding:

RUN TIME ERROR '5':

INVALID PROCEDURE CALL OR ARGUMENT

en verwijst in ons programma naar =>

MSComm1.Output = Chr(getRed(waarde))

Aangezien dit ons eerste echte source code is in VB zijn alle tips welkom ... alvast merci voor de hulp!!

  • Mickman
  • Registratie: Juni 2001
  • Laatst online: 29-03 18:11
Is de waarde die 'waarde' krijgt wel een long??

Verwijderd

Topicstarter
Functie .Point(x,y) gaf bij het versturen van 1 pixel de correcte waarde (long), zodat het versturen en ontvangen correct verliep. Zie voorbeeld:

*********************************
code van het verzenden van 1 pixel
*********************************
Private Sub kleur_Click()
'Dim waarde As Long
status = 0
xcor = Int(xco.Text)
ycor = Int(yco.Text)
kleurken = Picture_send.Point(xcor, ycor)
Label10.Caption = kleurken
Call sending(getRed(kleurken))
Call sending(getGreen(kleurken))
Call sending(getBlue(kleurken))


End Sub
******************************

Maar zodra het gebruikt wordt binnen het for-lus-blok geeft het een '-1' waarde terug.
Is daar een verklaring voor?

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 18:33
Remarks

If the point referred to by the x and y coordinates is outside object, the Point method returns -1.
Is er geen manier om de bitmap als bytearray te benaderen en die te versturen ?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
farlane schreef op 17 October 2003 @ 17:07:
[...]


Is er geen manier om de bitmap als bytearray te benaderen en die te versturen ?
inderdaad, dit was ons volgende idee en hebben het als volgt gedaan

********************************************************
Private Sub send_Click()
Dim vert, hor As Integer
Dim i, j, teller As Integer

'we zetten gans de foto in een array.
'eerst de coordinaten van de foto berekenen.
vert = Picture_UART.Picture_send.ScaleHeight()
hor = Picture_UART.Picture_send.ScaleWidth()

'initialiseren van teller van de RGBarray
teller = 1
For i = 1 To hor
For j = 1 To vert
comm_win2.Caption = "Loading Picture in 2D array!"
waarde = Picture_send.Point(i, j)
RGBarray(teller, 1) = getRed(waarde)
RGBarray(teller, 2) = getRed(waarde)
RGBarray(teller, 3) = getBlue(waarde)
Next
Next

'Variabelen die voor de ontvangst moeten zorgen worden hier initialiseerd
status = 0

'het eigenlijke doorzenden van de RGBarray via de seriele poort gebeurt hier
'initialisatie byte
Call sending(Int(255))
comm_win2.Caption = "Pictures is being transferred ... "

'grootte doorzenden (eerste # kolommen (=hor) en dan # rijen (=vert))
Call sending(Int(hor / 256))
Call sending(hor Mod 256)
Call sending(Int(vert / 256))
Call sending(vert Mod 256)

'hier wordt dan gans de RGBarray doorgestuurd via seriele poort
For teller = 1 To 126873
For i = 1 To 3
Do While MSComm1.CommEvent = comEventTxFull
teller = teller
Loop
MSComm1.Output = RGBarray(teller, i)
Next
Next
End Sub
**********************************************************

De tabel wordt inderdaad opgevult ... alleen krijgen we nu een overflow error van de seriele poort! waarschijnlijk omdat alles te snel gaat?? dus dachten we we plaatsen er die while loop tussen:

Do While MSComm1.CommEvent = comEventTxFull
teller = teller
Loop

maar wete niet of dit de manier is. We zullen wel op deze manier verder gaan! dus merci voor de tip! mocht je een tip hebben over de overflow error laat ons dan iets weten aub., we zullen ondertussen zelf ook nog verderzoeken...

Alvast bedankt voor de tips ...

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 18:33
Zet je code de volgende keer ff tussen code tags, dus zo ...
Visual Basic:
1
 Dim I as Integer


Verder, mbt je programma:

Ik zou het plaatje, als ie te groot is om in een keer te versturen, opdelen in chunks, en die apart versturen.

Bijvoorbeeld door zelf een soort protocolletje op te stellen; Per chunk zou je dan bijvoorbeeld chunknummer en lengte als eerste kunnen sturen, en daarachter de data. Vaak wordt er dan ook nog een checksum bij achteraan geplakt zodat de overkant kan controleren of de data ( waarschijnlijk ) goed is aangekomen.

[edit]
Owhja, en denk aan het inbouwen van timeouts ..... :)

[ Voor 5% gewijzigd door farlane op 20-10-2003 09:29 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1