Προς το περιεχόμενο

Αρχάριος στη C#


Giorgos3924

Προτεινόμενες αναρτήσεις

Δεν καταλαβαινω τι εννοεις "παλι τιποτα".

 

Αν βαλεις τη συνάρτηση σε timer θα καλειται περιοδικα.

Στη συναρτηση μπορεις εχεις κωδικα που αλλαζει π.χ. το κειμενο ενος label.

Τότε μάλλον κάπου έχει λάθος ο κώδικας μου.  :ph34r:

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 73
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Συχνή συμμετοχή στο θέμα

Δημοσιευμένες Εικόνες

Τότε μάλλον κάπου έχει λάθος ο κώδικας μου.  :ph34r:

 

Καντο περιπου ετσι.

Καθε 2 δευτερολεπτα το label δειχνει τον αριθμό a αυξημένο κατα 1.

partial class Form1 : Form
{
	int a;
	public Form1()
	{
		timer.Interval = 2000; //2 seconds
		timer.Tick += timer_Tick;
		timer.Start();
	}

	private void timer_Tick(object sender, EventArgs e)
	{
		Test();
	}

	private void Test()
	{
		label1.Text = a++.ToString();
	}
}
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Χωρίς την timer.Tick += timer_Tick;

δουλεύει.

Τώρα ένα περίεργο πράγμα:

