So, da es eine Gruppenarbeit ist und sich jeder um einen anderen Ansatz zum Auslesen der seriellen Schnittstelle kümmert (damit wir am Ende ein möglichst breites Spektrum an Möglichkeiten zumindest untersucht haben), arbeite ich trotz der gut gemeinten Ratschläge, das Problem mit einer höheren Sprache zu lösen, vorerst weiter mit Assembler (Aber zumindest den vorgeschlagenen Netwide Assembler).

Ich habe dieses Programm geschrieben:
Code:
; ------------------------------
; Empfängt 14 Byte vom Multimeter
; an der seriellen Schnittstelle
; und gibt sie aus.
; ------------------------------


segment stapel stack 
  resb 80h ; 128 Byte für den Stack
  ; (auch wenn er hier nicht gebraucht wird)



segment code

; ------------------------------
; Hauptprogramm
; ------------------------------

..start:
  mov ax, daten
  mov ds, ax

  call initialisieren
  call status_ausgeben
  

  ; Schleife von 13 bis 0
  ; d.h.: 14 Bytes empfangen (siehe Datenformat)
  ; Datenformat des A-4660-Multimeters:
    ; Byte      1 2 3 4 5 6 7 8 9 A B C D E
    ; Beispiel  D C - 1 . 9 9 9 9       V CR (CR: Zeilenumbruch)
 
  mov cx, 000Dh       
  schleife_auslesen:
    ; Status prüfen
      mov ah, 03h
      mov dx, [com1]
      int 14h
      and ah, 00000001b
      cmp ah, 00000001b ; Wenn Daten vorhanden sind ...
      je empfangen ; ... direkt empfangen, sonst ...
      call d_senden ; ... "D"-Befehl senden.
    empfangen:
      call zeichen_empfangen
      call zeichen_ausgeben
  loop schleife_auslesen


  ; Beenden
  mov ah, 4Ch
  int 21h
  
; Ende des Programmes  



; ------------------------------
; Unterprogramme
; ------------------------------  
  
initialisieren:
  mov ax, 0000h
  mov dx, [com1]
  mov al, 10100111b
  ; Konfigurationsbyte
    ; Zeichenkodierung: 7 bit >> 10
    ; Stoppbits: 2            >> 1
    ; Parität: None           >> 00
    ; Durchsatz: 9600 bit/s   >> 111
  int 14h
  ret


status_ausgeben:
  mov ah, 03h
  mov dx, [com1]
  int 14h
  mov dl, ah
  mov ah, 02h
  int 21h
  ret


zeichen_empfangen:
  ; Zeichen empfangen
  mov dx, [com1]
  mov ax, 0000h
  mov ah, 02h
  int 14h
  mov [zeichen], al
  ret


zeichen_ausgeben:
  mov dx, [com1]
  mov dl, [zeichen]
  mov ah, 02h
  int 21h
  ret


d_senden:
  mov ah, 01h
  mov al, 44h ; ASCII für "D"
  mov dx, [com1]
  int 14h
  ret
  
  
  
; ------------------------------
; Variablen
; ------------------------------

segment daten
  zeichen db 00h  ; Zum Zwischenspeichern eines empfangenen Bytes
  com1 dw 0000h
Es überprüft, ob an der seriellen Schnittstelle Daten vorhanden sind und gibt sie aus. Wenn keine Daten vorhanden sind, wird der "D"-Befehl an das Gerät geschickt, der nach dem >> Informationsblatt des Gerätes (PDF, ~600 kB), (siehe Seite 3) die Datenübertragung aktivieren soll.

Allerdings werden neben dem Status der seriellen Schnittstelle keine Daten ausgegeben, sondern nur "D"s, bzw, wie ich inzwischen herausgefunden habe, das, was gerade im AL-Register (und damit wegen einer Zuweisung in der Variable "zeichen") steht, in ASCII. Dabei sollte die Funktion "zeichen_empfangen" eigentlich das an der Schnittstelle vorhandene Zeichen in AL speichern (siehe >> Interrupt 14).

Ist das Gerät kaputt (die Anzeige am Gerät selber funktioniert noch problemlos und richtig, es ist eben nur ein bischen älter) oder habe ich irgendetwas falsch gemacht?