PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [VB o VC] Daten an Com Schnittstelle ausgeben


DraconiX
2010-12-09, 08:58:25
Hiho,

ich kann zwar assembler und C für µC programmieren aber in der PC Richtung sieht es mau aus :D

Wie kann ich denn Daten an einen UART ausgeben? Ob nun Visual Basic oder Visual C spielt keine Rolle, lese mich gerne in beide ein. In Visual Basic wird der Aufwand wohl nicht ganz so groß sein.

Jemand Literatur Hinweise?

Hintergrund: ich möchte eine Temperatur in Hex Werten jede Sekunde von dem PC an einen µC (Atmega64) senden.

Jonny1983
2010-12-09, 12:09:19
Wenn ich zu Hause bin, dann schick ich dir mal VB Quellcode zu.
Habe einen ATMega64 als Tranceiver genutzt, der als Programmieradapter diente, um viele weitere ATMegas über den CAN-Bus mit Hilfe eines selbstgeschriebenen Booloaders zu programmieren.

Die Kommunikation soll in beide Richtungen funktionieren ja?
Ereignisgesteuert oder rein Zeitgesteuert oder beides gemischt?
Nutzt du einen USB-Seriell-Converter?

DraconiX
2010-12-09, 12:38:51
Wenn ich zu Hause bin, dann schick ich dir mal VB Quellcode zu.
Habe einen ATMega64 als Tranceiver genutzt, der als Programmieradapter diente, um viele weitere ATMegas über den CAN-Bus mit Hilfe eines selbstgeschriebenen Booloaders zu programmieren.

Die Kommunikation soll in beide Richtungen funktionieren ja?
Ereignisgesteuert oder rein Zeitgesteuert oder beides gemischt?
Nutzt du einen USB-Seriell-Converter?


Die Kommunikation soll bloß in eine Richtung funktionieren PC -> µC, solltest du jedoch in deinem Beispiel auch des Empfangen von Daten haben, wäre ich nicht böse darüber :D Es wird wohl rein Zeitgesteuert.

Du hast mehrere ATMegas gleichzeitig programmiert?! Das funktioniert :freak: Wie hast du das mit den Timings in den Griff bekommen?!

Am Testrechner kommt ein selbstgebauter USB UART Wandler zum Einsatz (Auf Basis eines FDT232R) - am Endgültigen Rechner kommt er direkt via RS232 an das Gerät.

Jonny1983
2010-12-10, 00:36:01
Du hast mehrere ATMegas gleichzeitig programmiert?! Das funktioniert :freak: Wie hast du das mit den Timings in den Griff bekommen?!

Es waren mehrere ATMegas am CAN-Bus angeschlossen und jeder hatte seine eigene Adresse die im EEPROM abgelegt war. Im CAN-Bus alle Adressen abgefragt und jeder Atmel meldete sich entsprechend mit seinem EEPROM Inhalt.
Natürlich muss man vorher jeden µC vorher mit einem Bootloader versehen und das EEPROM mit gewünschten werten befüllen.
Gleichzeitig habe ich nicht alle programmiert, weil ich Sicherheitsroutinen eingebaut habe, die die korrekte Übertragung überprüften. Ohne diese Routine, würde man blind alle Daten rausfeuern und hoffen, dass jeder µC auch alles schnell genug verarbeiten konnte. Aber möglich wärs. Man muss die Zeit mit einem Ooszilloskop messen wie schnell der Atmel einen Speicherblock befüllt. Dann würde man entsprechend Sendepause bei VB einbauen.

Am Testrechner kommt ein selbstgebauter USB UART Wandler zum Einsatz (Auf Basis eines FDT232R)

Habe ich auch genutzt. Mit einer Baudrate von 1.250.000 bei 20MHz Takt beim Atmel, also das maximum.

Den Code kann ich dir jetzt Blind nicht geben, muss diesen anpassen, weil es ein Teil meiner Diplomarbeit war und natürlich 5 Jahres-Sperrfrist für das Teil gibt. Code stammt aber von mir. Möchte ich natürlich nicht 1:1 rausgeben.
Sonntag hätte ich Zeit dafür. Heute gabs ne Geburtstagsfeier bis eben und morgen steht ne Weihnachtsfeier an. Also bitte ein bisschen Geduld.

Hier schon mal der Ansatz(das meiste um empfangene Daten zu verarbeiten. Daten senden geht mit SerialPort.Write(einevariable + vbCr), vorher halt einen COM-Port öffnen. Timer Funktion kannst du googlen, ist ganz einfach.):


Dim x(10) As Byte
Private Delegate Sub DSub()
Private datenlesen As New DSub(AddressOf SerielleDatenVerarbeiten)
........
Private Sub Form1_Load() Handles MyBase.Load
For i As Byte = 0 To My.Computer.Ports.SerialPortNames.Count - 1
ComboBox_COMPort.Items.Add(My.Computer.Ports.SerialPortNames(i))
Next
Label_COMPort.Text = My.Computer.Ports.SerialPortNames.Count & " Port(s) gefunden"
End Sub

Private Sub Button_COMopen_Click() Handles Button_COMopen.Click
If SerialPort.IsOpen = True Then
Label_COMPort.Text = ComboBox_COMPort.Text & " bereits offen"
Else
SerialPort.PortName = ComboBox_COMPort.Text
SerialPort.ReceivedBytesThreshold = 10 'Das sagt aus, dass der COM-Port solange auf Daten warten soll bis 10 Byte angekommen sind. Erst dann soll eine weiterverarbeitung erfolgen.
SerialPort.Open()
SerialPort.DiscardInBuffer() 'Puffer des Serialen Ports direkt nach dem Öffnen löschen
End If
End Sub

Private Sub SerialPort_DataReceived() Handles SerialPort.DataReceived 'Hier wird automatisch reingesprungen, sobald Daten auf dem Seriellen Port ankommen.
Me.Invoke(datenlesen) 'Es wird sofort zur SerielleDatenVerarbeiten Routine gesprungen, außer bei miesen Übertragungsfehler. (Try Catch benutzen!)
End Sub

Private Sub SerielleDatenVerarbeiten()
SerialPort.BaseStream.Read(x, 0, 10)
'Daten verarbeiten und etwas zurückschicken
SerialPort.Write(einevariable)
End Sub

Gast
2011-01-05, 17:09:09
Aus eigener Erfahrung kann ich dir nur sagen: Finger weg von den Received Events bei der seriellen Schnittstelle/Netzwerk.

Bei einem halbwegs vernünftigen Protokoll weiß jede Seite, ob sie jetzt senden oder empfangen muss (entweder warte ich auf ein Kommando und gebe dann die Antwort oder ich sende mein Kommando und warte dann bei Bedarf auf die Antwort.

Imports System.IO.Ports

Public Class Main
Private Const Buffersize as Integer=32768

'Empfangen
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim SerialPort As New SerialPort("COM1", 9600, Parity.None, 8, 1)
SerialPort.Open()

Do
Dim Buffer(Buffersize-1) As Byte
Dim Gelesen As Integer = SerialPort.Read(Buffer,0,Buffer.Length)

For i as Integer=0 to Gelesen-1
Dim CurrentByte=Buffer(i)
'Byte verarbeiten
Next

If CommandoComplete Then 'Your input data is complete
Exit Do
EndIf
Loop

Dim ToWrite() As Byte=New Byte(){&H47,&H11,&H08,&H15} 'Your data to send
SerialPort.Write(ToWrite,0,ToWrite.Length)

SerialPort.Close()
End Sub
End Class