Ето нещо което драснах набързо, нямам как да го тествам в момента, нямам инсталиран протеус. Каква е идеята :
PortB.0 - clock, сетваш го да прави прекъсване по заден фронт.
Разрешаваш прекъсването, тък може да се направи да го разрешаваш само след някакъв таймоут след невалиден пакет или данни.
В прекъсването не правиш нищо освен да вземаш стойността на данните, PortB.1
Имаш функция ps_2() която връща char като както следва :
bit 0 : 0 - нямаш приет валиден стоп бит ; 1 - имаш приет валиден стоп бит , по спецификация стоп бита трябва да е 1-ца.
bit 1 : 0 - невалиден парити бит ; 1 - валиден парити бит
bit 3 : 0 - нямаш излизане по тайм оут ; 1 - излизане по тайм оут
приетите данни са в променлива data.
Идеята е някъде да имаш еидн таймер, в който да инкрементваш променлива ps_time през интервал 10 ms, това горе долу е тайм оута при 10 kHz. Хардкоднато е на 100, можеш да си го изнесеш да се дефинира някъде отгоре.
Реализирано е почти най-простото приемане като все пак се следи за структурата на данните. Сложил съм повечко флагове да ти е по-ясно как работи, надявам се де.
Флах ps_start - вдига се в единица при наличие на стартов бит, изискване дата да е в 0.
След като веднъж си вдигнал ps_start при всеки клок се проверява колко са приетите битове. Ако са по-малко от 8 проверява състоянието на пин данни, и ако е 1-ца прави най-старшият бит на ps_bufer в 1. Също така при единица инвертира ps_parity, който първоначално е 0, накрая шифтва веднъж целия ps_bufer на дясно, след което инкрементва брояча на получените битове. Манипулирам най-старшия байт защото данните се предават от МЗР към СЗР.
На 9-тия бит /тук изключваме стартовия / сравнявам ps_parity с това кеото е на пин данни, ако са еднакви вигам флаг за валидни данни.
На-10-тия бит проверявам дали данните са в 1-ца, ако са сетвам валиден стоп бит.
В цялото нещо имаш една проверка за таймоут която ако излезе връщаш статус за таймоут.
Функцията връща 0 ако няма приети данни.
Като за написано на летищен терминал толкова за сега, по-късно ако ми с епояви време може да го симулирам в протеуса , логиката е ясно но какво съм написал е друг въпрос.