[C#] Obsługa RS232: zapis do pliku

0

Witam wszystkich!
piszę z prośbą o pomoc w moim programie. Aktualnie robię projekt, który składa się z urządzenia pomiarowego (opartego na ATMEGA32A, 2-ch akcelerometrach i modułu bluetooth) który bezprzewodowo komunikuje się z komputerem poprzez technologie bluetooth. Komputer "widzi" urządzenie jako port RS232, który symuluje. Napisałem program, który znajduje się poniżej.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;

namespace projekt
{
    public partial class Form1 : Form
    {
        string RxString;
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            serialPort1.PortName = comboBox1.Text;
            serialPort1.Open();
            if (serialPort1.IsOpen)
            {
                button1.Enabled = false;
                button2.Enabled = true;
                textBox1.ReadOnly = false;
                textBox2.ReadOnly = false;
                textBox3.ReadOnly = false;
                textBox4.ReadOnly = false;
                textBox5.ReadOnly = false;
                textBox6.ReadOnly = false;
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                serialPort1.Close();
                button1.Enabled = true;
                button2.Enabled = false;
                textBox1.ReadOnly = true;
                textBox2.ReadOnly = true;
                textBox3.ReadOnly = true;
                textBox4.ReadOnly = true;
                textBox5.ReadOnly = true;
                textBox6.ReadOnly = true;
            }
        }
        
        private void DisplayText(object sender, EventArgs e)
        {
            if (RxString.Contains("x1: "))
            {
                textBox1.AppendText(RxString);
                textBox1.AppendText("\r\n");
            }
            else if (RxString.Contains("y1: "))
            {
                textBox2.AppendText(RxString);
                textBox2.AppendText("\r\n");
            }
            else if (RxString.Contains("z1: "))
            {
                textBox3.AppendText(RxString);
                textBox3.AppendText("\r\n");
            }
            else if (RxString.Contains("x2: "))
            {
                textBox4.AppendText(RxString);
                textBox4.AppendText("\r\n");
            }
            else if (RxString.Contains("y2: "))
            {
                textBox5.AppendText(RxString);
                textBox5.AppendText("\r\n");
            }
            else if (RxString.Contains("z2: "))
            {
                textBox6.AppendText(RxString);
                textBox6.AppendText("\r\n");
            }
         }

        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            RxString = serialPort1.ReadLine();
            this.Invoke(new EventHandler(DisplayText));
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (serialPort1.IsOpen) serialPort1.Close();
        }
        private void save_Click(object sender, EventArgs e)
        {
            string plik = @"C:/CSharpTestWriteToFile.txt";
            StreamWriter sw;
            try
            {
                sw = new StreamWriter(plik);
            }
            catch(IOException)
            {
                return;
            }
            try
            {
                sw.WriteLine(textBox1.Text);
                sw.WriteLine(textBox2.Text);
                sw.WriteLine(textBox3.Text);
                sw.WriteLine(textBox4.Text);
                sw.WriteLine(textBox5.Text);
                sw.WriteLine(textBox6.Text);
                sw.Close();
            }
                catch(IOException)
            {
                return;
            }
        }
    }
}

Zasada jego działania jest następująca:

  • po wyborze odpowiedniego portu COM układ pomiarowy w pętli wysyła po kolei wyniki pomiarów z 6 osi: x1, y1, z1, z2, y2, z2 w następujący sposób:
    x1: wynikx1
    y1: wyniky1
    z1: wynikz1
    x2: wynikx2
    y2: wyniky2
    z2: wynikz2
  • program na komputerze odbiera te dane i wyświetla je w 6 TextBoxach,
  • w każdym z nich jest funkcja, która ogranicza to wyświetlanie do tylko jednej osi x1 lub y1 lub z1 lub x2 lub y2 lub z2.
    Problem mój tkwi w tym, ze to wszystko zapisuje się do bufora, którego jak chce zapisać do pliku, to ma on postać:

x1: wynikx1
.
.
.
x1: wynikx1

y1: wyniky1
.
.
.
y1: wyniky1

z1: wynikz1
.
.
.
z1: wynikz1

x2: wynikx2
.
.
.
x2: wynikx2

y2: wyniky2
.
.
.
y2: wyniky2

z2: wynikz2
.
.
.
z2: wynikz2

Moje pytanie jest następujące, jak zmienić ten program, aby zapisywać do pliku w nieco innej formie np:

x1: wynikx1, y1: wyniky1, z1: wynikz1, x2: wynikx2, y2: wyniky2, z2: wynikz2
.
.
.
x1: wynikx1, y1: wyniky1, z1: wynikz1, x2: wynikx2, y2: wyniky2, z2: wynikz2 ?

Pozdrawiam oczekując na jakieś ciekawe propozycje ;)

0

Połączyć stringi, które chcesz zapisać w jeden, a następnie zapisać całość jednym WriteLine.

0

Czemu używasz "globalnej" zmiennej RxString? Nie ma synchronizacji dostępu do niej.
DisplayText też jest głupio napisane, dlaczego w serialPort1_DataReceived nie przypiszesz otrzymanej wartości bezpośrednio do odpowiedniego textboxa?
Metoda do zapisu do pliku też jest niewłaściwa, źle posługujesz się strumieniami.
Dla mnie taki kod catch(IOException) { return; } To jest: if exception, then no exception :D Jeśli wyjątek wystąpi kompletnie nie masz o tym pojęcia.

Generalnie praca u podstaw :|

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