Ich habe einen Ringbuffer mit Größe 20 und empfange 13 Bytes. Wenn ich
den Code laufen lasse kommt aber nur jede 20. Nachricht ordentlich an.
Wenn ich mir das mal in einer Tabelle darstelle dann sehe ich das Muster
wiederholt sich nach 20 Zeilen.
Im Debugger habe ich das Gefühl dass `DMA1_Channel5->CNDTR` mir nicht
immer die richtige Antwort gibt. Wie finde ich raus ob es überhaupt das
richtige Register ist? Es ist ein STM32F103C8T6.
gerechnet habe ich es genauso wie in der Excel Tabelle
1 | #define KM_MAX_RXBUFF 20
|
2 | static uint8_t last_pointer_position;
|
3 | static uint8_t recent_pointer_position;
|
4 | static uint8_t Rx_message_length = 13;
|
5 | static uint8_t KM_Message[KM_MAX_RXBUFF];
|
6 | HAL_UART_Receive_DMA(&huart1, (uint8_t *)KM_ctx->RxBuff, KM_MAX_RXBUFF;
|
7 |
|
8 | recent_pointer_position = KM_MAX_RXBUFF-DMA1_Channel5->CNDTR;
|
9 | if (recent_pointer_position < Rx_message_length) {
|
10 | last_pointer_position = KM_MAX_RXBUFF + recent_pointer_position - Rx_message_length;
|
11 | }
|
12 | else {
|
13 | last_pointer_position = recent_pointer_position - Rx_message_length;
|
14 | }
|
15 |
|
16 | if(recent_pointer_position > last_pointer_position){
|
17 | memcpy(KM_Message, KM_ctx->RxBuff+last_pointer_position, Rx_message_length);
|
18 | }
|
19 | else {
|
20 | memcpy(KM_Message, KM_ctx->RxBuff+last_pointer_position, KM_MAX_RXBUFF-last_pointer_position);
|
21 | memcpy(KM_Message+KM_MAX_RXBUFF-last_pointer_position, KM_ctx->RxBuff, recent_pointer_position);
|
22 | }
|
Unter der Bedingung das CNDTR auf die Position des 13. empfangenen Bytes
zeigt klappt es, aber sonst nicht.
Das zweite Problem ist dass es auch mal mehr oder weniger als 13 Bytes
sein können, daher war der ursprüngliche Code anders. Hier habe ich aber
das gleiche Problem, nur jede 20. Nachricht passt.
https://github.com/aIecxs/EBiCS_Firmware/blob/3d38ccf/Src/display_kingmeter.c#L319
(es funktioniert wenn ich den ganzen Branch kompiliere, aber nicht wenn
ich nur das memcpy() in einen anderen Branch übernehme)
https://github.com/EBiCS/EBiCS_Firmware/blob/90f6ad2/Src/display_kingmeter.c#L373