NOWE POSTY | NOWE TEMATY | POPULARNE | STAT | RSS | KONTAKT | REJESTRACJA | Login: Hasło: rss dla

HOME » INNE » VISUAL BASIC 2010

Przejdz do dołu stronyStrona: 1 / 1    strony: [1]

Visual Basic 2010

  
sp2hfh
24.11.2018 10:16:08
poziom 5

Grupa: Użytkownik

QTH: Gdańsk JO94HI

Posty: 436 #2610138
Od: 2008-10-4
Witam,
potrzebuję informacji ( czytaj pomocy ) odnośnie VB2010. Muszę wysłać poprzez COM PORT daną ale jako HEX. Tak na prawdę to ciąg wpisany <,BoxText>, jako "String" przerabiam na "initger" a następnie wysyłam przez port. Wszystko działa tylko zawsze mi wychodzi ASCII płacze
Program pisany jest w vb ( nie c++ i nie w c# ).
Program to zwykła konsola diagnostyczna która musi przekazać ustawienia konfiguracyjne do mikrokontrolera.
_________________
Mariusz
sp2hfh
  
Electra15.12.2018 17:49:29
poziom 5

oczka
  
SQ5KLN
24.11.2018 10:57:09
poziom 6



Grupa: Użytkownik

Posty: 1187 #2610144
Od: 2012-7-10


Ilość edycji wpisu: 1
Nie jestem biegły w VB2010, ale to by chyba było coś takiego (w ciemno piszę, nie sprawdzałem bardzo szczęśliwy).

Dim dane As Integer
Dim wynik As String
dane = 65432
wynik = Hex(dane)
Console.WriteLine(wynik) // To wyświetlanie na konsoli w .NET, bo nie pamiętam API dla COM-ów, ale wiadomo o co chodzi, w 'wynik' masz stringa z liczbą w postaci heksadecymalnej, wystarczy wysłać znak po znaku na COM-a
_________________
Piotr
  
sp2hfh
24.11.2018 11:25:45
poziom 5

Grupa: Użytkownik

QTH: Gdańsk JO94HI

Posty: 436 #2610155
Od: 2008-10-4
Private Sub serialButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles serialButton.Click

Dim dana As Integer
Dim wynik As String
dana = 12345
wynik = Hex(dana)
SerialPort1.Write(wynik)

End Sub

Serial Port wysyła cztery bajty ascii 33 30 33 39 zamiast dwóch bajtów hex 30 39
_________________
Mariusz
sp2hfh
  
SQ5KLN
24.11.2018 11:53:51
poziom 6



Grupa: Użytkownik

Posty: 1187 #2610164
Od: 2012-7-10


Ilość edycji wpisu: 3
Zaraz, zaraz, bajty jako takie nie są hex, dec, oct czy bin, to po prostu bajty, heksadecymalna czy dziesiętna może być tekstowa reprezentacja. Jeśli masz liczbę całkowitą w postaci wielobajtowej, to po prostu wysyłasz kolejne bajty tej liczby, na przykład jeśli to dwubajtowa liczba, to masz na przykład ręcznie

Dim dane As Integer
dane = 12345
Console.WriteLine(Int(dane / 256)) // starszy bajt
Console.WriteLine(dane Mod 256) // młodszy bajt

lub "automatycznie"

Dim wynik As Byte() = BitConverter.GetBytes(dane) // odpowiednio wynik(0) do wynik(3) zawiera bajty 32-bitowej liczby całkowitej. To po prostu bajty (hex czy dec to tylko ich format wyświetlania na ekranie, dla komputera to 8 bitów, bez "reprezentacji tekstowej")

edit: Jest tylko kwestia little/big-endian czyli kolejności w jakiej są składane bajty w wielobajtową liczbę całkowitą, ale to już zależy od kontrolera.

edit2: Druga kwestia, to w Windowsie masz łańcuchy w postaci unicode a w mikrokontrolerze pewnie nie i stąd jeden "char" masz dwubajtowy. Najlepiej podaj jakieś konkretny przykład danych wejściowych i danych wyjściowych, bo Ty wiesz o co Ci chodzi ale piszesz tak, że przekrój możliwości interpretacyjnych jest szeroki bardzo szczęśliwy
_________________
Piotr
  
SQ5KLN
24.11.2018 12:15:07
poziom 6



Grupa: Użytkownik

Posty: 1187 #2610173
Od: 2012-7-10
Jeśli problemem jest ten unicode (dwubajtowe znaki), to tu masz przykłady konwertowania Unicode do ASCII i odwrotnie zarówno dla zwykłego VB jak i VB.NET https://www.cryptosys.net/pki/manpki/pki_stringstobytes.html.
_________________
Piotr
  
SP5SAi
24.11.2018 12:37:11
poziom 4



Grupa: Użytkownik

QTH: Warszawa KO02LG

Posty: 397 #2610183
Od: 2010-6-13
    sp2hfh pisze:

    Serial Port wysyła cztery bajty ascii 33 30 33 39 zamiast dwóch bajtów hex 30 39


Cześć.
Jak widzę wysyłasz string HEX czyli reprezentacje twoich danych HEX w postaci znaków ASCII =33 30 33 39
33 to ASCII cyfry 3 itd, wysyłasz zapis tekstowy. Jeśli chcesz wysłać 30 w jednym bajcie to trzeba wysłać dane (30) binarnie.

_________________
Pozdrawiam
Andrzej SP5SAi
( Stefan Adam Irena )
  
sp2hfh
24.11.2018 12:43:59
poziom 5

Grupa: Użytkownik

QTH: Gdańsk JO94HI

Posty: 436 #2610186
Od: 2008-10-4
Tą stronę znam. Po zrealizowaniu kodu:

Private Sub serialButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles serialButton.Click

Dim abData() As Byte
Dim Str As String
Dim i As Long
Str = "12345"
abData = System.Text.Encoding.Default.GetBytes(Str)
For i = 0 To UBound(abData)
SerialPort1.Write(Hex(abData(i)))
Next

End Sub


Na terminalu odbiorczym otrzymujemy: 33 31 33 32 33 33 33 34 33 35
Czyli nadal źle płacze
Jak pisałem wcześniej: cokolwiek zrobię dostaję ASCII w tej lub nieco innej formie...pan zielony
_________________
Mariusz
sp2hfh
  
sp2hfh
24.11.2018 12:48:28
poziom 5

Grupa: Użytkownik

QTH: Gdańsk JO94HI

Posty: 436 #2610188
Od: 2008-10-4


Ilość edycji wpisu: 3
Andrzeju SP5SAI
czyli jak to przerobić ??

Piotr, SQ5KLN,
na razie odbieranie testuje przez dekodowanie sygnałow na oscyloskopie. Jeszcze urządzenia z prockiem nie podpinałem.
Dla przykładu: numer seryjny urzadzenia jest 12345 ( w takiej formie jest zapisany na kartce papieru)
do urzadzenia musze wysłać 30 39 czyli dwa bajty. I w takiej formie jest zapamiętywany w eepromie . Gdybym chciał pamietać w standardzie ASCII miałbym do zapamietania 5 bajtów. Inna sprawa to przesyłanie danych konfiguracyjnych. Jest to tablica około 150 danych dwubajtowych ( uint16_t). Wysyłanie takich danych jako oscii zajmie znacznie więcej czasu niż w formie hex. Oczywiście mogę przerabiać ascii na hex w procesorze ale zostało mi już niewiele pamięci flash na kod
_________________
Mariusz
sp2hfh
  
SQ5KLN
24.11.2018 13:45:59
poziom 6



Grupa: Użytkownik

Posty: 1187 #2610207
Od: 2012-7-10


Ilość edycji wpisu: 3
    sp2hfh pisze:


    Dla przykładu: numer seryjny urzadzenia jest 12345 ( w takiej formie jest zapisany na kartce papieru)
    do urzadzenia musze wysłać 30 39 czyli dwa bajty.


To ja bym się nie pierdzielił z API i miliard konwersji, tylko zrobił to ręcznie, na przykład tak:

Dim wynik(2) As Byte
Dim serial As UInt16 = 12345
wynik(0) = serial \ 256
wynik(1) = serial Mod 256
Console.WriteLine(wynik(0)) // Wysłanie jednego bajtu (a nie "stringa")
Console.WriteLine(wynik(1))

edit: Albo dla klasy SerialPort od razu zrobić wysłanie tablicy bajtów (zamiast wysyłania bajt po bajcie), czyli to będzie coś w rodzaju SerialPort1.Write(wynik,0,2), czyli w ogóle pozbyć się niejawnej konwersji metody Write()
_________________
Piotr
  
SP5SAi
24.11.2018 14:23:17
poziom 4



Grupa: Użytkownik

QTH: Warszawa KO02LG

Posty: 397 #2610213
Od: 2010-6-13
Cześć.
Nie mam Visual Basic 2010 i w nim nie pracuje.

SerialPort1.Write(Hex(abData(i))) – Hex( a po co zmieniasz na reprezentacje tekstową HEX string ? Wywal Hex.

_________________
Pozdrawiam
Andrzej SP5SAi
( Stefan Adam Irena )
  
SQ5KLN
24.11.2018 14:34:47
poziom 6



Grupa: Użytkownik

Posty: 1187 #2610216
Od: 2012-7-10


Ilość edycji wpisu: 1
    SP5SAi pisze:

    Cześć.
    Nie mam Visual Basic 2010 i w nim nie pracuje.

    SerialPort1.Write(Hex(abData(i))) – Hex( a po co zmieniasz na reprezentacje tekstową HEX string ? Wywal Hex.


To ja trochę namieszałem, myślałem, że chodzi mu o wysłanie stringa "3038" (12345dec zapisane szesnastkowo i wysłane jako napis) a chodzi o wysłanie dwóch bajtów. Moim zdaniem najprościej będzie zrobić to ręcznie zamiast "walczyć" z metodą Write(String napis) która robi niejawne konwersje (i trzeba poustawiać odpowiednio obiekt SerialPort aby nie wysyłała napisu w unicode), metoda Write(byte[] bufor, offset, count) nie robi takich cyrków a zamienienie 16-bitowej liczby bez znaku na dwa bajty jest banalne (i nie trzeba walczyć z API bardzo szczęśliwy).
_________________
Piotr
  
Electra15.12.2018 17:49:29
poziom 5

oczka
  
sp2hfh
24.11.2018 14:56:55
poziom 5

Grupa: Użytkownik

QTH: Gdańsk JO94HI

Posty: 436 #2610228
Od: 2008-10-4
A w tym wspaniałym jezyku ,) istnieje takie coś jak rzutowanie ( tak jak wC) ?
_________________
Mariusz
sp2hfh
  
sp2hfh
24.11.2018 15:06:19
poziom 5

Grupa: Użytkownik

QTH: Gdańsk JO94HI

Posty: 436 #2610232
Od: 2008-10-4


Ilość edycji wpisu: 2
Private Sub serialButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles serialButton.Click

Dim wynik(4) As Byte
Dim serial As UInt32 = Convert.ToInt32(serialTextBox.Text)
wynik(0) = ((serial \ 256) \ 256) \ 256
wynik(1) = (serial \ 256) \ 256
wynik(2) = serial \ 256
wynik(3) = serial Mod 256
SerialPort1.Write(wynik, 0, 4)

End Sub

Taka wersja działa bardzo szczęśliwybardzo szczęśliwybardzo szczęśliwy Teraz tylko "uładnić" zapis
Nie napisałem na początki że numer seryjny jest uint32_t ( czyli cztery bajty )

A jaką literaturę polecacie tak na przyszłość gdybym przypadkowo musiał jeszcze coś "mądreg" zrobić w VB/ Poza YouTube
_________________
Mariusz
sp2hfh
  
SQ5KLN
24.11.2018 15:40:26
poziom 6



Grupa: Użytkownik

Posty: 1187 #2610245
Od: 2012-7-10


Ilość edycji wpisu: 1
    sp2hfh pisze:

    A w tym wspaniałym jezyku ,) istnieje takie coś jak rzutowanie ( tak jak wC) ?


W samym języku chyba tylko rzutowania "domyślne" (ale głowy nie dam, nie jestem specem od VB) ale już .NET ma tego typu mechanizmy w standardowej bibliotece, na przykład:

Dim serial As UInt32 = 12345
Dim bajty As Byte() = BitConverter.GetBytes(serial)

to mniej więcej to o co Ci chodziło (ewentualnie trzeba na końcu zrobić Array.Reverse(bytes) jeśli kolejność bajtów jest odwrotna niż trzeba bardzo szczęśliwy).

Czy konwersje typów https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/language-features/data-types/implicit-and-explicit-conversions.

Co do literatury, to żadnej do VB nie polecę, bo sam z żadnej nie korzystałem (i nie uważam się za guru VB, wręcz przeciwnie, jest to najczęściej "omijany" przeze mnie język programowania, zaraz obok Delphi i Perla bardzo szczęśliwy), ale po jakimś czasie "wszystkie języki imperatywne i obiektowe są takie same", korzystam jedynie z https://docs.microsoft.com/pl-pl/

edit: Bo zakładam, że "klasyki" (angielskojęzyczne) czyli miejsca takie jak https://www.tutorialspoint.com/ czy https://exercism.io (czy zbiór podręczników https://goalkicker.com/) już odwiedziłeś.
_________________
Piotr
  
SP5SAi
24.11.2018 16:22:59
poziom 4



Grupa: Użytkownik

QTH: Warszawa KO02LG

Posty: 397 #2610253
Od: 2010-6-13


Ilość edycji wpisu: 2
Cześć.
Przerzuciłem się na darmowego Pythona i jestem zupełnie zadowolony. Na moje potrzeby jest zupełnie wystarczający, a ilość pomocy w Internecie jest przepastna do niego i dodatkowe biblioteki i wiele innych zalet. Oto próbka mojej "przygody z Pythonem"



To tak w ramach reklamy darmowego Pythona do darmowego VB 2010.
_________________
Pozdrawiam
Andrzej SP5SAi
( Stefan Adam Irena )
  
sp2hfh
24.11.2018 16:33:54
poziom 5

Grupa: Użytkownik

QTH: Gdańsk JO94HI

Posty: 436 #2610255
Od: 2008-10-4
Fajne
_________________
Mariusz
sp2hfh
  
SP5ADX
24.11.2018 22:20:29
poziom 5

Grupa: Użytkownik

QTH: Siedlce

Posty: 667 #2610383
Od: 2009-5-27
Przywołaliście moje wspomnienia i prace programistyczne ,) Jakże dawno temu moim chlebem było VB, C++, C# i generalnie informatyka.

Wytrwałości i pasji życzę ,)
_________________


Reklama, poligrafia, gadżety reklamowe, sprzęt radiokomunikacyjny, profesjonalny i tani druk kart QSL, pieczątki, dyplomy, odzież reklamowa
  
Electra15.12.2018 17:49:29
poziom 5

oczka

Przejdz do góry stronyStrona: 1 / 1    strony: [1]

  << Pierwsza      < Poprzednia      Następna >     Ostatnia >>  

HOME » INNE » VISUAL BASIC 2010

Aby pisac na forum musisz sie zalogować !!!

randki | własny sklep internetowy | promocje | CyberCiekawostki | darmowe forum | sklepy
opinie, testy, oceny | katalog stron | toplsta