RS-232 Schnittstelle



  • Ist da irgendwo eine Frage darin versteckt? Das ist doch nur eine Aussage...



  • Indirekt schon 😉 Habe keine Ahnung was er meint, bzw. gemacht hat, damit er mehr als einen Port verwenden kann?!? Wie kann ich die Events der 4 RS-232 portselektiv gestalten?



  • Du hättest mal zu Ende lesen sollen.

    I am using 4 serial ports to receive and transmit to 4 devices. I have extended the CSerialEx class as my application is Win32 Console application, running on Windows 98. I have masked the class the set an event of reception of an event character, 0x0a. The data from the devices comes in about every half a second and is about 100 to 150 bytes long.

    The problem. Everything runs pretty good except that sometimes the data received from one port( device ) gets mapped to data from another port. For example, data supposedly from port 3, gets read in from port 4. It is as if, the ports are not unique and independent sometimes.

    Does any one know how to resolve this?

    Found the problem...in the demo app. where the data is read in(below), the array abBuffer is declared as static. The price you pay for just copyiong and pasting i guess

    // Read data, until there is nothing left
    DWORD dwBytesRead = 0;
    BYTE abBuffer[100];
    do
    {
    // Read data from the COM-port
    serial.Read(abBuffer,sizeof(abBuffer),&dwBytesRead);
    if (dwBytesRead > 0)
    {
    // TODO: Process the data
    }
    }
    while (dwBytesRead == sizeof(abBuffer));

    Frage ist da auch keine drin versteckt. Ich denke aber, dass es Dein Problem trotzdem nicht löst. Hast Du das mal mit den verschiedenen Views ausprobiert?

    Es steht ja jetzt immer noch die Frage im Raum ob man eine Nachrichtenbehandlungsroutine schreibt und in der dann rausfinden muss, von welcher Schnittstelle die Message kommt oder durch unterwschiedliche Messages verschiedene Routinen bedient werden.



  • Prinzipiell wäre es mir egal, von welchem Port die Daten kommen! Anhand der Message (header) kann ich den Port nachträglich identifizieren. Nun kann ich an alle COM-Ports senden, aber nur von COM1 empfangen, d.h. nur bei COM1 wird ein Event ausgelöst. Kann ich die anderen 3 Ports über die gleiche Schiene laufen lassen?



  • Warum nicht? Du musst einfach nur drei Instanzen der CSerialMFC erzeugen...



  • Sorry, habe nur von COM1 gelesen!! Mein Fehler! Was passiert eigentlich, wenn sich das Event von COM1 und COM2 überschneiden? Können Daten verloren gehen? Arbeite mit 115200Baud!!



  • Warum sollen da Daten verloren gehen? Die Events kommen ja bei Dir nacheinander an...



  • Ich habe 2 GPS Empfänger mit jeweils 2 COM Ports! Auf jedem PORT gebe ich eine bestimmt Message (v, Position, etc.) aus, d.h. das alle 4 Ports im 10Hz/100Hz Takt Daten an mich schicken. Wenn ich mit RTS/CTS übertrage, sollte es keine Probleme geben, oder?



  • daMike schrieb:

    Wenn ich mit RTS/CTS übertrage, sollte es keine Probleme geben, oder?

    kommt drauf an. wenn deine datenquellen schneller senden als du's abholst ist flusskontrolle ein 'muss', wenn du schneller bist brauchste es nicht. windoofs puffert rs232 daten. die puffergrösse kannste einstellen mit 'SetupComm' und den momentanen füllstand bekommste mit 'ClearCommError'.



  • Hey, nach längerer Zeit wieder eine Frage zur seriellen Schnittstelle ..

    Daten empfangen und senden funktioniert .. sobald ich aber einen anderen Prozess anstoße, wird dieser durchgearbeitet und die Prozessorlast geht sofort auf 100%.
    Ich empfange Daten im 1Hz Takt mit einer Messagelänge von ca. 150Byte! Schätze mal, dass der Header der ankommenden Daten nach FIFO Prinzip unbearbeiten durch den Buffer geschoben wird und meine Event-Routine

    OnSerialMsg

    dann vergeblich versucht aus den restlichen Daten schlau zu werden! Manchmal fängt sich die Event-Routine wieder .. evtl. davon abhängig wo er nach der Berechnung datenmäßig einsteigt?!?

    Kann man paralle Berechnungen mit "niedriger Priorität" versehen, dass immer die COM Schnittstellendaten sauber behandelt werden, d.h. nur wenn keine Daten ankommen die prallele Berechnung durchgeführt/vorgesetzt wird??

    Gruß
    daMike



  • Ich verstehe Dein Problem nicht ganz...
    Du musst ja irgendwie erkennen, wann Deine Nachricht beginnt... die Daten kommen ja meistens nicht gemeinsam an, sondern in mehreren "Happen"...

    Was das allerdings mit der Prozessorlast zu tun haben soll verstehe ich nicht ganz...



  • Hi, also ...

    normalerweise sollte je Message sowas kommen ..

    PS007aödjfaksdfassdjfölasksd_GT009fölak_PV043ssjdföasdfsadffd

    also immer mit PS beginnend! Funktioniert auch, solange ich nichts anderes machen!
    Sobald ich jedoch einen anderen Prozess anstoße, z.B. Button drücken um eine Berechnung ausführen zu lassen, erhalte ich nur noch ein Fragment der Nachricht! Soll heißen, ich lese zwar 200Byte ein, aber der Inhalt spiegelt nicht mehr eine einzelne Message wieder sondern (vermutlich) zwei überlappende Messages! Manchmal bekomme ich auch nur sowas ..

    ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ....ÜÜÜÜÜÜÜÜ

    Wo das herkommt ...? Die Quelle spuckt immer die gleichen Messages aus!



  • guck mal meinen vorletzten beitrag (4 höher)



  • Stimmt .. das Thema hatten wir schon mal 😉 Kannst Du mir mal zeigen, wie man diese beiden Methoden einsetzt .. Beispiel?

    Habe insgesamt 4 COM Ports, welche ich wie folgt angelegt haben ...

    // Globale Deklaration
    CSerialMFC serial1;
    CSerialMFC serial2;
    CSerialMFC serial3;
    CSerialMFC serial4;
    
    SetupComm(????,800,16);
    
    ClearCommError(??,??,??);
    

    Wie geht man da am besten vor, um eine Flusskontrolle einzurichten??

    Besten Dank!



  • es geht z.b. mit 'SetCommState' über eine DCB struct. damit kannste dem comm treiber mitteilen, welche art von flusskontrolle er benutzen soll. guckst du: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/devio/base/modification_of_communications_resource_settings.asp



  • sorry, verstehe nur Bahnhof ..

    Beim öffnen des Ports wird ohnehin

    serial4.SetupHandshaking(CSerialMFC::EHandshakeHardware);
    

    ausgeführt! Somit habe ich eine Hardware Flusskontrolle, oder?



  • sieht so aus. vielleicht haste RTS/CTS nicht angeschlossen?



  • .. schon, sonst würde ja auch die Demo-Software zu meinen Boards nicht
    funktionieren .. Wie groß ist der Input Buffer des COM Ports, wenn er auf Maxium gestellt ist? Kann man da 200Byte zwischenlagern?



  • du kannst die buffers mit 'SetupComm' einstellen. es geht auch viel mehr als 200 bytes.

    btw: dass deine demo software funzt heisst ja nicht zwangsläufig dass die flusskontrolle geht.



  • .. habe immer noch keine Ahnung, wie ich bei den 4 Ports via SetupComm() die Eingangspuffer verändern kann??? Mein C++/Schnittstellenverständiss ist ohnehin schon ziemlich ausgeschöpft .. 😕


Anmelden zum Antworten