11Fermer13
vinceLe 19/04/2017 à 07:06
A mon tour, pour le coup ça risque de faire moins consensus. C'est extrait de ce topic topics/72-187553-protocole-reseau-lynx-de-type-onewire-idees-de-conception#post-25 et c'était un premier jet d'implémentation de la RFC 1662 sur la Lynx. Le code des checksum reste à finaliser.
C(K&R) Protocole réseau sur Lynx
#define waitsync 1 #define start 2 #define receiving 3 #define escape 4 #define done 5 #define init_value 0 #define packet_pending 9 #define packet_done 10 unsigned char state; unsigned char buf[255]; unsigned char position; unsigned char checksum; SER(){ unsigned char input; DisableIRQ(4); POKE(0x10,0xFD80); input=serdat; if (state==waitsync){ if(input==0x7e){ state=start; }else{ return 0; } } if (state==start){ if(input!=0x7e){ state=receiving; position=0; //checksum=init_value; //goto rx ? }else{ //return 0;//packet waiting } } //rx: ? if (state==receiving){ if(input==0x7d) { state=escape; return 0; } if(input==0x7e) { /*if (checksum==0){ return();//packet done }else{ return();//cheksum error }*/ //state=done; state=start; return 0; }else{ if(position<255){ buf[position++]=input; //update checksum }else{ return 0;//overflow } } } if (state==escape){ state=receiving; if(input==0x5E || input==0x5D){ input=input^0x20; } if(position<255){ buf[position++]=input; }else{ return 0;//overflow } } EnableIRQ(4); }