Witam, mam w swoim programie Handler który reaguje na dane odbierane z portu szeregowego. W obsłudze kliknięcia pobierz chciałbym sprawdzić czy liczba pobranych danych jest już wystarczająca (zdefiniowana przez użytkownika). Nie mogę dać w obsłudze pętli while ponieważ zatrzymuje ona ykonywanie się Handlera. Jak zrealizować obsługe przycisku by było ok?
Zmienne pobrano i rozmiar_transmisji zostały zdefiniowane globalnie
0
0
KOD!
0
Zmienne pobrano i rozmiar_transmisji zostały zdefiniowane globalnie
Chyba chciałeś zamieścić kod ale zapomniałeś
0
private void bDownload_Click(object sender, EventArgs e)
{
if (port.IsOpen)
{
int spr = 0; //wartość zmiennej 1 - nie wybrano rozszerzenia pliku
string tekst = "Czy chcesz pobrać: \nIlość danych: " +(tbAmount.Value*tbPartSize.Value)+cbPartSize.Text+ "\nw paczkach: " + tbPartSize.Value + cbPartSize.Text +
"\nIlość paczek: " + tbAmount.Value + "\n\nUstawienia portu:\n" + "port: " + port.PortName + "\nPrędkość: " + port.BaudRate + "\nBity danych: " + port.DataBits +
"\nBity parzytości: " + port.Parity + "\nBity stopu: " + port.StopBits;
int decyzja = 0;
if ((this.chbbin.Checked == false) && (this.chbtbin.Checked == false) && (this.chbthex.Checked == false))
{
MessageBox.Show("Nie wybrałeś rządanego rozszerzenia plików");
spr = 1;
}
else if ((MessageBox.Show(tekst, "Rozpoczynanie transferu", MessageBoxButtons.YesNo, MessageBoxIcon.Question)) == DialogResult.Yes) decyzja = 1;
if ((decyzja == 1)&&(spr==0))
{
//zmienne:
ulong liczbaPlikow = System.Convert.ToUInt64(tbAmount.Value);
ulong rozmiarPaczki; // w bitach
string sciezka = tbDownload.Text;
string format = "000000";
int nr_paczki = 0;
rozmiarPaczki=ileDoZapisu();
rozmiar_transmisji = liczbaPlikow * rozmiarPaczki;
Thread mainThread = new Thread(new ThreadStart(mainLoopTh));
//zapis
pbDownload.Value = 0;
Byte[] start = { (Byte)128 }; port.Write(start, 0, 1); // start transmisji
mainThread.Start();
Byte[] stop = { (Byte)129 }; port.Write(stop, 0, 1); // start transmisji
zapisano = 0;
}
}
else System.Windows.Forms.MessageBox.Show("Aby pobrać dane musisz ustanowić połączenie");
}
private void mainLoopTh()
{
while (zapisano<=rozmiar_transmisji)
{
//if(pbDownload.Value<100) pbDownload.Value += 1;
}
}
private void Log(LogMsgType msgtype, string msg)
{
rtbTerminal.Invoke(new EventHandler(delegate
{
rtbTerminal.SelectedText = string.Empty;
rtbTerminal.SelectionFont = new Font(rtbTerminal.SelectionFont, FontStyle.Bold);
rtbTerminal.SelectionColor = LogMsgTypeColor[(int)msgtype];
rtbTerminal.AppendText(msg);
rtbTerminal.ScrollToCaret();
}));
}
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (!port.IsOpen) return; // Nic nie rób, jeśli port jest zamknięty
int bytes = port.BytesToRead; // Liczba bitów oczekująca na przeczytanie
byte[] buffer = new byte[bytes]; // bufor na przechowanie nadchodzących danych
port.Read(buffer, 0, bytes); //czytanie z portu i umieszczanie w buforze
mem.Write(buffer, 0, bytes); //zapisywanie danych do pamięci
zapisano += System.Convert.ToUInt64(bytes);
Log(LogMsgType.Incoming, ByteArrayToHexString(buffer));// wyświetlanie tego co przychodzi w hexach
}