Wenn ich das richtig gesehen habe, willst du an UART2 SNAP verwenden, das mach ich auch und es funktioniert bei mir.
Hier meine SNAP sende/empfangsroutine:
Code:
' Send packet including the preamble and SYNC byte
Printbin #2 , Preamble ; Sbyte ; Hdb2 ; Hdb1 ; Dab1 ; Sab1
Printbin #2 , Db8 ; Db7 ; Db6 ; Db5 ; Db4 ; Db3 ; Db2 ; Db1
Printbin #2 , Crc2 ; Crc1
Do
Received = Waitkey(#2)
If Received = 0 Then
Slave = ""
Exit Function
End If
If Received = Sbyte_x Then
Inputbin #2 , Hdb2 , Hdb1 , Dab1 , Sab1 , Db8 , Db7 , Db6 , Db5 , Db4 , Db3 , Db2 , Db1 , Crc2 , Crc1 ' Get packet in binary mode
Goto Packet
Else
Preamble = Received
End If
Loop
Damit das Programm nicht ewig wartet, falls ein slave nicht da ist setzte ich einen timout.
Bei deiner Konfiguration von den UARTs bin ich mir nicht sicher.... Für mich wäre logisch zuerst die config zu machen und anschliesend den Port zu öffnen.
Bei mir schaut das so aus:
Code:
$baud1 = 9600
Config Com2 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0 ' MUST MATCH THE SLAVE
Config Print1 = Portd.4 , Mode = Set ' use portb.1 for the direction
Rs485dir Alias Portd.4
Config Rs485dir = Output
Rs485dir = 0 ' go to receive mode
Open "com2:" For Binary As #2
Das ganze ist OHNE Buffer. Die Sachen für RS485 muss man in deinem Fall natürlich weglassen. Wobei ich dir für ein System mit mehreren Slaves RS-485 natürlich nur empfehlen kann.
Achja, beim Slave sollte zwischen Empfangen und Senden eine gewisse Zeit gewartet werden. (z.B. Umschalten der Richtung bei RS-485) Schaden kanns nicht. Ich habe vor dem Senden (Slave) eine Wartezeit von 50ms.
Hier noch die Slave Empfangsroutine MIT Buffer.
Code:
Do
Idle
While _rs_head_ptr0 <> _rs_tail_ptr0 'check the status of the RS232 register
Received = Inkey()
If Received = Sbyte Then
Inputbin Hdb2 , Hdb1 , Dab1 , Sab1 , Db8 , Db7 , Db6 , Db5 , Db4 , Db3 , Db2 , Db1 , Crc2 , Crc1 ' Get packet in binary mode
Gosub Packet
Else
Preamble = Received
End If
Wend
Loop
Gruß Stefan
Lesezeichen