Main idea . Serial port interruptions are rare, so they should not affect the continuous cycle of the pressure regulator. Here is a piece of code with interruption from an incoming message, parsing of an incoming control line, and reading of an analog port.

Revision:
2:df6b8ad18bc5
Parent:
1:ad293c65b02c
--- a/main.cpp	Fri Apr 10 18:06:38 2020 +0000
+++ b/main.cpp	Fri Apr 17 09:35:30 2020 +0000
@@ -1,5 +1,5 @@
 #include "mbed.h"
-//10.04.2020 20:18
+//16.04.2020 23:19
 //Программа для пошагового чтения байтов из порта (файла) и разделения потока байтов на подстроки в реальном времени. Разделитель - запятая.
 //Строка сообщения должна заканчиваться только одним символом /r  или  /n (обнаружение признака окончания сообщения можно сделать любым)
 //Программа нормально разбивает принимаемую строку на подстроки (до 20) в количестве равном количеству запятых, плюс последняя подстрока без запятой
@@ -7,7 +7,9 @@
 
 AnalogIn analog_value(A0);                           //подключение аналогового входа A0
 DigitalOut led(LED1);
-RawSerial pc(USBTX, USBRX);
+DigitalOut digitalWrite4(PB_5);    // initialize digital pin 4 as an output (high pressure air bulb charge).
+DigitalOut digitalWrite7(PA_8);    // initialize digital pin 7 as an output. (high pressure air bulb discharge
+RawSerial pc(USBTX, USBRX, 115200);
 EventQueue *queue = mbed_event_queue();                                         //инициализация очереди событий RTOS mbed5
 
 #define maxnstr 20                                                              // maximum nbr of params(sybstrings) used to hold the data fields
@@ -19,9 +21,17 @@
 int pressure_set=0;                                  //уставка давления 
 int pressure_set_max=0;                              //уставка максимальног давления 
 int pressure_set_min=0;                              //уставка минимального давления 
+int value=1000;                   //set "pressure" 50
+int delta_value=25;              //set delta pressure
+int counter_cycle1=0;
+int counter_cycle2=0;
 
+int valve1=0;   // state valve of  charge:  0 - close, 1 - open
+int valve2=0;   //state valve of  discharge:  0 - close, 1 - open
+
+//______________________________________________________________________________
 void onDataReceived();                                                          // callback
-
+//______________________________________________________________________________
 void read_serial() {
     char message[maxnstr][maxnsym]={""};                                        //обнуление строк (локального двумерного массива символов фиксированного размера)
     int zap=0;                                                                  // счетчик запятых                                                
@@ -52,7 +62,7 @@
     
     pc.attach(&onDataReceived, Serial::RxIrq);                                  // reattach interrupt - переподключение прерывания перед выходом из функции
 }
-
+//______________________________________________________________________________
 void onDataReceived() {
     pc.attach(NULL, Serial::RxIrq);                                             // detach interrupt
     queue->call(read_serial);                                                   // process in a non ISR context - переход к функции приема строки в статусе отключенного прерывания (учим указатели!)
@@ -60,15 +70,32 @@
 //*****************************************************************************
 int main() {
     pc.attach(&onDataReceived, Serial::RxIrq);                                  //подключение прерывания и имя функции обработчика прерывания по входящему символу в serial порту
-    float meas_r;
-    float meas_v;
-    printf("AnalogIn read \r\n");
+    float raw_value ;
+    int sensor_value ;
+    printf("Start \r\n");
     while (1) {
-        meas_r = analog_value.read();                                           // Чтение аналогового входа (0.0 to 1.0 = full ADC диапазон)
-        meas_v = meas_r * 3300;                                                 // преобразование в напряжение 0-3300 mV 
-        printf("measure = %f = %.0f mV\r\n", meas_r, meas_v);
+       
+/*--------------regulator begin---*/
+  raw_value  = analog_value.read();                                           // Чтение аналогового входа (0.0 to 1.0 = full ADC диапазон)
+  sensor_value  = raw_value  * 3300;                                          // преобразование в напряжение 0-3300 mV 
+  if (sensor_value>value+delta_value)
+  {
+   digitalWrite7=1; valve2=1;
+   digitalWrite4=0; valve1=0;
+  } else  if (sensor_value<value-delta_value)
+  {
+   digitalWrite4=1; valve1=1;
+   digitalWrite7=0; valve2=0; 
+  } else 
+  {
+   digitalWrite4=0; valve1=0;
+   digitalWrite7=0; valve2=0; 
+  }
+
+/*--------------regulator end-----*/
+ pc.printf("$%d %d %d %d;", valve1*100-110, valve2*100-220, value, sensor_value );       
         
-        ThisThread::sleep_for(2000);                                             // (mc) правильный оператор задержки для mbed5
+        ThisThread::sleep_for(20);                                             // (mc) правильный оператор задержки для mbed5
         led = !led;
     }
 }
\ No newline at end of file