Komunikacja Komputer <-> mikrokontroler

0

Witam.

Mam problem z komunikacją pomiędzy komputerem a mikrokontrolerem. Polega on na tym, że dane odbierane z mikrokontrolera są odbierane poprawnie dopiero po jakimś czasie. Tzn wysyłam z komputera komendę połącz, łącze się z UC który zaczyna non stop wysyłać mi jedną daną, dana wysyłana jest poprawnie (sprawdzone na Bray terminalu) mój program dopiero po kilkukrotnym wysłaniu mu tej danej odczytuje ją poprawnie. Do czasu gdy jej poprawnie nie odbierze dana ma ostatnia wartość jaka była zapisana.

public void odbior_danych(object sender, SerialDataReceivedEventArgs e)
        {
            data = port.ReadByte();
            status_wys(data.ToString());  // Wyswietlenie danej
        } 
0

I jak nikt nie potrafi mi pomóc z tym problemem ? :) Bo jest to dla mnie dosyć istotne.

0

Jesteś pewien, że ten Twój sprzęt wysyła pojedynczy bajt?

0

Na pewno :) Sprawdzaliśmy na oscyloskopie na bray terminalu więc w 100% dane wysyłane są poprawne.

0

To może kwestia odpowiedniej konfiguracji kontrolki SerialPort, jakiejś parzystości, timeoutów, czy czegoś tam.

0

To też jest ustawione ok :(. A niestety bray terminal nie jest open source żebym mógł podejrzeć jak oni to rozwiązali.

0

Możesz dokładnie napisać co wysyłasz i co otrzymujesz w odpowiedzi? Co jaki odstep czasu urządzenie wysyła ci ten bajt?

0

Wysyłanie wygląda tak:

//************* Wysyłanie Danych *************
		if(bit_is_set(flaga,0) && bit_is_set(flaga,1))
		{

			// ************* Wysyłanie Ciagu *************
			while(!(UCSR1A&(1<<5)));
			//_delay_us(400);
 			UDR1 = START_CIAG;		//0b00000010
			
			licz=0;
			for (int k=0; k<80 ; k++)
				{
					ClrBit(PORTD,7);
   					Send_SPI();
					licz++;
				}

			bubblesort(licz);
				
			buforH_SPI = (tab_pom[40]>>8);
			buforL_SPI = tab_pom[40];
				
			while(!(UCSR1A&(1<<5)));
			//_delay_us(400);
 			UDR1 = buforH_SPI;

			while(!(UCSR1A&(1<<5)));
			//_delay_us(400);
 			UDR1 = buforL_SPI;	

			while(!(UCSR1A&(1<<5)));
			//_delay_us(400);
 			UDR1 = END_CIAG;		//0b01000000
			// ************* Koniec Ciag *************


			// ************* Wysyłanie pradu *************

			while(!(UCSR1A&(1<<5)));
			//_delay_us(400);
 			UDR1 = START_PRAD;		//0b00000100
			licz=0;			

			for (int k=0; k<80 ; k++)
			{
 				ClrBit(PORTE,7);			//włączenie przetwornika U4
   				Send_SPI();
				licz++;
			}

			bubblesort(licz);
				
			buforH_SPI = (tab_pom[40]>>8);
			buforL_SPI = tab_pom[40];

			while(!(UCSR1A&(1<<5)));
			//_delay_us(400);
 			UDR1 = buforH_SPI;

			while(!(UCSR1A&(1<<5)));
			//_delay_us(400);
 			UDR1 = buforL_SPI;	

			while(!(UCSR1A&(1<<5)));
			//_delay_us(400);
 			UDR1 = END_PRAD;		//0b00100000
			// ************* Koniec Prad *************


			// ************* Wysyłanie prdkosci obrotowej *************

			while(!(UCSR1A&(1<<5)));
			//_delay_us(400);
 			UDR1 = START_OBROTY;		//0b00001000

			obroty=(obroty*2)/3;		//Obliczanie obr/sec dla 3 łopat

			while(!(UCSR1A&(1<<5)));
			//_delay_us(400);
 			UDR1 = obroty;

			while(!(UCSR1A&(1<<5)));
			//_delay_us(400);
 			UDR1 = END_OBROTY;		//0b00010000
			// ************* Koniec prdkosci obrotowej *************

		}
		// ************* Koniec Danych ************* 

dosyć szybko i dosyć sporo ;). Bray terminal dostaje dobre dane które od razu są wyświetlane dobrze. Mój program odświeża dane po jakiś 5 sekundach albo dłużej. (nie zawsze taki sam czas).

0

Lol, niewiele da się zrozumieć z twojego kodu, może się mylę,ale chyba przerabiałeś z C++. Może napisz do czego używasz poszczególnych zmiennych i metod. No i kod metod też by się przydał. Wysyłasz 3 komendy do urządzenia, a potem czekasz na 3 odczyty, tak mam to rozumieć? Może wydziel z tego jakiś mniejszy kawałek kodu, na którym mógłbyś przetestować wysyłanie i odbieranie

0
mati1988k napisał(a)

dosyć szybko i dosyć sporo ;). Bray terminal dostaje dobre dane które od razu są wyświetlane dobrze. Mój program odświeża dane po jakiś 5 sekundach albo dłużej. (nie zawsze taki sam czas).

To może kwestia jakichś buforów?
Np.:
http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.bytestoread.aspx
http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.readbuffersize.aspx

0
                        while(!(UCSR1A&(1<<5)));
                         UDR1 = buforL_SPI;

A nie ma ten µC jakiegoś UART-a czy czegoś takiego, byś nie musiał tak rzeźbić?

0

No ma :) i tak się wysyła dane z uc ten while po prostu czeka na to aż poprzednie wysyłanie się skończy.

while(!(UCSR1A&(1<<5)));
UDR1 = buforL_SPI; 

I wysyła po UARCIE daną z bufora buforL_SPI.

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