Ik heb een probleem met HRSOUT in Proton. Ik probeer een string van 8 bytes te versturen. Dit gaat op zich goed. Echter als een van deze bytes gelijk is aan nul (het NULL teken dus) dan kapt HRSOUT er voor deze byte er mee.

Bijvoorbeeld:
WegErMee="123"+CHR(0)+"456"
HRSOUT WegErMee

En het resultaat is dat alleen "123" verstuurd wordt.

dit is een deel van de code die ik gebruikt


DIM COM[8] AS BYTE                                   ;Make a 8 Byts string named COM
DIM CMD AS COM#3.DWORD : DIM COM#3H    AS COM#2      ;First 4 byte are defined as Dword "CMD"
                         DIM COM#3HH   AS COM#1      ;
                         DIM COM#3HHH  AS COM#0      ;
DIM CW1 AS COM#5.WORD  : DIM COM#5H    AS COM#4      ;Byte 4 and 5 are defined as word "CW1"
DIM CW2 AS COM#7.WORD  : DIM COM#7H    AS COM#6      ;BYTE 6 AND 7 are defined AS WORD "CW2"

CLEAR

;...
                  
CMD=$44414747: CW1=0: CW2=17989: GOSUB Transmit      ;Com Str. vullen 
                  
;...              

Transmit:
HRSOUT $2B,STR COM                                   ;En dan gaat het dus fout

Is hier een oplossing voor? . Dit lijkt me toch een probleem wat vaker voor komt.

Het probleem komt inderdaad vaker voor (ik ben er onlangs zelf ook tegenaan gelopen in precies dezelfde situatie).
Heb het maar opgelost door de bytes en words in mijn (toevallig ook) 8 bytes lange string individueel te verzenden.
Dus in jouw geval zou je CMD, CW1 en CW2 gewoon achter de HRSOUT moeten zetten. En dan vervalt ook het nut van gebruik van een array als placeholder.

Het is een bug in de compiler dat hij niet alle elementen van de array verstuurd.
Zeker omdat er in de help expliciet staat 'send all of an array'.

Ik meen me te herinneren dat er 'ergens' in de help wel een opmerking staat over het gebruik van de 'str' modifier en het stoppen bij null-bytes.
Maar de helptext van hrsout stemt eenvoudigweg niet overeen met wat de compiler doet. Een zeer kwalijke zaak.

Altijd fijn dat iemand anders ook tegen de zelfde problemen aan loop:) Jouw oplossing moet inderdaad werken. Ik begon in de richting te denken om de byts 1 voor 1 te verzenden.

dan krijgen we dus het volgende:


for count1 = 0 to 8
hserout COM[count1]
next count1

Ik zal het eens gaat proberen...

Doe dan wel 0..7 :-)

Het loopje heb ik ook gebruikt.
Maar ik vond de enkele HRSOUT met de 3 parameters estethisch verantwoorder.

[Bericht gewijzigd door picsels op (74%)]

0..7 inderdaad

HRSOUT var1,var2,var3 is mischien inderdaad een betere oplossing dan een gek for loopje. Weet je toevallig ook of "var1,var2,var3" mooi achter elkaar verstruurd wordt of dat er pauzes tussen de variable zitten. Ik vindt het namelijk leuker als de bytes gewoon constant verstuurd worden.

EDIT weet het al:
Even met de scoop gemeten wat er op de UART poort uit komt (wat nog niet mee viel met een analoge scoop :) ). Tijdens het verzenden van HRSOUT var1,var2,var3 kon ik op de scoop het volgende aflezen

1- Er zitten geen pauzes tussen de variable
2- De volgende instructie na HRSOUT wordt uitgevoerd alvoors de laaste 2 bytes verzonden zijn.

Dus kennelijk heeft de uitgang van de UART een soort van buffer die 2 byte groot is net zo als de ingangs buffer. En de functie HRSOUT propt gewoon een byte in die buffer zodra er plek is. Heeft HRSOUT alle variable in de buffer gepropt dan wordt er verder gegaan met de volgende instructie van het programma. De hardware UART zorgt er dan voor dat de buffer netjes volgens het tempo van de baundrate verstuurd wordt. En aangezien de baundrate langzamer is als het tempo waarmee HRSOUT de buffer kan vullen komen er geen pauses in de Byts voor.

En zo hebben we allemaal weer wat geleerd :)

De buffer van de usart is maximaal 2 bytes groot, het RCREG register en het shift register van de usart zelf.

Wat in het RCREG register geplaatst wordt, wordt naar het shift register verplaatst indien die leeg is. Waarna het RCREG register weer gevuld kan worden.

Hierdoor kunnen maximaal 2 bytes tegelijk door het IC onthouden worden. HRSOUT gebruikt misschien een eigen geheugen en een timer om het RCREG register te controleren dan.