Kopiowanie tablicy do struktury

0

W jaki sposób przekopiować wartości pola tablicy do pól struktury zadeklarowanej globalnie

0

Struktura struct globalna czyli jaka? Statyczna? To od razu mówię, że się nie da.

0

Najlepiej daj przykład tego, co byś chciał osiągnąć. To wtedy będziemy mogli się jakoś lepiej wypowiedzieć. Bo @grzesiek51114 nie do końca ma rację.

0

Chodzi o to, że pobieram dane z SerialPortu, a następnie byte po byte kopiowany jest do nowej tablicy. Z tej tablicy chce skopiować wartości tych bytów do struktury globalnej, z której będę miał dostęp z każdego poziomu aplikacji.
Poniżej podsyłam kod:
https://pastebin.com/Uq0Btkey

2

Po co używasz do tego struktury w ogóle? Użyj klasy, którą możesz:

  1. Zadeklarować jako statyczną;
  2. Zarejestrować w jakimś ioc jako singleton;
  3. Zrobić ze niej czystego singletona;
  4. Jeżeli Twoja apka składa się z jednego okna to starczy zadeklarować ją jako pole prywatne.

No chyba, że jest jakiś wymóg i trzeba rzeźbić tutaj na strukturze ale z kodu wnioskuję, że nie. Struktury w C# to coś całkiem innego niż w C/C++, a trochę widać jakbyś właśnie z tym sobie kojarzył.

3

Ech. Wszystko jest źle w tym kodzie. Po pierwsze - czujniki. Przecież to się samo prosi, żeby zrobić z tego listę albo chociaż tablicę. A nie tak pierdzieć po kawałku. Po drugie. W konstruktorze formy masz dwa razy wywołane InitializeComponent(), co może prowadzić do problemów.

Nigdzie nie pokazałeś, jak odczytujesz dane z portu: SerialDataReceivedEventHandler
Jeśli Twoja metoda HandleSerialData rzeczywiście tak wygląda, to po co ja masz? Przecież nie robi zupełnie niczego.

Dalej nie patrzę.
Generalnie, jeśli w taki sposób dostajesz dane z portu (ciąg bajtów w tablicy), to nie ma opcji, żebyś automatem mógł sobie to skopiować do jakiejś struktury, czy klasy. Musisz to robić ręcznie. Np. załóżmy, że masz urządzenie do czytania prędkości samochodu. I może wysyłać dane w takiej strukturze:

Pierwsze 4 bajty to numer pomiaru.
Kolejny bajt mówi o jednostce pomiaru (km/h albo mph)
Kolejne 4 bajty to szybkość jako liczba całkowita.

Przykład bufora (wszystko jako hex):
{0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xA} - 1 pomiar; w jednostce mph o wartości 10.

Możesz mieć taką klasę:

public enum Unit {KMH, MPH};

class Measure
{
        public int Id { get; } //id pomiaru
        public Unit Unit { get; } //jednostka
        public int Value { get; } //wartość
}

I teraz musisz mieć tam jakąś metodę, która to sobie sparsuje. To może być nawet konstruktor:

public Measure(byte[] input)
{
    Id = BitConverter.ToInt32(input, 0);
    Unit = (Unit)input[4];
    Value = BitConverter.ToInt32(input, 5);
}

Możesz to przetestować tak:

byte[] b = new byte[] { 1, 0, 0, 0, 1, 10, 0, 0, 0 };
Measure m = new Measure(b);
0

Udało mi się skopiować bytes po bytes. Udało mi się przekopiować to do classy "Czujniki". Ale nadal nie rozumiem dlaczego jak chce napisać nową metodę, to nie mogę się odwołać do tej metody.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.IO.Ports;

namespace R_SCORING
{

    public partial class MainWindow : Window
    {
        
        SerialPort PortUsb = new SerialPort();
        
        public MainWindow()
        {
            InitializeComponent();
            PoloczenieSerialPortu();
          
        }
        
        private void PoloczenieSerialPortu()
        {
            PortUsb.PortName = "COM10";
            PortUsb.BaudRate = 115200;
            PortUsb.Handshake = Handshake.None;
            PortUsb.Parity = Parity.None;
            PortUsb.DataBits = 8;
            PortUsb.StopBits = StopBits.One;
            PortUsb.RtsEnable = true;
            PortUsb.DtrEnable = true;

            //PortUsb.ReadTimeout = 200;
            //PortUsb.WriteTimeout = 50;


            PortUsb.DataReceived += new SerialDataReceivedEventHandler(ReadByteByByte);
            PortUsb.Open();
        }

        private void ReadByteByByte(object sender, SerialDataReceivedEventArgs e)
        {
            if (!PortUsb.IsOpen) return;
            int bytes = PortUsb.BytesToRead;
            byte[] buffer = new byte[bytes];
            PortUsb.Read(buffer, 0, bytes);
            HandleSerialData(buffer);
            PortUsb.Close();
            
        }
        