Με 1000ms δουλεύει, με 100ms δεν δουλεύει :(


Μάλλον ο timer δεν είναι ο σωστός τρόπος.

Ίσως πρέπει να κάνω τη συνάρτηση να εκτελείται συνέχεια αλλά με μικρή καθυστέρηση.


Βρήκα τρόπο:

ο timer καλεί τη συνάρτηση,

η συνάρτηση πριν κάνει οτιδήποτε σταματάει τον timer και όταν τελειώσει η συνάρτηση, η τελευταία πρόταση ξεκινάει πάλι τον timer.

Αλλά Κάτι δεν μαρέσει.

Οι μεταβολές δεν είναι smooth κολάει το πρόγραμμα, σαν να γίνεται start stop ολόκληρου του exe  :-(

Μάλλον πρέπει να βγάλω την εγγραφή label από τη συνάρτηση και να την αντικαταστήσω με string και να ανανεώνω μόνο τη label με τον timer.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Τι εχεις βαλει μεσα στη Load?

Μήπως κανει κατι χρονοβορο η συνάρτηση. 

Γραψε τον κωδικα της αν γινεται.

τίποτα. τα έβγαλα τώρα από εκεί.

Τώρα έβαλα 2 timer, ο ένας εκτελεί τη συνάρτησή μου.

και ο άλλος ανανεώνει το label.

Η συνάρτηση δεν γράφει στο label γραφεί σε string τώρα.

έτσι το πρόγραμμα δεν φαίνεται σαν να έχει frames αλλα ακόμα όταν καλείται η συνάρτηση το πρόγραμμα παγώνει.

 

 

 

 

Το πρόγραμμα αυτό δεν είχε φόρμα, την πρόσθεσα εγώ και προσπάθησα να κάνω μια μετατροπή.

Δουλεύει κανονικά, χωρίς πρόβλημα. αλλά κάνει αυτά τα παγώματα κάθε φορά που εκτελείται η παρακάτω συνάρτηση.

Το πρόγραμμα ήταν σε μια main, πρόσθεσα φόρμα, πήρα τον κώδικα και τον έκανα paste σε συνάρτηση και το εκτελώ από τη φόρμα.

Όταν το είχα στη main ήταν σαν να μην υπήρχε, δηλαδή δημιουργούσε τη φόρμα με application.Run κτλ... και το υπόλοιπο δεν εκτελούτανε παρά μόνο όταν έκλεινα τη φόρμα.

Γιαυτό το μετέφερα στη φόρμα.

Ήταν σε κονσόλα όπως φαίνεται. και θέλω να αντικαταστήσω την κονσολα με label. Δουλεύει αλλά όταν εκτελείται ο timer2 και εκτελεί τη συνάρτηση τότε κάνει παγωματάκια. 

Ο timer2 είναι στα 1000ms και ο timer1 στα 100. Δηλαδή κάθε 1000ms παγώνει το πρόγραμμα για λίγο. Χωρίς error χωρίς warning χωρίς τίποτα. απλά freeze.

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            
            timer1.Start();
            timer2.Start();

        }
        public int count = 48;
        public string dataToWrite;
        public string monitor;

        private void Form1_Load(object sender, EventArgs e)
        {
            
        }

        private void button1_Click(object sender, EventArgs e)
        {
            label1.Text = "asdf";
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            label1.Text = monitor;
            
        }

        //sinartisi ftd
        private void ftd()
        {
           timer2.Stop();
           monitor = "";

            UInt32 ftdiDeviceCount = 0;

            FTDI.FT_STATUS ftStatus = FTDI.FT_STATUS.FT_OK;

            // Create new instance of the FTDI device class
            FTDI myFtdiDevice = new FTDI();

            // Determine the number of FTDI devices connected to the machine
            ftStatus = myFtdiDevice.GetNumberOfDevices(ref ftdiDeviceCount);
            // Check status
            if (ftStatus == FTDI.FT_STATUS.FT_OK)
            {
                monitor = monitor + "Number of FTDI devices: " + ftdiDeviceCount.ToString() + "\n";
                monitor = monitor + "" + "\n";
            }
            else
            {
                // Wait for a key press
                //Console.WriteLine("Failed to get number of devices (error " + ftStatus.ToString() + ")");
                //Console.ReadKey();
                return;
            }

            // If no devices available, return
            if (ftdiDeviceCount == 0)
            {
                // Wait for a key press

                // Console.WriteLine("Failed to get number of devices (error " + ftStatus.ToString() + ")");
                // Console.ReadKey();
                return;
            }

            // Allocate storage for device info list
            FTDI.FT_DEVICE_INFO_NODE[] ftdiDeviceList = new FTDI.FT_DEVICE_INFO_NODE[ftdiDeviceCount];

            // Populate our device list
            ftStatus = myFtdiDevice.GetDeviceList(ftdiDeviceList);

            if (ftStatus == FTDI.FT_STATUS.FT_OK)
            {
                for (UInt32 i = 0; i < ftdiDeviceCount; i++)
                {

                    monitor = monitor + "Device Index: " + i.ToString() + "\n";
                    monitor = monitor + "Flags: " + String.Format("{0:x}", ftdiDeviceList[i].Flags) + "\n";
                    monitor = monitor + "Type: " + ftdiDeviceList[i].Type.ToString() + "\n";
                    monitor = monitor + "ID: " + String.Format("{0:x}", ftdiDeviceList[i].ID) + "\n";
                    monitor = monitor + "Location ID: " + String.Format("{0:x}", ftdiDeviceList[i].LocId) + "\n";
                    monitor = monitor + "Serial Number: " + ftdiDeviceList[i].SerialNumber.ToString() + "\n";
                    monitor = monitor + "Description: " + ftdiDeviceList[i].Description.ToString() + "\n";
                    monitor = monitor + "" + "\n";
                }
            }



            // Open first device in our list by serial number
            ftStatus = myFtdiDevice.OpenBySerialNumber(ftdiDeviceList[0].SerialNumber);
            if (ftStatus != FTDI.FT_STATUS.FT_OK)
            {
                // Wait for a key press
                //Console.WriteLine("Failed to open device (error " + ftStatus.ToString() + ")");
                //Console.ReadKey();
                return;
            }

            // Set up device data parameters
            // Set Baud rate to 9600
            ftStatus = myFtdiDevice.SetBaudRate(9600);
            if (ftStatus != FTDI.FT_STATUS.FT_OK)
            {
                // Wait for a key press
                // Console.WriteLine("Failed to set Baud rate (error " + ftStatus.ToString() + ")");
                //Console.ReadKey();
                return;
            }

            // Set data characteristics - Data bits, Stop bits, Parity
            ftStatus = myFtdiDevice.SetDataCharacteristics(FTDI.FT_DATA_BITS.FT_BITS_8, FTDI.FT_STOP_BITS.FT_STOP_BITS_1, FTDI.FT_PARITY.FT_PARITY_NONE);
            if (ftStatus != FTDI.FT_STATUS.FT_OK)
            {
                // Wait for a key press
                // Console.WriteLine("Failed to set data characteristics (error " + ftStatus.ToString() + ")");
                //Console.ReadKey();
                return;
            }


            /*
            // Set read timeout to 5 seconds, write timeout to infinite
            ftStatus = myFtdiDevice.SetTimeouts(5000, 0);
            if (ftStatus != FTDI.FT_STATUS.FT_OK)
            {
                // Wait for a key press
                // Console.WriteLine("Failed to set timeouts (error " + ftStatus.ToString() + ")");
                //Console.ReadKey();
                return;
            }
            */

            dataToWrite = (++count).ToString();
            UInt32 numBytesWritten = 0;

            // Note that the Write method is overloaded, so can write string or byte array data
            ftStatus = myFtdiDevice.Write(dataToWrite, dataToWrite.Length, ref numBytesWritten);
            if (ftStatus != FTDI.FT_STATUS.FT_OK)
            {
                // Wait for a key press
                // Console.WriteLine("Failed to write to device (error " + ftStatus.ToString() + ")");
                // Console.ReadKey();
                return;
            }



            // Check the amount of data available to read
            // In this case we know how much data we are expecting, 
            // so wait until we have all of the bytes we have sent.
            UInt32 numBytesAvailable = 0;
            do
            {
                ftStatus = myFtdiDevice.GetRxBytesAvailable(ref numBytesAvailable);
                if (ftStatus != FTDI.FT_STATUS.FT_OK)
                {
                    // Wait for a key press
                    // Console.WriteLine("Failed to get number of bytes available to read (error " + ftStatus.ToString() + ")");
                    // Console.ReadKey();
                    return;
                }

                Thread.Sleep(5);
            } while (numBytesAvailable < dataToWrite.Length);


            // Now that we have the amount of data we want available, read it
            string readData;
            UInt32 numBytesRead = 0;
            // Note that the Read method is overloaded, so can read string or byte array data
            ftStatus = myFtdiDevice.Read(out readData, numBytesAvailable, ref numBytesRead);
            if (ftStatus != FTDI.FT_STATUS.FT_OK)
            {
                // Wait for a key press
                // Console.WriteLine("Failed to read data (error " + ftStatus.ToString() + ")");
                // Console.ReadKey();
                return;
            }


            monitor = monitor + readData + "\n";

            // Close our device
            ftStatus = myFtdiDevice.Close();
            timer2.Start();


        }

        private void timer2_Tick(object sender, EventArgs e)
        {
            ftd();
        }
    } 

 

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Σιγουρα η ftd() θελει καποιο χρονο αφου κανει open-read-write-close σειριακή θυρα. 

