Rasberry PI PICO (RP2040) продолжение темы


Repeat_Ask_MPos:

        SoftSerial1.println("GRBL <- ?");
        Serial2.write(0x3f);  // отправка команды ? в GRBL
        Serial2.write(0x0d);
        Serial2.write(0x0a);

next_wait: 
        Wait_Reply();  
        if (Byte_Count < 10) goto next_wait;  // совсем короткий ответ нам не нужен


//--------------------------------------------------------------------------
void Wait_Reply()
// ожидание ответа OK из GRBL
{
int i;
unsigned long S_Time;  // начальное время ожидания ответа
unsigned long Wait_Time; // интервал ожидания ответа в миллисек
uint8_t Byte_Buf;

Byte_Count = 0;
Wait_Time = 1500;
S_Time = millis();
Rep_From_Laser = "";

wait_OK1:
         if (  (millis() - S_Time) > Wait_Time ) goto No_Wait2;
         if (  Serial2.available() )
           {  
              Byte_Buf = Serial2.read(); // приняли байт из GRBL
              Byte_Count++;
              Rep_From_Laser += (char) Byte_Buf; 
                 if (  
                      (Byte_Buf == 0x0d)
                      &
                       (Byte_Count == 3)
                    )
                    { 
                      Byte_Buf = Serial2.read();  // это прочитали 0x0a
                      // надо из начала буфера Rep_From_Laser
                      // вырезать первые три байта   o   k   0x0d
                      Rep_From_Laser = Rep_From_Laser.substring(3);
                      SoftSerial1.println("  ok  ");
                      OK_Count++;  // счетчик ответов ok из GRBL
                      goto No_Wait2;
                    } 
              delay(5);
              goto wait_OK1; 
           }
No_Wait2: SoftSerial1.println();
          SoftSerial1.print("Wait reply - GRBL -> ");
          SoftSerial1.println(Rep_From_Laser);
          SoftSerial1.print(" Byte_Count = ");
          SoftSerial1.println(Byte_Count,DEC);
//------------------------------------------------------------------------

и вот этот счетчик - Byte_Count не превышает 32 , хотя входные данные большей длины

в итоге принимается вот это - <Idle|MPos:6.000,3.000,0.000|FS

Японский городовой!… Как у вас мозги с этими кучами гоу-ту на бикрень не съехали?

Это ни о чем не говорит.
Что в строке Rep_From_Laser (без всяких махинаций с ней) смотрели?

И зачем вы используете Делей в таком месте? 5 миллисекунд достаточно мало для человека, а вот для мк - достаточно много. Уберите его вообще!

Почему вы в 40й строке опять читаете буфер, но ничего с полученными данными не делаете? Вы же его этим просто опустошаете.

Выкиньте (закомментируйте) строки с 34 по 48 (включительно) и посмотрите на результат (каунт и что в строке будет).

Я раньше писал на Ассемблере, это тот еще стиль.

Иногда от модуля GRBL приходят 4 байтовые ответы вида ok 0x0d 0x0a эти пакеты мне не нужны, поэтому если принято 3 байта, и третий из них 0xod то четвертый просто читается в воздух, чтобы убрать его из входного буфера, а первые три, которые уже в буфере , вырезаются.

Поспорить можно в платном разделе «Ищу исполнителя», я в этом участвовать не имею желания.

Не анализируя весь код,

Если вопрос, как увеличить размер буфера UART, то перед Serial2.begin можно вызвать Serial2.setFIFOSize(64)

гениально!
еще можно читать первые два, и если это “ok” пропускать последующие два.
ладно, это так…

Serial.setRxBufferSize(800);

В скобках указываешь размер буфера в байтах

Вы сами-то не видите, что тут написана полная ерунда?

Если модуль работает “строго на 115200” - значит он никак не может “пулять разом”. Ничего не “разом”, а строго на тех же 115200. В частности передача этой строчки займет примерно 4 - 4.5 мс, что совсем не мгновенно и оставляет достаточно времени, чтобы эти данные разобрать.

@SAB
Зря вы ему. уважемый, дали подсказку про буфер. ТС-у было бы полезнее научиться принимать и обрабатывать пакеты по месту, а не накапливать их в буфере.

Согласен. Тем более речь идет о GRBL. Помещать данные с него в буфер - обеспечивать задержку анализа входящих данных. Потом удивляются что при нажатии кнопки аварийной остановки станок продолжает еще работать несколько секунд/минут ломая все что можно и нельзя.

Главное чтобы “нерадивого” не наматывал на валы… ((

Вопрос про максимальный ток пинов RP2040. По умолчанию стоит 12 мА на пин. Удавалось ли кому нибудь изменить этот параметр , по документации есть значения 2,4,8,12 мА. В даташите это раздел 2.19.4. Статус битов , задающих ток - RW, прочитать их удается , изменить нет. Возможно, они в ROM памяти находятся , тогда зачем для них RW указано?

В пакете для Ардуино от Phill, при вызове pinMode можно указать варианты OUTPUT, OUTPUT_2MA, OUTPUT_4MA, OUTPUT_8MA, OUTPUT_12MA и по умолчанию (просто OUTPUT) используется OUTPUT_4MA. Посмотрите, как там сделано.

Спасибо, посмотрю .

А зачем принудительно уменьшать ток пина. Это что, защита какая то от взлома? Может ещё какая то в этом нужда, расскажите.

Я собираю схемы на макетке с обычным шагом 2.54. Если есть свободные пины и необходимость какие-то сигналы визуально проверить, использую SMD 0805 разноцветные светодиоды, они хорошо встают на две соседних точки платы., для них 2 ма вполне достаточно. У разных цветов разные напряжения, от 1.8 у красных до более 2 вольт у других цветов. Заниматься подбором SMD резисторов-довесков для них лениво, поэтому возникла идея просто опустить ток пина до 2 ма, и если этот пин используется только для индикации, то просевшее на нем напряжение до примерно 2 вольт несущественно, важно внутрисхемное ограничение тока. Тогда можно обойтись без резисторов. Буду пробовать.

Еще вариант - если с пина управлять светодиодом в оптроне, то, полагаю, 4 ма может хватить, тоже без довесков. Но это проверю позже.


такое пользую на макетках.

Проверил, на моих китайских клонах ограничения тока нет. Хотя скомпилировалось без ошибок. Готовая планка со светодиодами это вариант, но иногда, по месту , нужен один или два светодиода, в середине платы.

Да ставь следом за светодиодом так же резистор 0805 на 1кОм. Ничего подбирать не нужно.