Jump to content

Pirmie soļi Pitonā


Jurkins
 Share

Recommended Posts

  • 2 weeks later...

Netaisot jaunu tēmu, jo vienā galā pitons tāpat paliks.

Varbūt var kāds apskaidrot par TCP. Situācija tāda. Izmantoju Arduino Nano ar 328-to atmegu un VS arduino "plaginu". TCP serveris.

#include <UIPEthernet.h>

uint8_t mac[] = { 0xAE, 0xB2, 0x26, 0xE4, 0x4A, 0x5C };

EthernetServer server(2000);

boolean clientAlreadyConnected = false;

void setup() {
	Serial.begin(57600);
	if (Ethernet.begin(mac))
	{
		server.begin();
		Serial.println(Ethernet.localIP());
		Serial.println(Ethernet.gatewayIP());
		Serial.println(Ethernet.dnsServerIP());
	}
	else Serial.println("Šaize!");
}

void loop() {
	uint8_t i = 10;
	char command[10];
	memset(command, 0, sizeof(command)+1);
	char *pcmd = command;

	if (EthernetClient client = server.available())
	{
		if (clientAlreadyConnected == false)
		{
			Serial.println("Client connected");
			client.println("Server ready");
			clientAlreadyConnected = true;
		}

		while (client.available())
		{
			*pcmd = client.read();
			if (--i)
			{	
				*pcmd++; 
				continue;
			}
			client.flush();
		}

		Serial.println(command);
			
		
		client.stop();
	}

}

Pagaidām kā klientu izmantoju applikāciju TCP/IP builder.

1628112014_TCP_IPBuilder.thumb.png.13e785ea56a09a162d5f4c83238345e2.png

Problēma ir ar rindiņu "client.stop()".

Nevaru īsti iebraukt, kad to clientu vajag stopēt un vai vispār vajag. Serveris ir visu laiku palaists. Builderī "Create socket" un "Connect". Sūtot kaut ko, izpildās nosacījums:

(EthernetClient client = server.available())

ir true, un tiek pieņemti dati. Šajā gadījumā 10 baiti un tālākie tiek noflušoti un klients nostopēts. Bet vairāk neko nevar aizsūtīt, kamēr ne "Destroy Socket"->"Create Socket"->"Connect".

Ja tās rindiņas "client.stop" nav, tad var sūtīt cik vajag. Nu nevaru iebraukt. Objekts "client" taču tiek katrā braucienā caur galveno ciklu pa jaunam noinicializēts. Kur mans domu gājiens brauc auzās? It kā dotajā gadījumā tas nebūtu svarīgi, bet gribas saprast.

  • Patīk 1
Link to comment
Share on other sites

Hmm, es tik amatieris, bet padomāsim loģiski. Tev ir serveris. Serveris klausās. Ahā, piekonektējās klients. Nolasīji viņa sūtītos datus. Un beigās ar stop() {Disconnect from the server.} tu "atšauj klientu". Klientam (TCP bilderim) jātaisa konekcija pa jaunam... A ja tu izmet stop(), tad objekts "server" tur to konekciju vaļā un nākamajā "pārbraucienā" iedot to pašu clienta objektam.

P.S. Tīkls uz ENC28J60, ja jau izmanto UIP nevis iebūvēto librāriju? Tai libai gļuku vairāk kā sunim blusu. Pilns forums piečīkstēts. Apnika, paņēmu pāris $ dārgāko W5100. Interesanti, būs tulīt klāt "guru", kas teiks ka "nav ko izmantot kreisas biblenes, daivai urb datašītu, būvē no nulles un būs tev laime zemes virsū"?

P.P.S. Ja tas būtu labors, tad par šito būtu neieskaitīts ?
boolean clientAlreadyConnected = false;
...
if (clientAlreadyConnected == false)

Labots - Pukinens
  • Patīk 1
Link to comment
Share on other sites

pirms 6 stundām , Pukinens teica:

P.P.S. Ja tas būtu labors, tad par šito būtu neieskaitīts ?
boolean clientAlreadyConnected = false;
...
if (clientAlreadyConnected == false)

Neesmu pamodies. Kas tieši tur ir nepareizi?

Link to comment
Share on other sites

pirms 7 stundām , Pukinens teica:

P.P.S. Ja tas būtu labors, tad par šito būtu neieskaitīts ?
boolean clientAlreadyConnected = false;
...
if (clientAlreadyConnected == false)

A kā būtu pareizi priekš labora? Neesmu saskāries ka kāds laborā vispār kodu pa rindiņai lasītu, tik paprasa paskaidrot random vietas un tam brīnuma ir jāstrādā.

 

vienīgais, ko es varbūt rakstītu citādāk ir:
 

if(!clientAlreadyConnected){

...}

 

Link to comment
Share on other sites

Nē, nu par tām rindiņām piekrītu. Tas bija copy-> paste un pēc tam nepalaboju. Pats tā cenšos nerakstīt. Patīk, ka ir smuki, bez liekvārdības (==false). Nezinu, cik pareizi, bet bool vai boolean vispār nelietoju. Parasti finālā arī aizceļoju prom no arduino. Bet nu tas pašreiz nav svarīgi.

pirms 12 stundām , Pukinens teica:

tu "atšauj klientu"

ak velns, nu toč! Sasipos pats savos spriedelējumos, kurš kad kuru atšuj. Paldies.

 

Nu tumbočkā bija tas ENC28J60, bet šis nestrādā ar standarta bibleni. Bez UIP mēģināju vēl kādas divas, būtībā apmēram tas pats. Gaidu no aļika W5500 modulīšus. Šķiet, šim tā pati biblene, kas W5100 der. Ar W5100 izmanto standarta bibleni?

Link to comment
Share on other sites

pirms 5 stundām , Kazarms teica:

if(!clientAlreadyConnected){ ...}

Tas tads augta limenja valodu lietojums.

 

C un ja vel velas but MISRA complient (parasti tiek prasits embeded, industriala, autoindustrija utt), tad pareizi butu

if (FALSE == clientAlreadyConnected) {

}

 

Savadak code checkers izbrakjes

Link to comment
Share on other sites

Pirms 30 minūtēm , AndrisBB teica:

Tas tads augta limenja valodu lietojums.

 

C un ja vel velas but MISRA complient (parasti tiek prasits embeded, industriala, autoindustrija utt), tad pareizi butu


if (FALSE == clientAlreadyConnected) {

}

 

Savadak code checkers izbrakjes

 

O! Šis man ir jaunums. Paldies!

 

Link to comment
Share on other sites

pirms 3 stundām , AndrisBB teica:

C un ja vel velas but MISRA complient (parasti tiek prasits embeded, industriala, autoindustrija utt), tad pareizi butu


if (FALSE == clientAlreadyConnected) {

}

 

Savadak code checkers izbrakjes

Tiešām MISRA prasa yoda conditionus? Tajā http://caxapa.ru/thumbs/468328/misra-c-2004.pdf esošajos piemēros mainīgais tiek salīdzināts ar konstanti, nevis otrādi.


Kaut kādā stackoverflow "diskusijā", kurā iepīts arī MISRA, arī iesaka tikt vaļā no yoda conditioniem.

Link to comment
Share on other sites

Ir kas prasa un ir kas ne. Ir mums klienti kuri liek izmantot vinu MISRA statiskos check tooljus un linterus.

Varbut tas vairs nav ieksh MISRA jaunakajiem standartiem, bet kadreiz bija?

 

Nez, man itka nav liela problema rakstit tada veido, lai izvairitos no nevajadzigam problemam.

 

Link to comment
Share on other sites

Pirms 49 minūtēm , AndrisBB teica:

Nez, man itka nav liela problema rakstit tada veido, lai izvairitos no nevajadzigam problemam.

Izvairoties no vienām problēmām, nereti sanāk iekulties citās problēmās. Cik ir sanācis lasīt yoda conditionus, tad efekts līdzīgs kā ar Perl "unless" - PITA "apgrieztas" loģikas dēļ.


Ja gribas nodrošināties pret tām problēmām, ar kurām pirms 30+ gadiem cīnījās ar Yoda conditioniem, tad talkā nāk kompilatora warningi.

Link to comment
Share on other sites

Par to 28J60 ir pieraudāts pilns internets, lai gan manā gadījumā tie potenciālie gļuki (nezinu, ir vai nav) nav svarīgi. Skatos, ka tajā Microe linkā arī ir modulis uz tās mikrenes.

Link to comment
Share on other sites

Ir tam Mikroe ari Wizne modulis.

Vispar jau veidot kautko daudzmaz nopietnu uz Arduino ari nav nopietni.

Vel vari paskatities MBED tur jabut bibliotekam pieks visvisadiem eth moduliem, ir ari prieks 28J60 (portets gan no tas pashas Arduino bibliotekas, taka ganjau taspashas problemas) https://os.mbed.com/users/hudakz/code/UIPEthernet/

 

Es parasti izmantoju STM32 Nucleo dev boardus, kas jau nak ar ethernet interfeisiem. Kopa ar LWIP staku darbijas bez problemam, var gan rakstit LWIP zemaka limenja stila vai normala desktop TCP/IP soketu stila, ko var vienkarshi uzrakstit uz desktopa un tad copy/paste uz mikrokontroliera ka FreeRTOS tasku.

