Skip to content

Commit aa7949d

Browse files
committed
Fix Serial config
Fix stm32duino#50 Arduino defined several configs (data, parity and stop bits) values for Serial.begin(speed, config) See: https://www.arduino.cc/en/Serial/Begin Below configs could not be supported by STM32 as minimum wordlength (data + parity) is UART_WORDLENGTH_7B (7 bits). SERIAL_5N1 SERIAL_5N2 SERIAL_5E1 SERIAL_5E2 SERIAL_5O1 SERIAL_5O2 SERIAL_6N1 SERIAL_6N2 Signed-off-by: Frederic Pillon <[email protected]>
1 parent e6fcc14 commit aa7949d

File tree

2 files changed

+56
-15
lines changed

2 files changed

+56
-15
lines changed

Diff for: cores/arduino/HardwareSerial.cpp

+39-2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include <stdio.h>
2727
#include <string.h>
2828
#include <inttypes.h>
29+
#include <assert.h>
2930
#include "Arduino.h"
3031
#include "HardwareSerial.h"
3132

@@ -83,15 +84,32 @@ int HardwareSerial::_tx_complete_irq(serial_t* obj)
8384

8485
void HardwareSerial::begin(unsigned long baud, byte config)
8586
{
87+
uint32_t databits = 0;
88+
8689
_serial.baudrate = (uint32_t)baud;
8790

88-
// Could be 8 or 9 bits. Could match with Arduino small data length?
89-
_serial.databits = UART_WORDLENGTH_8B;
91+
// Manage databits
92+
switch(config & 0x07) {
93+
case 0x02:
94+
databits = 6;
95+
break;
96+
case 0x04:
97+
databits = 7;
98+
break;
99+
case 0x06:
100+
databits = 8;
101+
break;
102+
default:
103+
databits = 0;
104+
break;
105+
}
90106

91107
if((config & 0x30) == 0x30) {
92108
_serial.parity = UART_PARITY_ODD;
109+
databits++;
93110
} else if((config & 0x20) == 0x20) {
94111
_serial.parity = UART_PARITY_EVEN;
112+
databits++;
95113
} else {
96114
_serial.parity = UART_PARITY_NONE;
97115
}
@@ -102,6 +120,25 @@ void HardwareSerial::begin(unsigned long baud, byte config)
102120
_serial.stopbits = UART_STOPBITS_1;
103121
}
104122

123+
switch(databits) {
124+
#ifdef UART_WORDLENGTH_7B
125+
case 7:
126+
_serial.databits = UART_WORDLENGTH_7B;
127+
break;
128+
#endif
129+
case 8:
130+
_serial.databits = UART_WORDLENGTH_8B;
131+
break;
132+
case 9:
133+
_serial.databits = UART_WORDLENGTH_9B;
134+
break;
135+
default:
136+
case 0:
137+
databits = 0;
138+
break;
139+
}
140+
assert(databits!=0);
141+
105142
uart_init(&_serial);
106143
uart_attach_rx_callback(&_serial, _rx_complete_irq);
107144
}

Diff for: cores/arduino/HardwareSerial.h

+17-13
Original file line numberDiff line numberDiff line change
@@ -57,28 +57,32 @@ typedef uint8_t rx_buffer_index_t;
5757
#endif
5858

5959
// Define config for Serial.begin(baud, config);
60-
#define SERIAL_5N1 0x00
61-
#define SERIAL_6N1 0x02
60+
// below configs are not supported by STM32
61+
//#define SERIAL_5N1 0x00
62+
//#define SERIAL_5N2 0x08
63+
//#define SERIAL_5E1 0x20
64+
//#define SERIAL_5E2 0x28
65+
//#define SERIAL_5O1 0x30
66+
//#define SERIAL_5O2 0x38
67+
//#define SERIAL_6N1 0x02
68+
//#define SERIAL_6N2 0x0A
69+
70+
#ifdef UART_WORDLENGTH_7B
6271
#define SERIAL_7N1 0x04
63-
#define SERIAL_8N1 0x06
64-
#define SERIAL_5N2 0x08
65-
#define SERIAL_6N2 0x0A
6672
#define SERIAL_7N2 0x0C
67-
#define SERIAL_8N2 0x0E
68-
#define SERIAL_5E1 0x20
6973
#define SERIAL_6E1 0x22
74+
#define SERIAL_6E2 0x2A
75+
#define SERIAL_6O1 0x32
76+
#define SERIAL_6O2 0x3A
77+
#endif
78+
#define SERIAL_8N1 0x06
79+
#define SERIAL_8N2 0x0E
7080
#define SERIAL_7E1 0x24
7181
#define SERIAL_8E1 0x26
72-
#define SERIAL_5E2 0x28
73-
#define SERIAL_6E2 0x2A
7482
#define SERIAL_7E2 0x2C
7583
#define SERIAL_8E2 0x2E
76-
#define SERIAL_5O1 0x30
77-
#define SERIAL_6O1 0x32
7884
#define SERIAL_7O1 0x34
7985
#define SERIAL_8O1 0x36
80-
#define SERIAL_5O2 0x38
81-
#define SERIAL_6O2 0x3A
8286
#define SERIAL_7O2 0x3C
8387
#define SERIAL_8O2 0x3E
8488

0 commit comments

Comments
 (0)