16-bit Messwert einlesen



  • Hallo forum-Community,

    bin noch realtiv neu im "C-Geschäft" und sitze seit ein paar Tagen an einem vermutlich einfachen Problem:
    Ich erfassee mit einem Laser-Sensor Abstandmesswerte, der Sensor kommuniziert über eine zugehörige Schnittstellenkarte (Schnittstelle RS485) und sendet 16-bit Werte, also Werte von 0 bis 65535.
    Die Erfassung erfolgt folgendermaßen:

    messwert=_inp(0x01c6);
    

    Der Empfang funktioniert zwar, er gibt allerdings nur 8-bit Werte aus, also 0 bis 255. Alle anderen Stellen des Wertes gehen offensichtlich verloren.
    Ein Fehler in der Hardware konnte ich ausschließen, da ein vom Hersteller des Sensors mitgeliefertes Testprogramm zur Ausgabe von Messwerten fehlerfrei funktioniert. Leider steht mir vom Testprogramm kein Quellcode zur Verfügung.
    Als Compiler verwende ich Dev-C++. Vorher hatte ich LCC-Win32 verwendet, hatte allerdings in Erfahrung gebracht, dass dieser integer-Variablen nur als 8-bit festlegt. Auch ein "drauf-los-probieren" mit verschiedenen Definitionen der Variable "Messwert" brauchte keinen Erfolg.
    Betriebssystem ist Win98.

    Bin für jeden Tipp dankbar.
    MfG Flo



  • Was für einen Typ hat denn die Variable "messwert"? char enthält 8 Bit, short und int dürften groß genug für deine Bedürfnisse sein.



  • am Variablentyp liegt es anscheinend nicht, hab schon von int über double und long alles versucht.
    Kann es sein, dass ein 16-bit-Wert immer Byteweise gelesen wird und deshalb auch erst entsprechend "ausgewertet" werden muss, bevor man ihn ausgibt ?



  • Wie ist denn die Funktion "_inp()" definiert? Womöglich gibt sie ja nur einen char aus.

    (btw, hast du den Quelltext dieses Testprogramms? Wenn ja, solltest du dir mal ansehen, wie es dort gelöst wurde)



  • der Quellcode des Testprogramms liegt leider nicht vor, scheiß Hersteller-Support 😡 .

    also mittlerweile sehe ich zwei mögliche Gründe für des Prob:
    1. Der Empfang erfolgt byteweise, so dass in einer Subroutine eine Auswertung erfolgen muss, wobei sich bei mir hier gewaltig die Frage "Wie?" anbahnt.

    2. Der Befehl "_inp" liest wirklich nur ein char ein. Gibt es noch andere Befehle zum Einlesen eines Wertes von einer seriellen Schnittstelle?
    Hab in diesem Zusammenhang auch Befehle wie "inportb(adresse)", "inport(adresse)" versucht, diese kennt jedoch mein Compiler nicht. In dem Programm sind übrigens folgende Header inkludiert:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #include <dos.h>
    #include <math.h>
    #include <conio.h>
    #include <time.h>
    #include <windows.h>
    #include <error.h>
    

    Fehlt möglicherweise hier eine entschiedende Datei ?
    Und vorab schon mal vielen Dank für die schnelle Antwort. 🙂



  • Wenn der Hersteller schon keinen Quelltext mitliefert, dann doch sicher eine Dokumentation zur Bedienung der Schnittstelle. Ich vermute, du mußt zwei char's einzeln (möglicherweise mit unterschiedlichen Parameterwerten) per _inp() einlesen und dann über Bit-Manipulationen zusammenkleben:

    char c1=_inp(..);
    char c2=_inp(..);
    
    unsigned short val=(c1<<8)|c2;
    


  • kolleg schrieb:

    messwert=_inp(0x01c6);
    

    probier mal dies wenn du einen 16 bit i/o port lesen willst

    unsigned short messwert = _inpw(0x01c6);
    

    wenn es kein _inpw gibt dann

    unsigned short messwert = _inp(0x01c6) + 256 * _inp(0x01c7);
    

    oder

    unsigned short messwert = 256 * _inp(0x01c6) + _inp(0x01c7);
    


  • tja, so einfach wär´s gewesen.
    mit _inpw funzt es. Sowas kommt wohl dabei raus, wenn sich Fahrzeugtechnik-Ingenieure anmaßen in C was zu programmieren...
    Des war wohl ein klassischer Anfängerfehler von mir.
    Jedenfalls vielen Dank für die schnelle und hilfreiche Unterstützung.


Log in to reply