https://www.st.com/en/evaluation-tools/nucleo-f429zi.html

Ir gan lielaki, gan mazaki MCU uz vinjiem. Plus ir ari debuggers jau pie boarda, nav jacharakejas ar kautkadiem printf'iem ka uz Arduino un var normali debuggot.

 

Gan FreeRtos, gan LWIP staku var setupot no stm32cubemx.

 

 

Link to comment
Share on other sites

Beigās jau tāpat no arduino nolecu nost. Redz, ja katru dienu ar to nodarbojas, tad ir savādāk. Parādījās uz VS tas visual micro, nu baigi ērti, ja ātri vajag kaut ko vienkāršu.

Pāriet uz STM32 taisos "kā ķēve uz mīzšanu" ?. Ķīniešu kloni maksā pat lētāk nekā kaut kāds arduimo nano. Būtu dienā kādas 48 stundas... Vot par to debagošanu gan ir interesanti. Biju uzlodējis priekš atmeļiem uz tā paša atmeļa no kaut kāda krievu saita, strādāja tīri neko, bet aizņēma SPI.

 

Jā, tā jau ir tā pati bibliotēka, ko izmantoju.

Labots - Jurkins
  • Patīk 1
Link to comment
Share on other sites

Kas pats stulbākais, to UIP... bibleni defaultā nevar palaist piem. atmelstudio bez arduino vides... Visos biblenes failos šitie "#if defined". Normālās biblenēs ir vēl beigās viena #else direktīva, ja esam parastajā "generic" avr. Bet šī laikam izmanto vēl arduino print un hvz vēl ko. Ehhhh...


