Мой пример:
//Прием #pragma interrupt_handler CharacterHasReceived:12 void CharacterHasReceived(void) { unsigned char RXchar; RXchar=UDR; if(RXchar==NODE_ADRESS) {NodeAdressOk=1;} // If RXchar is an our node adress... if(NodeAdressOk==1) { if((RXchar==ETX)&&(STXmarker==1)) {ETXmarker=1;STXmarker=0;RxIndex=0;NodeAdressOk=0; ErrorFlag=0;} if((STXmarker==1)&&(ETXmarker!=1)) {RxBuffer[RxIndex++]=RXchar;} if(RXchar==STX){STXmarker=1;ETXmarker=0;RxIndex=0;} } }
//Передача
#pragma interrupt_handler CharacterHasTransmitted:14 void CharacterHasTransmitted(void) { if(TranRequest==1) //Transmition request has been activated. This is some variable(flag) which enables transmition. { unsigned char TXchar; TXchar=TxBuffer[++TxIndex]; if(TxIndex==(TXBUF_SIZE-1)){TranRequest=0;TxIndex=0;} UDR=TXchar; } else{done=1;} }
//Запуск передачи
void SendBuffer(void) { PORTD|=TXD; delayms(DELAY_BEFORE_SEND);//Если нужно TranRequest=1; UDR=TxBuffer[0]; while(!done); done=0; delayms(DELAY_AFTER_SEND);//То же самое PORTD&=RXD; }
Таймаутов,чексумов, и прочих проверок в этих функциях нет. Не очень красиво, многое не доработно, но суть такая. Вроде по теме ответ
Сообщение отредактировал Axxel - Mar 28 2007, 08:32
--------------------
Если боишься - не говори. если сказал - не бойся. ©
|