DMX läuft mit

250000 8n2 ... die 2 Stopbit sind wichtig.
Vom Quarz her hab ich dann 16MHz genommen, 8 gehn aber auch
Bei der Baudrate sind die "runden" Taktraten besser, da weniger
Fehler.
Als zusätzlichen Indikator kann man auch den ersten Frame
noch dazunehmen, der 0 sein sollte.
also Frame Error und nächstes byte ist null, dann Anfang

ist zwar bascom, aber mit dem code hab ich gearbeitet mit dmx
für nen Dimmer:

Code:
' #######################################
' DAS IST DER CODE !!!!!!

$regfile = "m8def.dat"
$crystal = 16000000
$baud = 250000
Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 2 , Databits = 8


Dim Timeout_counter As Byte , X As Byte , Y As Byte , Z As Byte , Fe_error As Byte
Dim Adresse As Byte , Adresse2 As Byte , Pointer As Byte At &H82
Dim Timercounter As Byte , Flag As Byte , Summe_pwm As Word
Dim Pwm_werte(5) As Byte
Dim Rotation_byte As Byte , Rotation_zaehler As Byte

On Urxc Zeichenempfang
Enable Urxc

Const Pwm_teiler = 255 / 46

Config Int0 = Falling
On Int0 Nulldurchgang
Enable Int0

Config Timer0 = Timer , Prescale = 64
On Timer0 Timer_irq
Const Timervorgabe = 220
Enable Timer0

Enable Interrupts
Config Portd.2 = Input
Config Portb = Output
Config Portc = Input
' interne Pullups an
Portc = &HFF

485_rw Alias Portc.6
Config 485_rw = Output
485_rw = 0

Led Alias Portb.0

Adresse = 24
'Adresse = Pinc
'Adresse = Not Adresse
'Adresse = Adresse And &B00111111
'Adresse = Pinc
Adresse2 = Adresse

Shift Adresse , Left , 2

For Z = 1 To 4
   Pwm_werte(z) = 2
Next

Rotation_byte = &B10001000

Do
   If Flag = 1 Then
      Flag = 0
      Y = Pointer
      Shift Y , Right , 2
      If Y = Adresse2 Then
         Y = Pointer
         Y = Y And &B00000011
         Incr Y
         Summe_pwm = Summe_pwm + X
         Pwm_werte(y) = X / Pwm_teiler
         Pwm_werte(y) = 49 - Pwm_werte(y)
      End If
   End If

   If Summe_pwm = 1020 Then
      If Rotation_zaehler > 30 Then
         Rotation_zaehler = 0
         Rotate Rotation_byte , Right , 1
      End If

      For Y = 1 To 4
          If Rotation_byte.y = 0 Then
             Pwm_werte(y) = 60
          End If
      Next
   End If

    If Timercounter < 48 Then
       If Pwm_werte(1) <= Timercounter Then
         Set Portb.1
       Else
         Reset Portb.1
       End If
       If Pwm_werte(2) <= Timercounter Then
          Set Portb.2
       Else
          Reset Portb.2
       End If
       If Pwm_werte(3) <= Timercounter Then
          Set Portb.3
       Else
          Reset Portb.3
       End If
       If Pwm_werte(4) <= Timercounter Then
         Set Portb.4
       Else
         Reset Portb.4
       End If
    End If
    Waitus 10
    Portb = 0

   If Timeout_counter > 150 Then
     For Z = 1 To 4
         Pwm_werte(z) = 100
     Next
     Summe_pwm = 0
   End If
Loop
End

Zeichenempfang:
   X = Udr
   If Fe_error = 1 And X = 0 Then
        Fe_error = 0
        Pointer = 0
        Summe_pwm = 0
   End If
   If Ucsra.fe = 1 Then
        Fe_error = 1
        Ucsra.fe = 0
   End If
   Incr Pointer
   Flag = 1
   'Toggle Led
   Timeout_counter = 0
Return
End

Nulldurchgang:
   Timercounter = 0
   Incr Timeout_counter
   Incr Rotation_zaehler
Return
End

Timer_irq:
  Timer0 = Timervorgabe
  Incr Timercounter
Return
End