#if defined(ARDUINO) && !defined(STM32F3) && !defined(__RFduino__)
  class UIPClient : public Client {
#endif
#if defined(__MBED__) || defined(STM32F3) || defined(__RFduino__)
  class UIPClient : public Print, public Client {
#endif
public:
  UIPClient();
  virtual int connect(IPAddress ip, uint16_t port);
  virtual int connect(const char *host, uint16_t port);
  virtual int read(uint8_t *buf, size_t size);
  virtual void stop();

Ethercard biblene ... tas pats. Velns, tas arduino ir epidēmija.

Labots - Jurkins
Link to comment
Share on other sites

Izskatās tka tēma ir aizgājusi tālu no pitona un prātīgākais būtu to sadalīt. Bat ja jau "tāds tas tirgus", lai tad iet.

 

Citēt

Ar W5100 izmanto standarta bibleni?

Jā, standarta.

 

Citēt

Neesmu saskāries ka kāds laborā vispār kodu pa rindiņai lasītu, tik paprasa paskaidrot random vietas un tam brīnuma ir jāstrādā.

Kantoris ik pa laikam rīko developeriem  C# kvalifikācijas celšanas kursus, sauksim to tā. Mērķēti tie ir uz jaunākajiem developeriem, bet piedalīties var jebkurš darbinieks. Šajos kursos ir labori un izķidāts tiek viss - sākot ar koda noformēšanu atbilstoši labajau praksei un beidzot ar komunikāciju par "miglainajiem" punktiem specenē.

 

Citēt

lai gan manā gadījumā tie potenciālie gļuki (nezinu, ir vai nav) nav svarīgi.

Man bija gļuks ka pēc pusstundas paliek "auksts". Piemēram šis issue https://github.com/ntruchsess/arduino_uip/issues/30 bet līdzīgu tur ir vairāki. Paveci pieteikumi, ir bijuši labojumi un ieteikumi, bet man tā arī nesanāca panākt stabilu darbību. Godīgi sakot arī pārāk necentos, jo tas ir tikai hobijs un laiks ir dārgāks.

 

Citēt

portets gan no tas pashas Arduino bibliotekas, taka ganjau taspashas problemas

Savukārt tā arduino bibliotēka ir "written as a wrapper around the mature uIP Stack by Adam Dunkels". Un pieminētā lwIP "has been developed by Adam Dunkels". Tā kā sencis ir viens ?

 

Citēt

Vispar jau veidot kautko daudzmaz nopietnu uz Arduino ari nav nopietni.

 

Citēt

Beigās jau tāpat no arduino nolecu nost.

Lasot forumus man ir radies iespaids ka, lielākā daļa tā saucamo profesionāļu īsti neizprot/nepainteresējas kas ir Arduino, tāpēc tāda nievājoša attieksme.
Manā skatijumā tas ir vienkārši treidmarks, kas ietver sevī sekojošus produktus:
1. IDE
2. Hardwariski un/vai softwariski savietojamus hardware moduļus (https://en.wikipedia.org/wiki/List_of_Arduino_boards_and_compatible_systems).
3. Software freimworks un bibliotēku kopums.

 

Kurš no šiem (izņemot IDE ? ) nav nopietni?
No kura (izņemot IDE ? ) ir jālec nost?

 

Ja ņemam par piemēru to pašu Nano. Šeit shēma https://content.arduino.cc/assets/NanoV3.3_sch.pdf Vai tur ir kādas fundamentālas kļūdas? Ja man vieta atļauj uz plates, kāda būs kāda principiāla starpība vai ielodēšu šadu gatavu moduli vai visas šīs detaļas pēc šīs pašas shēmas ieintergrešu pašveidotā platē? Ja otrais variants, tad tas nebūs arduino?

 

Par freimworku. Tad jau mums ir jālec nost arī no .NET, QT, AJAX u.t.t. Kapēc tad tiek izmantota tā pati lwIP bibliotēka, bet netiek rakstīts savs IP steks? Šobrīd arduino kores ir sarakstītas uj kādai kaudzei čipu. Lūk kore minētajam STM32 Nucleo https://github.com/stm32duino/Arduino_Core_STM32

Populārā čipa ESP8266 IoT firmware https://www.letscontrolit.com/wiki/index.php?title=ESPEasy rakstīta izmantojot arduino freimworku.

 

Link to comment
Share on other sites

Pirms 12 minūtēm , Pukinens teica:

No kura (izņemot IDE ? ) ir jālec nost?

Laikam jau jāpiekrīt daļēji. Esmu no pagātnes. Kādreiz attiny 13 iebāzu 1Wire termometru, Wire raidītāju, ADC potenciometram  un vēl turpat puse atmiņas palika brīva. Skaidrs, ka nafig tas nav vajadzīgs. Bet, kad nokompilē uz arduino ledu on/off un paskatās, kas sanāk, pārņem šausmas.

 

edit: tas attiny 13 bija asmā

Labots - Jurkins
Link to comment
Share on other sites

Viena lieta kas padara AVR par sāpi pakaļā, ir tas ka nav normālas ne Windows IDE's. AVR studio ir OK, bet darboja tik uz Win.

ARM Cotexiem parasti viss ir Eclipe bāzēts. Man gan Eclipse diezko nepatīk un izmantoju tik, tad kad vajag tiešām sāk lūrēt noteiktos reģistros, vai arī ja vajag super ātru debuggingu.

Parasti izmantoju VS Code kopā ar openOCD.   


Pirms 26 minūtēm , Pukinens teica:

Ja otrais variants, tad tas nebūs arduino?

Nu ja tu neizmantosi Arduino ekosistēmu ar visām viņu bibliotēkām, tad nē - tas vienkārši būs produkts uz kura ir AVR mikrokontrolieris. 

Link to comment
Share on other sites

Pirms 36 minūtēm , Pukinens teica:

Lūk kore minētajam STM32 Nucleo https://github.com/stm32duino/Arduino_Core_STM32

Kāda mārrutka pēc to darīt? Tajā pašā git repozitorijā ir rakstīts ka viņi ir uzlikuši Arduino cori pa virsu STM32 HAL bibliotēkai.

Tā bibliotēka ir jau tā pietiekoši "augsta" līmeņa, ka tur nav vajadzības vēl likt pa virsu Arduino šņagu. Ja gribas kautko mazliet "vieglāku" par HAL biblitēlu, tad izmato STM32 LL bibliotēku.

Piekškam funkcijām kas jau tā ir vienkāršas vajag vēl pa virsu Arduino slāni? Pietam ja vajag kautko vairāk kā vienkārši iestatīt to pinu kā inputu vai autputu, tad Arduino to neatļauj, visas PULL UP/DOWN modes, Slew reitus un speedus utt. ATduino tādā ziņā atļauj izmantot tik ļoti mazu daļu no iespējām.

GPIO_PinState     HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void              HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
void              HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

 

Labots - AndrisBB
Link to comment
Share on other sites

Izveido kontu, vai pieraksties esošajā, lai komentētu

Jums ir jābūt šī foruma biedram, lai varētu komentēt tēmas

Izveidot jaunu kontu

Piereģistrējies un izveido jaunu kontu, tas būs viegli!

Reģistrēt jaunu kontu

Pierakstīties

Jums jau ir konts? Pierakstieties tajā šeit!

Pierakstīties tagad!
 Share

×
×
  • Izveidot jaunu...