C#, odbiór ramki danych

Odpowiedz Nowy wątek
2018-01-12 22:41
0

Witam,
mam problem odnośnie odbioru ramki z miernika. Ramka nie jest wysyłana w całości, tylko podzielona jest na kilka części, w jaki sposób odebrać całą ramkę ?
Przykładowa cała ramka: 41550200000408
Na początku i na końcu ramki jest spacja, 4 i 1 na początku się nie zmieniają.

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
                     string dataIN   = serialPort1.ReadExisting();

                     this.Invoke(new EventHandler(ShowData));
        }

Z góry dziękuję za pomoc :)

edytowany 1x, ostatnio: laik123, 2018-01-12 22:42

Pozostało 580 znaków

2018-01-12 23:29
0

jest znak końca linii (albo jakikolwiek, który nie może wystąpić w środku ramki ale zawsze jest na końcu) na końcu?
ramka ma stałą długość?


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.

Pozostało 580 znaków

2018-01-12 23:40
0

Tak ramka ma stałą długość, na końcu znajduje się znak \r

Pozostało 580 znaków

2018-01-12 23:48
2

to robisz tak.
deklarujesz zmienną prywatną ramka oraz bufor typu string i ustawiasz im wartość ""

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
                     string dataIN   = serialPort1.ReadExisting();
                     bufor+= dataIN;
                     int i = bufor.IndexOf("\r");
                     if (i > 0)
                     {
                           ramka = bufor.Substring(0, i);
                           bufor = bufor.Remove(0, i + 1);
                           this.Invoke(new EventHandler(ShowData));
                     }
        }

i teraz w ShowData jak odczytasz zmienną ramka to powinieneś dostać całą ramkę


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
takie jojczenie dla sztuki :) - zamiast serialPort1 powinno byc ((klasa)sender).ReadExisting() - tamtamtu 2018-01-13 07:25
A dlaczego? Jeśli ma np jeden obiekt serialport to po co rzutowac? - jacek.placek 2018-01-13 22:54
dla sztuki/standardu itp - ogolni przy eventach jest taka konwencja (wykorzystywanie sender). Oczywisci jak to z konwencjami nie uzywanie tego nie jest bledem. - tamtamtu 2018-01-16 10:38

Pozostało 580 znaków

2018-01-13 14:40
0

Dzięki wielkie za pomoc abrakadaber, teraz dalsza część apki działa bez zarzutu ;)

Pozostało 580 znaków

2018-01-14 15:45
0

Mam jeszcze jedno pytanie, w pierwszej wersji aplikacja była robiona w jednym okienku i wszystko działało po zastosowaniu porady abrakadaber. Teraz muszę przerobić ją na dwa okienka, w pierwszym jest wybór COM (cała konfiguracja), gdzie bo wyborze z comBoxa otwiera się drugie. W drugim jest zrobiony odbiór danych i wyświetlenie w odpowiedniej formie. W jaki sposób połączyć te dwa okienka w całość, żeby to wszystko działało ?
Wywołanie okna 2 po warunku odbywa się w ten sposób:

Form2 okno = new Form2();
 okno.ShowDialog();

W pierwszej wersji aplikacji dalej miałem wywołanie odbioru danych w ten sposób:

serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
edytowany 1x, ostatnio: laik123, 2018-01-14 15:47

Pozostało 580 znaków

2018-01-14 15:49
0

dlaczego serialPort1 nie dasz na drugą formę, tam gdzie rzeczywiście chcesz go używać?


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.

Pozostało 580 znaków

2018-01-14 15:53
0

Mam go na pierwszej i na drugiej, na pierwszej konfiguruje serialPort1 a na drugiej ma być sam odbiór.

Pozostało 580 znaków

2018-01-14 18:46
0

to tak nie działa - jak masz dwie osobne kontrolki na formach to one się same z siebie nijak nie komunikują pomiędzy sobą. Może pokaż trochę kodu, np. tam gdzie konfigurujesz port bo nie bardzo wiem jak Ci pomóc bez kodu.


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.

Pozostało 580 znaków

2018-01-14 18:52
0

Kod w pierszym formie :

 public partial class okno1 : Form
    {
        public okno1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            string[] ports = SerialPort.GetPortNames();
            cBoxCom.Items.AddRange(ports);
        }

        private void cBoxCom_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                serialPort1.PortName = cBoxCom.Text;
                serialPort1.BaudRate = 9600;
                serialPort1.StopBits = System.IO.Ports.StopBits.One;
                serialPort1.Parity = System.IO.Ports.Parity.None;
                serialPort1.DataBits = 8;

                serialPort1.ReadTimeout = 500;
                serialPort1.WriteTimeout = 500;
                serialPort1.Open();

                progressBar1.Value = 100;

              //  serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);

            }
            catch(Exception error)
            {
                MessageBox.Show(error.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            if(progressBar1.Value == 100)
            {
                Form2 okno = new Form2();
                okno.ShowDialog();

              //  this.Invoke(new EventHandler(serialPort1_DataReceived));
               // serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);

            }
        }
    }
}

drugie okno początek:

 public Form2()
        {
            InitializeComponent();
        }

        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            dataIN = serialPort1.ReadExisting();

Pozostało 580 znaków

2018-01-14 19:58
1

możesz zrobić np. tak

        private SerialPort serialPort = null;
 
        public SerialPort Port
        {
                get { return serialPort; }
                set 
                {
                        if (serialPort != null)
                                serialPort.DataReceived  -= new SerialDataReceivedEventHandler(serialPort1_DataReceived);
                        serialPort = value;
                        if (serialPort != null)
                                serialPort.DataReceived  += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
                }
        }
 
        public Form2()
        {
            InitializeComponent();
        }
 
        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            dataIN = serialPort1.ReadExisting();
        }
 
        protected override void OnClosed(EventArgs e)
       {
                 Port = null;
                 base.OnClosed(e);
       }

a w form1

            if(progressBar1.Value == 100)
            {
                Form2 okno = new Form2();
                okno.Port = serialPort1;
                okno.ShowDialog();
            }

Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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