Wysyłanie i odbieranie danych w Visual basic
: 11 sie 2018, 21:46
Witam. Panowie mam na pewnym etapie wykonany system kontroli i sterowania małą elektrownią solarną, ale niestety tak jak wspomniałem to połowa mojej roboty.
Otóż chciałbym mieć to pod kontrolą zdalną na PC. Łącze się za pomocą modułów HC-12 i ta łączność jest super. Do obsługi tego ustrojstwa wykorzystałem visual basic.
Tak na dobry początek wyskrobałem sobie malutki program, nawet kilka opcji pozwoliłem sobie zaczerpnąć od Pana Bartka.
No i teraz tak: atxmega wyśle dane jak się o nie poprosi żądaniem. Kawałek kodu z bascoma.
Ale za groma nie mogę sobie poradzić aby te dane były wyświetlane nie w ogólnym terminalu tylko w moim programie na PC.
Przede wszystkim chodzi mi o odbieranie danych takich jak napięcia, temperatura. Format gotowy do wyświetlenia to
Byłbym bardzo wdzięczny za okazaną pomoc w tej sprawie, a poniżej główny kod.
Otóż chciałbym mieć to pod kontrolą zdalną na PC. Łącze się za pomocą modułów HC-12 i ta łączność jest super. Do obsługi tego ustrojstwa wykorzystałem visual basic.
Tak na dobry początek wyskrobałem sobie malutki program, nawet kilka opcji pozwoliłem sobie zaczerpnąć od Pana Bartka.
No i teraz tak: atxmega wyśle dane jak się o nie poprosi żądaniem. Kawałek kodu z bascoma.
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- B1 = Ischarwaiting(#5)
- If B1 = 1 Then
- Print #5 , B1
- Clear Serialin4
- B1 = 0
- Gosub Rs232
- End If
- Rs232:
- Clear Serialin4
- B3 = 0
- Do
- Print #5 , "Nacisnij ENTER "
- Print #5 , "1 - Temperatura "
- Print #5 , "2 - Ustaw Zegar "
- Print #5 , "3 - Ustaw Date "
- Print #5 , "4 - Pomiar VCC "
- Print #5 , "9 - EXIT SETUP "
- Input #5 , "Cakam na wybor ?" , B3
- If B3 = Esc Then Gosub Podprogram
- 'B3 = Id
- Print #5 , B3
- If B3 = 1 Then
- Clear Serialin4
- Call Temperatura
- End If
- If B3 = 4 Then
- Clear Serialin4
- Call Read_mcp3421ch1
- End If
- If B3 = 2 Then
- Clear Serialin4
- Print #5 , "Wprowadz godzine : "
- Info = 0
- Input #5 , Info
- Godziny = Info
- Print #5 , "Wprowadz minuty : "
- Info = 0
- Input #5 , Info
- Minuty = Info
- Print #5 , "Wprowadz sekundy : "
- Info = 0
- Input #5 , Info
- Sekundy = Info
- Print #5 , "Status OK !"
- Clear Serialin4
- Call Settime
- End If
- If B3 = 3 Then
- Clear Serialin4
- Print #5 , "Wprowadz dzien tygodnia 1-7 : "
- Info = 0
- Input #5 , Info
- Dzien_tygodnia = Info
- Print #5 , "Wprowadz dzien 1-31 : "
- Info = 0
- Input #5 , Info
- Dzien = Info
- Print #5 , "Wprowadz miesiac 1-12 : "
- Info = 0
- Input #5 , Info
- Miesiac = Info
- Print #5 , "Wprowadz rok 1-99 : "
- Info = 0
- Input #5 , Info
- Rok = Info
- Clear Serialin4
- Print #5 , "Status OK !"
- Call Setdate
- End If
- If B3 = 9 Then
- Waitms 100
- Gosub Podprogram
- End If
- Loop
Przede wszystkim chodzi mi o odbieranie danych takich jak napięcia, temperatura. Format gotowy do wyświetlenia to
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- vout=str(vin)
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- Imports System
- Imports System.Threading
- Imports System.IO.Ports
- Imports System.ComponentModel
- Public Class Form1
- Dim myPort As Array 'posłuży do zebrania informacji o wszystkich dostępnych portach
- Dim TestArray As String() 'zmienna Test podzielona/rozdzielona na małe stringi z indeksami
- Dim pomiar_txt As String = "" 'wiadomość odebrana ze sterownika, po testach nazwa została :D
- Dim tryb As Integer 'tryb w jakim pracuje sterownik ręczny/automatyczny
- Dim zaczekaj As Boolean 'pomocniczy Bit by pominąć jeden odczyt
- Delegate Sub TextCallback(ByVal [text] As String)
- Delegate Sub SetTextCallback(ByVal [text] As String)
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- myPort = IO.Ports.SerialPort.GetPortNames() 'myPort przyjmuje informacje o dostępnych portach COM
- portComboBox.Items.AddRange(myPort) 'rozwijana lista portów przyjmuje wartości z myPort
- baudComboBox.Text = My.Settings.Baud_rate 'tekst przyjmuje wartość ostatnio zapamiętanego wyboru
- portComboBox.Text = My.Settings.Port_numer 'tekst nazwy portu przyjmuje zapamiętaną wartość
- ' CheckBox2.Text = My.Settings.Aux1 'nazwa dla dodatkowego wyjścia przyrównana do zapisanej
- ' CheckBox3.Text = My.Settings.Aux2
- 'CheckBox1.Checked = My.Settings.Autostart 'wczytuje z pamięci czy połączyć automatycznie
- Timer2.Enabled = True
- Timer2.Interval = 1000
- 'Dialog1.Visible = False
- Disconnect_Button.Enabled = False
- End Sub
- Private Sub Connect_button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Connect_button.Click
- ' MsgBox("Włączam Port Komunikacyjnu RS232/USB")
- Try
- SerialPort1.PortName = portComboBox.Text
- SerialPort1.BaudRate = baudComboBox.Text
- SerialPort1.Open() 'otwieramy port
- Timer1.Start() 'uruchamiamy Timer1
- zaczekaj = True 'pomijamy jeden cykl odczytu (niekonieczne)
- baudComboBox.Enabled = False 'wyłączamy możliwość zmiany na otwartym porcie
- portComboBox.Enabled = False 'możliwość wyboru portu nieaktywna
- Connect_button.Enabled = False 'połączony więc przycisk "Połącz" nieaktywny
- Button_exit.Enabled = False
- Disconnect_Button.Enabled = True ' przycisk "Rozłącz"
- Catch
- MessageBox.Show("Wybierz numer portu COM", "Ostrzeżenie")
- Connect_button.Enabled = False
- End Try
- End Sub
- Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
- ' My.Settings.Autostart = CheckBox1.Checked 'zmienna Autostart w My.Settings przyjmuje wartość CheckBoxa
- End Sub
- Private Sub Disconnect_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Disconnect_Button.Click
- Timer1.Stop() 'zatrzymaj Timer1
- Connect_button.Enabled = True 'aktywuj i dezaktywuj przyciski
- Disconnect_Button.Enabled = False
- Button_exit.Enabled = True
- baudComboBox.Enabled = True
- portComboBox.Enabled = True
- SerialPort1.Close() 'zamknij port
- End Sub
- Private Sub portComboBox_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles portComboBox.SelectedIndexChanged
- My.Settings.Port_numer = portComboBox.Text
- End Sub
- Private Sub baudComboBox_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles baudComboBox.SelectedIndexChanged
- My.Settings.Baud_rate = baudComboBox.Text
- End Sub
- Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
- ReceivedText(SerialPort1.ReadExisting())
- End Sub
- Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
- End Sub
- ' Włączenie lub wyłączenie przekaźników systemu
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
- End Sub
- Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Enter
- End Sub
- Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
- Label3.Text = TimeOfDay
- End Sub
- Private Sub ReceivedText(ByVal [text] As String) 'input from ReadExisting
- If Me.RichTextBox1.InvokeRequired Then
- Dim x As New SetTextCallback(AddressOf ReceivedText)
- Me.Invoke(x, New Object() {(text)})
- Else
- Me.RichTextBox1.Text &= [text] 'append text
- End If
- End Sub
- Private Sub GroupBox5_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GroupBox5.Enter
- End Sub
- Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- ' Dialog1.Visible = True
- End Sub
- Private Sub Button_exit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_exit.Click
- Me.Close()
- End Sub
- Private Sub Button2_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
- SerialPort1.Write(RichTextBox1.Text & vbCr) 'concatenate with \n
- RichTextBox1.Clear()
- End Sub
- Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
- SerialPort1.Write(RichTextBox1.Text & vbCr) 'concatenate with \n
- ' RichTextBox1.Clear()
- End Sub
- Private Sub PictureBox11_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
- End Sub
- Private Sub PictureBox8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox8.Click
- End Sub
- End Class