        static void HandleSerialData(byte[] buffer)
        {
            byte czujnik01 = new byte();
            byte czujnik02 = new byte();
            byte czujnik03 = new byte();
            byte czujnik04 = new byte();
            byte czujnik05 = new byte();
            byte czujnik06 = new byte();
            byte czujnik07 = new byte();
            byte czujnik08 = new byte();
            byte czujnik09 = new byte();
            byte czujnik10 = new byte();

            czujnik01 = buffer[0];
            czujnik02 = buffer[1];
            czujnik03 = buffer[2];
            czujnik04 = buffer[3];
            czujnik05 = buffer[4];
            czujnik06 = buffer[5];
            czujnik07 = buffer[6];
            czujnik08 = buffer[7];
            czujnik09 = buffer[8];
            czujnik10 = buffer[9];

            Czujniki Czujniki = new Czujniki();
            Czujniki.Czujnik01 = czujnik01;
            Czujniki.Czujnik02 = czujnik02;
            Czujniki.Czujnik03 = czujnik03;
            Czujniki.Czujnik04 = czujnik04;
            Czujniki.Czujnik05 = czujnik05;
            Czujniki.Czujnik06 = czujnik06;
            Czujniki.Czujnik07 = czujnik07;
            Czujniki.Czujnik08 = czujnik08;
            Czujniki.Czujnik09 = czujnik09;
            Czujniki.Czujnik10 = czujnik10;
        }

        class Czujniki
        {
            public byte Czujnik01 { get; set; }
            public byte Czujnik02 { get; set; }
            public byte Czujnik03 { get; set; }
            public byte Czujnik04 { get; set; }
            public byte Czujnik05 { get; set; }
            public byte Czujnik06 { get; set; }
            public byte Czujnik07 { get; set; }
            public byte Czujnik08 { get; set; }
            public byte Czujnik09 { get; set; }
            public byte Czujnik10 { get; set; }
        }
    }
}
1

Napisz ten kod od zera. I na Boga, zastosuj tablicę albo listę do tych czujników. I skonkretyzuj problem.

0

Po głębnej analizie wszystkich zagadnień, przepisałem od nowa aplikacje. Tablica, którą utworzyłem, będzie posiadała tylko dziesięć pomiarów - czyli potrzebuje tylko 10 bytes. Wynikową pomiarów tych czujników mają być wartości False(od 0 do 4) albo True(od 5 do 255) . Dlatego nie wiem czy prasowanie tych wyników, to dobry pomysł. Chyba, że pełni to inna role. Wracając do meritum - mam dwa konkretne pytania.

  1. Dlaczego nadal nie mam dostępu do tej tablicy z klasy TablicaWyników. Czy to oznacza, że dalszą cześć programu muszę umiejscowić w metodzie CzytanieBytes. Docelowo, chodzi mi o to, że chce mieć dostęp z każdej klasy do tej tablicy i w razie potrzeby wyzerować ją i wczytać ponownie bytes z SerialPortu.

{
public class TablicaWynikow
{

    public byte Wynik01 { get; set; }
    public byte Wynik02 { get; set; }
    public byte Wynik03 { get; set; }
    public byte Wynik04 { get; set; }
    public byte Wynik05 { get; set; }
    public byte Wynik06 { get; set; }
    public byte Wynik07 { get; set; }
    public byte Wynik08 { get; set; }
    public byte Wynik09 { get; set; }
    public byte Wynik10 { get; set; }
    
    public TablicaWynikow(byte[] wyniki)
    {
        Wynik01 = wyniki[0];
        Wynik02 = wyniki[1];
        Wynik03 = wyniki[2];
        Wynik04 = wyniki[3];
        Wynik05 = wyniki[4];
        Wynik06 = wyniki[5];
        Wynik07 = wyniki[6];
        Wynik08 = wyniki[7];
        Wynik09 = wyniki[8];
        Wynik10 = wyniki[9];
    }
}

public partial class MainWindow : Window
{
    SerialPort PortUsb = new SerialPort();

    public MainWindow()
    {
        InitializeComponent();

        PortUsb.PortName = "COM10";
        PortUsb.BaudRate = 115200;
        PortUsb.Handshake = Handshake.None;
        PortUsb.Parity = Parity.None;
        PortUsb.DataBits = 8;
        PortUsb.StopBits = StopBits.One;
        PortUsb.RtsEnable = true;
        PortUsb.DtrEnable = true;
        PortUsb.Open();

        PortUsb.DataReceived += new SerialDataReceivedEventHandler(CzytanieBytes);
    }

    private void CzytanieBytes(object sender, SerialDataReceivedEventArgs e)
    {
        if (!PortUsb.IsOpen) return; // sprawdzenie czy port nie jest zamkniety
        int iloscBytesDoSkopiowania = PortUsb.BytesToRead; // pobranie ilości bytes do skopiowania 
        byte[] buffer = new byte[iloscBytesDoSkopiowania]; // utworzenie tablicy buffor o wilekosci iloscBytesDoSkopiowania 
        PortUsb.Read(buffer, 0, iloscBytesDoSkopiowania); // wczytanie warosci do tablicy buffor
        TablicaWynikow SkopiowaneWyniki = new TablicaWynikow(buffer); // utworznie tablicy na podstawie klasy TablicaWynikow
    }
}
  1. Dlaczego przy zaznaczonym znaczniku debugowania na poziomie metody CzytanieBytes wyskakuje mi takie okno:
    https://www.fotosik.pl/zdjecie/bde83ec408274039
1

Pytanie mam następujące, takie za 100 punktów: Idąc Twoim tokiem myślenia ile własności byte Wynikxx utworzyłbyś gdyby tablica byte[] wyniki w konstruktorze public TablicaWynikow(byte[] wyniki) posiadała 10000 elementów? Gdzie xx w nazwie zmiennej Wynikxx to numer elementu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1