Mit diesem Programmbeispiel in Visual Basic 2008 Express sehen Sie wie das I2C-Modem über die serielle Schnittstelle angesprochen werden kann.
Das Programmierpaket kann auf der Microsoft Visual Studio 2008 Express Editions Seite kostenlos heruntergeladen und frei verwendet werden.
VB 2008 Express Quellcode für I2C-Modem
Imports System.IO.Ports
Public
Class Form1
Private WithEvents
MODEM_COM As
IO.Ports.SerialPort
Dim
Kommando(18) As Byte
'I2C-Modem Kommando
Dim
Antwort(18) As Byte
'Antwort vom I2C-Modem
Dim
LM75 As Boolean
'Temperaturwert lesen
Private Sub
Form1_Load _
(ByVal
sender As
System.Object, _
ByVal
e As
System.EventArgs) Handles MyBase.Load
'Treadübergreifende Zugriffe erzeigen keinen Fehler
CheckForIllegalCrossThreadCalls = False
'Combo-Box löschen
Combo_COM.Items.Clear()
'vorhandene serielle Schnittstellen in Combo-Box eintragen
For Each
sp As String In
My.Computer.Ports.SerialPortNames
Combo_COM.Items.Add(sp)
Next
If
Combo_COM.Items.Count = 0 Then
'Meldung wenn keine Schnittstelle gefunden wurde
MsgBox("Keine serielle Schnittstelle gefunden")
Else
'oder erste selektieren
Combo_COM.SelectedIndex = 0
'COM-Port für Modem-zugriff deklarieren
MODEM_COM = New
SerialPort
End If
'Combo-Boxen auf ersten Wert einstellen
Combo_WRITE_ADR.Text = "64"
Combo_READ_ADR.Text = "65"
ComboBox_LM75_ADR.Text = "144"
End Sub
Private Sub Button_VERBINDEN_Click _
(ByVal
sender As
System.Object, _
ByVal
e As
System.EventArgs) Handles Button_VERBINDEN.Click
'I2C-Modem mit dem PC über RS232 verbinden
'und Schaltflächen einblenden
If
Me.MODEM_COM.IsOpen = False Then
'COM-Port öffnen
With
MODEM_COM
.Encoding = System.Text.Encoding.GetEncoding(28591)
.PortName = Combo_COM.Text 'COM-Nummer
.BaudRate = 19200 '19200 Baud
.DataBits = 8 '8 Datenbits
.StopBits = IO.Ports.StopBits.One '1 Stopbit
.Parity = IO.Ports.Parity.None 'n Parity
.WriteTimeout = 500
.ReadTimeout = 500
'1Byte im Eingangspuffer löst DataReceived Event aus
.ReceivedBytesThreshold = 1
End With
MODEM_COM.Open()
Label_COM_Status.Text = "verbunden"
Label_COM_Status.BackColor = Color.LightGreen
Button_VERBINDEN.Text = "trennen"
Button_IDENT.Enabled = True
Button_VERSION.Enabled = True
Button_STATUS.Enabled = True
Button_READ.Enabled = True
Button_WRITE.Enabled = True
Button_LM75.Enabled = True
Call
Check_CTS(MODEM_COM) 'CTS prüfen
Else
'COM-Port schließen
MODEM_COM.Close()
Label_COM_Status.Text = "getrennt"
Label_COM_Status.BackColor = Color.LightCoral
Button_VERBINDEN.Text = "verbinden"
Button_IDENT.Enabled = False
Button_VERSION.Enabled = False
Button_STATUS.Enabled = False
Button_READ.Enabled = False
Button_WRITE.Enabled = False
Button_LM75.Enabled = False
Label_IDENT.Text = "??"
Label_IDENT.BackColor = Label_VERSION.BackColor
Label_VERSION.Text = "??"
Label_Status_SDA.BackColor = Color.White
Label_Status_SCL.BackColor = Color.White
Label_Status_INT.BackColor = Color.White
Label_STATUS_MODEM.BackColor = Label_VERSION.BackColor
Label_STATUS_MODEM.Text = "0"
Label_BYTES.Text = "0 Bytes empfangen"
End If
End Sub
Private Sub MODEM_COM_PinChanged(ByVal
sender As Object
, _
ByVal
e As
System.IO.Ports.SerialPinChangedEventArgs) _
Handles MODEM_COM.PinChanged
Select Case
e.EventType
Case
IO.Ports.SerialPinChange.Break
Case
IO.Ports.SerialPinChange.CDChanged
Case
IO.Ports.SerialPinChange.CtsChanged
' Der Zustand des CTS-Signals (Clear to Send)
' hat sich geändert. Beim I2C-Modem ist
' dies der INT einer angeschlossenen Eingabekarte
Call
Check_CTS(sender)
Case
IO.Ports.SerialPinChange.DsrChanged
Case
IO.Ports.SerialPinChange.Ring
End Select
End Sub
Private Sub Check_CTS(ByVal
sender)
'CTS-Signal überprüfen
If
(DirectCast(sender, SerialPort).CtsHolding) Then
Label_Status_INT_AUTO.BackColor = Color.Red
Else
Label_Status_INT_AUTO.BackColor = Color.White
End If
End Sub
Private Sub Button_IDENT_Click_1 _
(ByVal
sender As
System.Object, _
ByVal
e As
System.EventArgs) Handles Button_IDENT.Click
'Befehl 16: IDENT
'Modem sendet I2C-OK. Dieser Befehl kann dazu verwendet
'werden, das I2C-Modem an der 'RS232 zu erkennen.
'Empfängt das I2C-Modem 'diesen Befehl,
'wird ein Datenbyte generiert,
'in dem die Bits 6 und 7 gesetzt sind. (192 dez)
Kommando(0) = 16
MODEM_COM.BaseStream.Write(Kommando, 0, 1)
Timer1.Start() 'Timer zur Überwachung starten
End Sub
Private Sub Button_STATUS_Click_1 _
(ByVal
sender As
System.Object, _
ByVal
e As
System.EventArgs) Handles Button_STATUS.Click
'Befehl 48: STATUS
'liest er die Zustände der Leitungen SDA, SCL und INT aus.
'Diese werden zusammen mit einem OK in einem
'Byte an den PC zurückgesendet.
Kommando(0) = 48
MODEM_COM.BaseStream.Write(Kommando, 0, 1)
Timer1.Start() 'Timer zur Überwachung starten
End Sub
Private Sub StatusBits(ByVal
ST As Byte
)
' Auswerten des Status-Bytes
If
(ST And
1) > 0 Then
Label_Status_SDA.BackColor = Color.Green
Else
Label_Status_SDA.BackColor = Color.White
End If
If
(ST And
2) > 0 Then
Label_Status_SCL.BackColor = Color.Yellow
Else
Label_Status_SCL.BackColor = Color.White
End If
If
(ST And
4) > 0 Then
Label_Status_INT.BackColor = Color.White
Else
Label_Status_INT.BackColor = Color.Red
End If
End Sub
Private Sub Button_VERSION_Click_1 _
(ByVal
sender As
System.Object, _
ByVal
e As
System.EventArgs) Handles Button_VERSION.Click
'Befehl 80: VERSION
'Das I2C-Modem antwortet mit zwei Byte.
'Werden die Bytes in der Reihenfolge zusammengesetzt
'so ergibt sich die Versionsnummer der geladenen Firmware
Kommando(0) = 80
MODEM_COM.BaseStream.Write(Kommando, 0, 1)
Timer1.Start() 'Timer zur Überwachung starten
End Sub
Private Sub Button_READ_Click_1 _
(ByVal
sender As
System.Object, _
ByVal
e As
System.EventArgs) Handles Button_READ.Click
'Befehl 128: READ
'Mit dem Befehl werden 1-16 Bytes vom I2C-Bus ausgelesen
Kommando(0) = 128 'Kommando 128 = Lese 1 Byte
Kommando(1) = Combo_READ_ADR.Text 'Slave Adresse
'2Bytes zum Modem senden
MODEM_COM.BaseStream.Write(Kommando, 0, 2)
Timer1.Start() 'Timer zur Überwachung starten
End Sub
Private Sub Button_WRITE_Click_1 _
(ByVal
sender As
System.Object, _
ByVal
e As
System.EventArgs) Handles Button_WRITE.Click
'Befehl 64: WRITE
'Mit dem Befehl werden 1-16 Bytes zum I2C-Bus geschrieben
Kommando(0) = 64 'Kommando 64 = Schreibe 1 Byte
Kommando(1) = Combo_WRITE_ADR.Text 'Slave Adresse
If
CheckBox_WRITE_INVERS.Checked = False Then
Kommando(2) = TextBox_WRITE.Text 'Wert der übertragen wird
Else
Kommando(2) = 255 - TextBox_WRITE.Text 'Wert invertieren
End If
'3Bytes zum Modem senden
MODEM_COM.BaseStream.Write(Kommando, 0, 3)
Timer1.Start() 'Timer zur Überwachung starten
End Sub
Private Sub Button_LM75_Click_1 _
(ByVal
sender As
System.Object, _
ByVal
e As
System.EventArgs) Handles Button_LM75.Click
'Befehl 128+1: READ 2 Bytes
'Mit dem Befehl werden 1-16 Bytes vom I2C-Bus ausgelesen
Kommando(0) = 129 'Kommando 129 = Lese 2 Byte
Kommando(1) = ComboBox_LM75_ADR.Text 'Slave Adresse LM75
'2Bytes zum Modem senden
MODEM_COM.BaseStream.Write(Kommando, 0, 2)
Timer1.Start() 'Timer zur Überwachung starten
LM75 = True
' Temperatur wurde ausgelesen
End Sub
Private Sub LM75_TEMPERATUR(ByVal
BY1 As Byte
, ByVal
BY2 As Byte
)
Dim
Wert
If
(BY1 And
128) = False Then
Wert = BY1 'Temperatur Vorkomma >= 0°C
Else
Wert = BY1 - 255 'Temperatur Vorkomma < 0°C
End If
If
BY2 And
128 Then
Wert = Wert + 0.5
End If
TextBox_LM75.Text = Format(Wert, "##,##0.00 °C")
End Sub
Private Sub MODEM_COM_DataReceived(ByVal
sender As Object
, _
ByVal
e As
System.IO.Ports.SerialDataReceivedEventArgs) _
Handles MODEM_COM.DataReceived
Dim
I As Integer
Dim
Wert As Byte
Timer1.Stop()
'Thread 50 ms anhalten bis alle Daten eingelaufen sind
System.Threading.Thread.Sleep(50)
If
MODEM_COM.BytesToRead > 0 Then
If
MODEM_COM.BytesToRead = 1 Then
Label_BYTES.Text = MODEM_COM.BytesToRead & " Byte emfpangen"
Else
Label_BYTES.Text = MODEM_COM.BytesToRead & " Bytes emfpangen"
End If
For
I = 0 To
MODEM_COM.BytesToRead - 1
Wert = MODEM_COM.BaseStream.ReadByte
Antwort(I) = Str$(Wert)
Next
Select Case
Kommando(0)
Case
16 'Befehl 16: IDENT
Call
STATUS() 'Status übernehmen
If
Antwort(0) = 192 Then
Label_IDENT.Text = "ok"
Label_IDENT.BackColor = Color.LightGreen
Else
Label_IDENT.Text = "FEHLER"
Label_IDENT.BackColor = Color.LightCoral
End If
Case
48 'Befehl 48: STATUS
Call
StatusBits(Antwort(0)) 'Statusbits auswerten
Case
80 'Befehl 80: VERSION
Label_VERSION.Text = Antwort(0) & "." & Antwort(1)
Case
64 To
79 'Befehl 64..79: WRITE bis zu 16 Bytes
Call
STATUS() 'Status übernehmen
Case
128 To
143 'Befehl 128..143: READ bis zu 16 Bytes
Call
STATUS() 'Status übernehmen
If
LM75 = False Then
'gelesener Wert eintragen
TextBox_READ.Text = Antwort(1)
Else
LM75 = False
'Temperatur eintragen
Call
LM75_TEMPERATUR(Antwort(1), Antwort(2))
End If
End Select
End If
End Sub
Private Sub STATUS()
Dim
Fehler As Boolean
'Farbumschlag für Fehlernummer
Fehler = Not
Antwort(0) And
128
If
Fehler Then
Label_STATUS_MODEM.BackColor = Color.LightCoral
Else
Label_STATUS_MODEM.BackColor = Color.LightGreen
End If
'Statusbyte in Feld kopieren
Label_STATUS_MODEM.Text = Antwort(0)
'Statusbits rangieren
CheckBox_STATUS_0.Checked = Antwort(0) And
1
CheckBox_STATUS_1.Checked = Antwort(0) And
2
CheckBox_STATUS_2.Checked = Antwort(0) And
4
CheckBox_STATUS_3.Checked = Antwort(0) And
8
CheckBox_STATUS_4.Checked = Antwort(0) And
16
CheckBox_STATUS_5.Checked = Antwort(0) And
32
CheckBox_STATUS_6.Checked = Antwort(0) And
64 And
Fehler
End Sub
Private Sub LinkLabel1_LinkClicked _
(ByVal
sender As
System.Object, _
ByVal
e As
System.Windows.Forms.LinkLabelLinkClickedEventArgs) _
Handles LinkLabel1.LinkClicked
'Aufruf der Internetseite "www.horter.de" über den Standard-Browser
System.Diagnostics.Process.Start("http://horter.de")
End Sub
Private Sub Timer1_Tick(ByVal
sender As
System.Object, _
ByVal
e As
System.EventArgs) Handles Timer1.Tick
'Wenn nicht innerhalb 500ms eine Antwort vom Modem kommt
' wird ein Fehler ausgegeben
Timer1.Stop()
MsgBox("Keine Antwort vom I2C-Modem")
End Sub