Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: rs232 pufferüberlauf? Kategorie: Programmierung C (von matze - 1.09.2010 17:40)
Als Antwort auf Re: rs232 pufferüberlauf? von Blackdragon - 30.08.2010 19:57

> >
> > hallo, bitte seid milde gestimmt , es ist main aller erster Forums Eintrag! Ich habe nur
> > leider über die Suchfunktion nicht das richtige gefunden.
> >
> > folgender Fall:
> >
> > Messdaten von cc-pro 128  auf  pc via rs232 nach Aufforderung übertragen.
> > Sprich der pc sendet Steuercodes 10byte, nach dem auswerten auf der cc-pro
> > soll diese antworten mit den jeweiligen Messdaten. ca 1-2 sec Takt.
> >
> > initialisiert wird mit:
> > Serial_Init_IRQ(0,Buffer_rs232,10,32,SR_8BIT|SR_1STOP|SR_NO_PAR,SR_BD19200);
> > am Anfang des Programms.
> >
> > wenn ich über ein Terminal Programm 10 Zahlen sende:
> >
> > while (count <=9)
> >    {
> >     count=Serial_IRQ_Info(0,RS232_FIFO_RECV);
> >    }
> >
> >
> >
> > so sieht die Antwort meistens aus.
> > i=0022 0000 0001 0000 0002 0000 0003 0000 0004
> >        0000 0005 0000 0006 0000 0007 0000 0008  10 Zeichen im IRQ empfangen
> >
> >
> > aber wenn ich in dem Terminal Programm auf einer Taste drauf bleibe
> >  und er fortlaufend bytes schicke,
> > sieht es ab und an so aus.
> >
> >
> > i=002E 0000 0001 0000 0002 0000 0003 0000 0004
> >        0000 0031 0031 0031 0000 0007 0000 0008  19 Zeichen im IRQ empfangen
> >
> >               ^    ^    ^
> >            da ist der fehler!!  die drei 31
> >
> > Wie sage ich ihm, das er nur 10 Zeichen lesen soll und danach den Puffer zurücksetzen mu�
> > damit er nich in den Sendepuffer schreibt
> >
> > Es ist doch auch richtig, das ich die zu sendenden Daten in den "Buffer_rs232" + 10
> > direkt hineinschreibe bzw :  Serial_Write(0,Buffer_rs232[10+count ++]);
> >
> > ich hoffe ich habe mich einigerma�en klar ausgedrückt.
> > ich benutzte derzei noch keine threads eine schleife zählt puffer:
> > Serial_IRQ_Info(0,RS232_FIFO_RECV);
> >
> > danke
> >
> >
> >
> >
> >
> Hallo,
> ich benutze die RS232 auch und musste eine Abfrage einbauen ob in dem Puffer noch etwas drin ist.
> Den Empfangspuffer würde ich in deinem Fall etwas grösser machen.
>
> Bei mir sieht das wie folgt aus...
> Ich habe die RS232 in einem eigenem Thread laufen.
> Ich habe dir mal einen Auszug zusammen gestellt. Vieleich kannst du den Code bei dir anpassen.
>
> Dim RS232_Wert_1 as Single
> Dim Wertin as Single
>
> Sub Thread_RS232()
>     'RS232 Ausgabe
>     Dim Text(37) As Char    ' Arrays deklarieren
>     Dim count, sz As Integer
>     Dim Rs232_read_count As Integer
>    
>     'Init RS232: 38400 bps, 8 Bit, 1 Stop, NP
>     '20 Byte Empfangspuffer - 100 Byte Sendepuffer
>     Serial_Init_IRQ(0,Buffer,20,100,SR_8BIT Or SR_1STOP Or SR_NO_PAR,SR_BD38400)
>
>     Do While True     'Endlosschleife
>
>     'Abfrage wieviel Zeichen empfangen wurden
>     count=Serial_IRQ_Info(0,RS232_FIFO_SEND)
>
>     If count>0 Then
>     Goto W1
>     End If
>
>     'Wert 1   - senden
>     Str_WriteFloat(RS232_Wert_1,2,Text,0)
>     Serial_WriteText(0,Text)
>
>     ...
>     Wert xxx
>    
>     'Ende Schreibe Linefeed
>     Serial_Write(0,LF)
>
>
>     '################## RS232 Empfangen ##############################
>
>      'Abfrage wieviel Zeichen empfangen wurden
>     count=Serial_IRQ_Info(0,RS232_FIFO_RECV)
>
>     If count<=15 Then
>     Goto W1
>     End If
>
>     Rs232_read_count = 0
>
>     Do While True
>         sz=Serial_ReadExt(0)                'Puffer auslesen
>         If sz=&H100 Then
>             Exit                            'bei 0x100 ist der Puffer leer
>         Else
>             Msg_WriteChar(sz)               'Zeichen als Message ausgeben
>             'Serial_Write(0,sz)             'Zeichen auf der seriellen ausgeben
>
>         Rs232_read(Rs232_read_count) = sz
>         Rs232_read_count = Rs232_read_count + 1
>
>         End If
>     End While
>
>
>       '------------------------------------------
>       '0 bis 3
>       Wertin = byte2float(Rs232_read(0),Rs232_read(1),Rs232_read(2),Rs232_read(3))
>
>       '4 bis 7
>
>       '------------------------------------------
>
> Lab W1:
>
>     Thread_Delay(5) '5x10ms Anzahl von 10ms Ticks, die gewartet werden soll
>
>     End While
> End Sub
>
> Gruss Christian
>

du hattest recht, den Buffer vergrö�ert.
Zusätzlich einen Empfangs und einen Sendebuffer hinzugefügt



    Antwort schreiben


Antworten: