Skip to content

Commit 37cea1c

Browse files
committed
upd
1 parent 98dae08 commit 37cea1c

File tree

3 files changed

+63
-55
lines changed

3 files changed

+63
-55
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ void MU_serialEvent() {
9494
<a id="versions"></a>
9595
## Версии
9696
- v1.0
97+
- v1.0.1 - мелкие фиксы
9798

9899
<a id="feedback"></a>
99100
## Баги и обратная связь

library.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name=MicroUART
2-
version=1.0
2+
version=1.0.1
33
author=AlexGyver <[email protected]>
44
maintainer=AlexGyver <[email protected]>
55
sentence=Simple implementation of UART (ATmega328)

src/MicroUART.h

Lines changed: 61 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
/*
22
Лёгкая реализация UART для ATmega328 и подобных из этого поколения
3-
Документация:
3+
Документация:
44
GitHub: https://github.com/GyverLibs/MicroUART
55
Возможности:
66
- Полный аналог Serial
77
- Опционально работа с буфером/без
88
- Опционально наследует Print.h
99
- Опционально наследует Stream.h
10-
10+
1111
AlexGyver, [email protected]
1212
https://alexgyver.ru/
1313
MIT License
@@ -20,12 +20,12 @@
2020
#define _MicroUART
2121

2222
#if defined(__AVR_ATmega2560__)
23-
#define USARTx_RX_vect USART0_RX_vect
24-
#define USARTx_UDRE_vect USART0_UDRE_vect
23+
#define USARTx_RX_vect USART0_RX_vect
24+
#define USARTx_UDRE_vect USART0_UDRE_vect
2525

2626
#elif defined(USART_RX_vect) && defined(USART_UDRE_vect)
27-
#define USARTx_RX_vect USART_RX_vect
28-
#define USARTx_UDRE_vect USART_UDRE_vect
27+
#define USARTx_RX_vect USART_RX_vect
28+
#define USARTx_UDRE_vect USART_UDRE_vect
2929
#else
3030

3131
#error "AVR USART not defined"
@@ -55,27 +55,27 @@ void MU_serialEvent() __attribute__((weak));
5555
class MicroUART
5656
#ifdef MU_STREAM
5757
#undef MU_PRINT
58-
: public Stream
58+
: public Stream
5959
#endif
6060
#ifdef MU_PRINT
61-
: public Print
61+
: public Print
6262
#endif
6363
{
64-
public:
64+
public:
6565
// ================= BEGIN ==================
6666
void begin(const uint32_t baud) {
67-
UBRR0 = (F_CPU / (8ul * baud)) - 1; // скорость
68-
UCSR0A = (1 << U2X0); // скорость
69-
UCSR0B = (1 << TXEN0) | (1 << RXEN0) | (1 << RXCIE0); // подрубаем rx tx и rx isr
70-
UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); // 8 бит байт
71-
#if (MU_TX_BUF > 0)
67+
UBRR0 = (F_CPU / (8ul * baud)) - 1; // скорость
68+
UCSR0A = (1 << U2X0); // скорость
69+
UCSR0B = (1 << TXEN0) | (1 << RXEN0) | (1 << RXCIE0); // подрубаем rx tx и rx isr
70+
UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); // 8 бит байт
71+
#if (MU_TX_BUF > 0)
7272
_headTX = _tailTX = 0;
73-
#endif
74-
#if (MU_RX_BUF > 0)
73+
#endif
74+
#if (MU_RX_BUF > 0)
7575
_headRX = _tailRX = 0;
76-
#endif
76+
#endif
7777
}
78-
78+
7979
void end() {
8080
UCSR0B = 0;
8181
}
@@ -87,100 +87,107 @@ class MicroUART
8787
void
8888
#endif
8989
write(uint8_t data) {
90-
#if (MU_TX_BUF > 0) // если есть буфер на отправку
91-
uint8_t i = (_headTX + 1) % MU_TX_BUF; // позиция нового байта в буфере
92-
while (i == _tailTX); // ждать освобождения места в буфере
93-
_bufTX[_headTX] = data; // пишем в буфер
94-
_headTX = i; // двигаем
95-
UCSR0B |= (1 << UDRIE0); // на отправку
96-
#else // нет буфера
97-
while (!(UCSR0A & (1 << UDRE0))); // ждём отправку
98-
UDR0 = data; // пишем
99-
#endif
90+
#if (MU_TX_BUF > 0) // если есть буфер на отправку
91+
uint8_t i = (_headTX + 1) % MU_TX_BUF; // позиция нового байта в буфере
92+
while (i == _tailTX); // ждать освобождения места в буфере
93+
_bufTX[_headTX] = data; // пишем в буфер
94+
_headTX = i; // двигаем
95+
UCSR0B |= (1 << UDRIE0); // на отправку
96+
return 1;
97+
#else // нет буфера
98+
while (!(UCSR0A & (1 << UDRE0))); // ждём отправку
99+
UDR0 = data; // пишем
100+
#endif
100101
}
101-
102+
103+
size_t write(const uint8_t *buffer, size_t size) {
104+
for (size_t i = 0; i < size; i++) write(buffer[i]);
105+
return size;
106+
}
107+
108+
102109
// ================= AVAILABLE ==================
103110
#if defined(MU_STREAM)
104111
virtual int
105112
#else
106113
int
107114
#endif
108115
available() {
109-
#if (MU_RX_BUF > 0)
116+
#if (MU_RX_BUF > 0)
110117
return ((uint16_t)(MU_RX_BUF + _headRX - _tailRX) % MU_RX_BUF);
111-
#else
118+
#else
112119
return _availFlag;
113-
#endif
120+
#endif
114121
}
115-
122+
116123
int availableForWrite() {
117-
#if (MU_TX_BUF > 0)
124+
#if (MU_TX_BUF > 0)
118125
if (_headTX >= _tailTX) return MU_TX_BUF - 1 - _headTX + _tailTX;
119126
return _tailTX - _headTX - 1;
120-
#else
127+
#else
121128
return 1;
122-
#endif
129+
#endif
123130
}
124-
131+
125132
// ================= READ ==================
126133
#if defined(MU_STREAM)
127134
virtual int
128135
#else
129136
uint8_t
130137
#endif
131138
read() {
132-
#if (MU_RX_BUF > 0)
133-
if (_headRX == _tailRX) return -1; // буфер пуст
139+
#if (MU_RX_BUF > 0)
140+
if (_headRX == _tailRX) return -1; // буфер пуст
134141
uint8_t c = _bufRX[_tailRX];
135142
_tailRX = (_tailRX + 1) % MU_RX_BUF; // хвост двигаем
136143
return c;
137-
#else
144+
#else
138145
_availFlag = 0;
139146
return _byteBufRX;
140-
#endif
147+
#endif
141148
}
142-
149+
143150
#if defined(MU_STREAM)
144151
virtual int
145152
#else
146153
uint8_t
147154
#endif
148155
peek() {
149-
#if (MU_RX_BUF > 0)
150-
return (_headRX != _tailRX) ? _bufRX[_tailRX]: -1;
151-
#else
156+
#if (MU_RX_BUF > 0)
157+
return (_headRX != _tailRX) ? _bufRX[_tailRX] : -1;
158+
#else
152159
return _byteBufRX;
153-
#endif
160+
#endif
154161
}
155162

156-
private:
163+
private:
157164
};
158165

159166
// ================= ISR VECT ==================
160167
// прерывание на приём
161168
ISR(USARTx_RX_vect) {
162169
uint8_t data = UDR0;
163-
if (!(UCSR0A & (1 << UPE0))) { // не parity error
164-
#if (MU_RX_BUF > 0)
170+
if (!(UCSR0A & (1 << UPE0))) { // не parity error
171+
#if (MU_RX_BUF > 0)
165172
uint8_t i = (_headRX + 1) % MU_RX_BUF;
166173
if (i != _tailRX) {
167174
_bufRX[_headRX] = data;
168175
_headRX = i;
169176
}
170-
#else
177+
#else
171178
_byteBufRX = data;
172-
_availFlag = 1;
173-
#endif
179+
_availFlag = 1;
180+
#endif
174181
}
175182
MU_serialEvent();
176183
}
177184

178185
// прерывание на отправку
179186
#if (MU_TX_BUF > 0)
180-
ISR(USARTx_UDRE_vect) {
187+
ISR(USARTx_UDRE_vect) {
181188
UDR0 = _bufTX[_tailTX];
182189
_tailTX = (_tailTX + 1) % MU_TX_BUF;
183-
if (_headTX == _tailTX) UCSR0B &= ~(1 << UDRIE0);
190+
if (_headTX == _tailTX) UCSR0B &= ~(1 << UDRIE0);
184191
}
185192
#endif
186193
#endif

0 commit comments

Comments
 (0)