Επίσης η Thread.Sleep() απαγορευεται στο GUI. 

 

Θα σου προτεινα να ανοιγεις μόνο μια φορα στην αρχή την COM, να διαβαζεις περιοδικα τα δεδομενα που θες σε ενα νέο thread, και να τα περνας στη φορμα μεσω Control.BeginInvoke(). 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Σιγουρα η ftd() θελει καποιο χρονο αφου κανει open-read-write-close σειριακή θυρα. 

Επίσης η Thread.Sleep() απαγορευεται στο GUI. 

 

Θα σου προτεινα να ανοιγεις μόνο μια φορα στην αρχή την COM, να διαβαζεις περιοδικα τα δεδομενα που θες σε ενα νέο thread, και να τα περνας στη φορμα μεσω Control.BeginInvoke(). 

Ναι στο τέλος έτσι θα γίνει, θα ανοίγει μια φορά και θα κλείνει στο τέλος.

Δηλαδή εσύ λες να ξαναβάλω το πρόγραμμα στη main και να περνάω τα δεδομένα στη φόρμα;

 

Κάτι άσχετο:

Δεν μπορώ να μετατρέψω string σε int.

Γράφω: Convert.ToInt32(string)

και στην εκτέλεση πετάει:

An unhandled exception of type 'System.FormatException' occurred in mscorlib.dll
Additional information: Η συμβολοσειρά εισόδου δεν είχε τη σωστή μορφή.
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Φτιαξε μια κλαση Device

class Device
{
	public void Open() { }

	public void Close() { }

	public bool IsOpen { get; private set; }

	public string Process()
	{
		string monitor = "";
		//get data
		return monitor;
	}
}

Στη φορμα κανε αυτό

public Form1()
{
	Thread thr=new Thread(Process);
	thr.Start();
}
bool stop;
Device myDevice;
private void Process()
{
	myDevice = new Device();
	myDevice.Open();
	for(; ; )
	{
		if(stop)
			break;
		Thread.Sleep(1000);
		string s = myDevice.Process();
		label1.BeginInvoke((MethodInvoker)delegate { label1.Text = s; });
	}
	myDevice.Close();
}

Το string πρεπει να εχει μονο ψηφια

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Προσπαθησε να σπάσεις την ftd σε Open, Process kai Close.

class Device
{
	int count;
	FTDI myFtdiDevice;
	public string OpenInfo { get; private set; }
	public void Open()
		{
			UInt32 ftdiDeviceCount = 0;
			FTDI.FT_STATUS ftStatus = FTDI.FT_STATUS.FT_OK;
			myFtdiDevice = new FTDI();
			ftStatus = myFtdiDevice.GetNumberOfDevices(ref ftdiDeviceCount);
			if(ftStatus == FTDI.FT_STATUS.FT_OK)
			{
				OpenInfo = OpenInfo + "Number of FTDI devices: " + ftdiDeviceCount.ToString() + "\n";
				OpenInfo = OpenInfo + "" + "\n";
			}
			else
			{
				IsOpen = false;
				return;
			}

			// If no devices available, return
			if(ftdiDeviceCount == 0)
			{
				IsOpen = false;
				return;
			}

			// Allocate storage for device info list
			FTDI.FT_DEVICE_INFO_NODE[] ftdiDeviceList = new FTDI.FT_DEVICE_INFO_NODE[ftdiDeviceCount];

			// Populate our device list
			ftStatus = myFtdiDevice.GetDeviceList(ftdiDeviceList);

			if(ftStatus == FTDI.FT_STATUS.FT_OK)
			{
				for(UInt32 i = 0; i < ftdiDeviceCount; i++)
				{

					OpenInfo = OpenInfo + "Device Index: " + i.ToString() + "\n";
					OpenInfo = OpenInfo + "Flags: " + String.Format("{0:x}", ftdiDeviceList[i].Flags) + "\n";
					OpenInfo = OpenInfo + "Type: " + ftdiDeviceList[i].Type.ToString() + "\n";
					OpenInfo = OpenInfo + "ID: " + String.Format("{0:x}", ftdiDeviceList[i].ID) + "\n";
					OpenInfo = OpenInfo + "Location ID: " + String.Format("{0:x}", ftdiDeviceList[i].LocId) + "\n";
					OpenInfo = OpenInfo + "Serial Number: " + ftdiDeviceList[i].SerialNumber.ToString() + "\n";
					OpenInfo = OpenInfo + "Description: " + ftdiDeviceList[i].Description.ToString() + "\n";
					OpenInfo = OpenInfo + "" + "\n";
				}
			}
			// Open first device in our list by serial number
			ftStatus = myFtdiDevice.OpenBySerialNumber(ftdiDeviceList[0].SerialNumber);
			if(ftStatus != FTDI.FT_STATUS.FT_OK)
			{
				IsOpen = false;
				return;
			}

			// Set up device data parameters
			// Set Baud rate to 9600
			ftStatus = myFtdiDevice.SetBaudRate(9600);
			if(ftStatus != FTDI.FT_STATUS.FT_OK)
			{
				IsOpen = false;
				return;
			}

			// Set data characteristics - Data bits, Stop bits, Parity
			ftStatus = myFtdiDevice.SetDataCharacteristics(FTDI.FT_DATA_BITS.FT_BITS_8, FTDI.FT_STOP_BITS.FT_STOP_BITS_1, FTDI.FT_PARITY.FT_PARITY_NONE);
			if(ftStatus != FTDI.FT_STATUS.FT_OK)
			{
				IsOpen = false;
				return;
			}
		}
	public string Process()
		{
			if(IsOpen)
			{
				string monitor = "";
				string dataToWrite = (++count).ToString();
				UInt32 numBytesWritten = 0;

				// Note that the Write method is overloaded, so can write string or byte array data
				ftStatus = myFtdiDevice.Write(dataToWrite, dataToWrite.Length, ref numBytesWritten);
				if(ftStatus != FTDI.FT_STATUS.FT_OK)
				{
					// Wait for a key press
					// Console.WriteLine("Failed to write to device (error " + ftStatus.ToString() + ")");
					// Console.ReadKey();
					return;
				}



				// Check the amount of data available to read
				// In this case we know how much data we are expecting, 
				// so wait until we have all of the bytes we have sent.
				UInt32 numBytesAvailable = 0;
				do
				{
					ftStatus = myFtdiDevice.GetRxBytesAvailable(ref numBytesAvailable);
					if(ftStatus != FTDI.FT_STATUS.FT_OK)
					{
						// Wait for a key press
						// Console.WriteLine("Failed to get number of bytes available to read (error " + ftStatus.ToString() + ")");
						// Console.ReadKey();
						return;
					}

					Thread.Sleep(5);
				} while(numBytesAvailable < dataToWrite.Length);


				// Now that we have the amount of data we want available, read it
				string readData;
				UInt32 numBytesRead = 0;
				// Note that the Read method is overloaded, so can read string or byte array data
				ftStatus = myFtdiDevice.Read(out readData, numBytesAvailable, ref numBytesRead);
				if(ftStatus != FTDI.FT_STATUS.FT_OK)
				{
					// Wait for a key press
					// Console.WriteLine("Failed to read data (error " + ftStatus.ToString() + ")");
					// Console.ReadKey();
					return;
				}


				monitor = monitor + readData + "\n";
				return monitor;
			}
			return null;
		}
	public void Close() { myFtdiDevice.Close(); }
	public bool IsOpen { get; private set; }
}

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μισό λεπτό γιατί προσπαθώ να καταλάβω λίγο τι γίνεται γιατί δεν μ'αρέσει το copy paste  :-)


Γιατί να φτιάξω κλάση τύπου string και όχι να βάλω ένα string monitor ως public μέσα στην κλάση όπως η count και η myFtdiDevice

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μισό λεπτό γιατί προσπαθώ να καταλάβω λίγο τι γίνεται γιατί δεν μ'αρέσει το copy paste  :-)

Γιατί να φτιάξω κλάση τύπου string και όχι να βάλω ένα string monitor ως public μέσα στην κλάση όπως η count και η myFtdiDevice

 

Οκ μπορεις και ετσι.

Απλα η Process εκτελειται περιοδικα και αν αποτύχει τοτε η public monitor θα εχει την προηγουμενη τιμή (εκτος και αν της αναθεσεις null).

Επισης διαχώρισα την OpenInfo απο τη monitor.

 

Η count και myFtdiDevice δεν ειναι public (δεν χρειαζεται να τις γνωρίζει η φορμα). 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Οκ μπορεις και ετσι.

Απλα η Process εκτελειται περιοδικα και αν αποτύχει τοτε η public monitor θα εχει την προηγουμενη τιμή (εκτος και αν της αναθεσεις null).

Επισης διαχώρισα την OpenInfo απο τη monitor.

 

Η count και myFtdiDevice δεν ειναι public (δεν χρειαζεται να τις γνωρίζει η φορμα). 

ναι σωστά είναι private

Στην     public string OpenInfo { get; private set; }

υπάρχει λόγος που έχεις την set private?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...