fix how received PZEM messages are handled

This commit is contained in:
King Kévin 2017-01-20 17:07:34 +01:00
parent 0c2d13bbe5
commit 51d8d5a3f5
2 changed files with 7 additions and 12 deletions

View File

@ -96,13 +96,16 @@ void sensor_pzem_measurement_request(uint32_t address, enum sensor_pzem_measurem
usart_enable_tx_interrupt(USART(SENSOR_PZEM_USART)); // enable interrupt to send other bytes usart_enable_tx_interrupt(USART(SENSOR_PZEM_USART)); // enable interrupt to send other bytes
usart_send(USART(SENSOR_PZEM_USART),tx_buffer[tx_i++]); // start transmission usart_send(USART(SENSOR_PZEM_USART),tx_buffer[tx_i++]); // start transmission
sensor_pzem_measurement_received = false; // reset flag
rx_i = 0; // prepare buffer to receive next measurement
} }
struct sensor_pzem_measurement_t sensor_pzem_measurement_decode(void) struct sensor_pzem_measurement_t sensor_pzem_measurement_decode(void)
{ {
struct sensor_pzem_measurement_t measurement; // decoded measurement to return struct sensor_pzem_measurement_t measurement; // decoded measurement to return
measurement.valid = false; // wait until the end to ensure validity measurement.valid = false; // wait until the end to ensure validity
if (!sensor_pzem_measurement_received) { // no measurement received if (rx_i<LENGTH(rx_buffer)) { // buffer is not full, thus no measurement received
return measurement; return measurement;
} }
if ((rx_buffer[0]&0xf0)!=0xa0) { // not a response received if ((rx_buffer[0]&0xf0)!=0xa0) { // not a response received

14
main.c
View File

@ -358,12 +358,12 @@ void main(void)
led_on(); // indicate setup is complete led_on(); // indicate setup is complete
// variables for PZEM-004T meter measurements // variables for PZEM-004T meter measurements
struct sensor_pzem_measurement_t pzem_measurements[2][SENSOR_PZEM_MAX]; // PZEM-004T measurements (2 meters, all measurements) struct sensor_pzem_measurement_t pzem_measurements[3][SENSOR_PZEM_MAX]; // PZEM-004T measurements (2 meters, all measurements)
uint8_t pzem_meter = 0; // PZEM-004T meter index (add to prefix) uint8_t pzem_meter = 0; // PZEM-004T meter index (add to prefix)
uint8_t pzem_measurement = 0; // PZEM-004T measurement index (matches the type) uint8_t pzem_measurement = 0; // PZEM-004T measurement index (matches the type)
// variables for SDM120 meter measurements // variables for SDM120 meter measurements
float sdm120_measurements[2][SENSOR_SDM120_MEASUREMENT_MAX]; // SDM120 measurements (2 meters, all measurements) float sdm120_measurements[3][SENSOR_SDM120_MEASUREMENT_MAX]; // SDM120 measurements (2 meters, all measurements)
uint8_t sdm120_meter = 0; // SDM120 meter index (add to 1 to get ID) uint8_t sdm120_meter = 0; // SDM120 meter index (add to 1 to get ID)
uint8_t sdm120_measurement = 0; // SDM120 measurement index uint8_t sdm120_measurement = 0; // SDM120 measurement index
@ -396,6 +396,7 @@ void main(void)
} }
} }
while (sensor_pzem_measurement_received) { // measurement from electricity meter received while (sensor_pzem_measurement_received) { // measurement from electricity meter received
sensor_pzem_measurement_received = false; // clear flag
struct sensor_pzem_measurement_t measurement = sensor_pzem_measurement_decode(); // decode measurement struct sensor_pzem_measurement_t measurement = sensor_pzem_measurement_decode(); // decode measurement
if (measurement.type>=SENSOR_PZEM_MAX) { if (measurement.type>=SENSOR_PZEM_MAX) {
fprintf(stderr,"unknown measurement type: %u\n", measurement.type); fprintf(stderr,"unknown measurement type: %u\n", measurement.type);
@ -513,15 +514,6 @@ void main(void)
} }
} }
} }
while (button_flag) { // user pressed button
action = true; // action has been performed
printf("button pressed\n");
led_toggle(); // toggle LED
for (uint32_t i=0; i<1000000; i++) { // wait a bit to remove noise and double trigger
__asm__("nop");
}
button_flag = false; // reset flag
}
while (rtc_internal_tick_flag) { // the internal RTC ticked while (rtc_internal_tick_flag) { // the internal RTC ticked
rtc_internal_tick_flag = false; // reset flag rtc_internal_tick_flag = false; // reset flag
gpio_toggle(GPIO(LED_HEARTBEAT_PORT), GPIO(LED_HEARTBEAT_PIN)); // toggle heart beat LED to indicate if main function is stuck (do not toggle onboard the LED on PC13 on the blue pill board since this heavily influences the RTC) gpio_toggle(GPIO(LED_HEARTBEAT_PORT), GPIO(LED_HEARTBEAT_PIN)); // toggle heart beat LED to indicate if main function is stuck (do not toggle onboard the LED on PC13 on the blue pill board since this heavily influences the RTC)