Hi, ich habe selber auch mehrere Geräte mit Serieller verbindung an ein
Mega32 angeschlossen, mit den Unterschied das die abholung kritisch ist,
weil die Geräte selber senden, und nicht auf anfrage warten.
Ich hatte auch selber ganz lange nach Beiträge mit SUART gesucht und
wirklich nichts dazu gefunden. Die Hardware Uart war schon belegt mit
der Kommunikation zwischen PC und µC
1 | $crystal = 14745600 ' used crystal frequency
|
2 | Config Timer1 = Timer , Prescale = 8
|
3 | On Timer1 Timer1_isr
|
4 | Enable Timer1
|
5 |
|
6 |
|
7 | Open "COMD.5:9600,8,n,1" For Input As #1 'Tr_RxD (lesen) Pin PortD.5
|
8 | Open "COMD.3:9600,7,e,1" For Input As #2 'SC_RxD (lesen) Pin PortD.3
|
9 | Open "COMD.2:9600,8,n,1" For Input As #3 'Tr2_RxD (lesen) Pin PortD.2
|
10 |
|
11 |
|
12 | Timer1_isr: 'Timeraufruf Timer1
|
13 | Timer1 = 65499 'reload Timer1 for a Period of 20ns
|
14 | Tsbyte = Inkey(#2) 'einzelnes Zeichen von Gerät2 gelesen
|
15 | If Tsbyte <> 0 and Gelesen2 = 0 Then
|
16 | If Tsbyte = 13 Then
|
17 | Incr It_sc
|
18 | Bt_sc(it_sc) = 0
|
19 | Decr It_sc
|
20 | Gelesen2 = 1
|
21 | Elseif Tsbyte > 31 Then 'Nach Gültige Ascii Zeichen prüfen (Keine Befehlszeichen)
|
22 | If 19 > It_sc Then 'Max 19 Zeichen einlesen
|
23 | Incr It_sc
|
24 | Bt_sc(it_sc) = Tsbyte
|
25 | Else
|
26 | St_sc = ""
|
27 | It_sc = 0
|
28 | End If
|
29 | Else
|
30 | St_sc = ""
|
31 | It_sc = 0
|
32 | End If
|
33 | End If
|
34 |
|
35 | '*****************************
|
36 | ' Hier hat Gerät1 vorrang gegenüber Gerät3
|
37 | '*****************************
|
38 |
|
39 | Tsbyte = Inkey(#1) 'einzelnes Zeichen von lesegerät1 gelesen
|
40 | If Tsbyte = 0 And Readtrans = 0 Then
|
41 | Tsbyte = Inkey(#3) 'einzelnes Zeichen von lesegerät3 gelesen
|
42 | Elseif Tsbyte <> 0 Then
|
43 | If Readtrans = 0 Then
|
44 | St_tr = ""
|
45 | It_tr = 0
|
46 | End If
|
47 | Readtrans = 2
|
48 | End If
|
49 | If Tsbyte <> 0 Then
|
50 | If Tsbyte = 13 Then
|
51 | If It_tr = 11 And Tr_voll = 0 Then
|
52 | Tr_voll = 1
|
53 | B_tr(12) = Bt_tr(11)
|
54 | Bt_tr(11) = 0
|
55 | Trannum = 0
|
56 | If Readtrans = 0 Then Trannum = 1
|
57 | S_tr = St_tr
|
58 | End If
|
59 | St_tr = ""
|
60 | It_tr = 0
|
61 | Elseif 71 > Tsbyte And Tsbyte > 47 Then ' Und es zwischen Ascii 0 und Ascii F/f liegt
|
62 | If 11 > It_tr Then
|
63 | Incr It_tr
|
64 | Bt_tr(it_tr) = Tsbyte
|
65 | Else
|
66 | St_tr = ""
|
67 | It_tr = 0
|
68 | End If
|
69 | End If
|
70 | End If
|
71 | Return
|
Das ist jetzt nur ein ausschnitt aus den Code den ich geschrieben habe
um von 3 verschiedene Geräte gleichzeitig die Information zu lesen, die
laufen zwar alle auf 9600, aber wenn man das einmal ändert bleibt das
auch dann z.b. auf 19200.
Man weis ja jetzt nicht ob du noch Pins frei hast, wie du die Geräte
anschliesst und sowas. Wenn es bei dir nicht so Zeit Kritisch ist, musst
du nicht den Timer nehmen,
Die Geräte kannst du ja so einstellen das sie auf 2 Leitung achten
Dann nimmst du einfach 2 Pins von Mega32 und benutzt diese als
Multiplexer
PinA 0 0 1 1
PinB 0 1 0 1
Gerät 1 2 3 4
Zusatz:
PINC = 1 => Jetzt Senden!
dann senden die einfach auf den Uart, so brauchst du nur die 3 Empfangs
SUART einrichten. So hast du mit 6-7 Pins alle Geräte angeschlossen,
Sonst könntest du ja auch versuchen alle auf 1 Pin anzuschliessen und
mit 3-4 Pins zu steuern, wobei nur 1 Pin der Emfangsport ist.