Как приостановить последовательную передачу, а затем отменить ее?

Поэтому я запускаю USB-соединение (UART) с моего Arduino UNO (с использованием библиотеки serialtransfer.h) на мой компьютер (с использованием библиотеки передачи данных pyserial). Вот как проходит ПРЕДПОЛАГАЕМЫЙ цикл кода: Я получаю пакет list_ и сохраняю его в списке на Arduino . Затем элементы в списке проверяются и используются для управления параметрами двигателя a с помощью выводов GPIO. Наконец, отправляется ответное сообщение для подтверждения каждой передачи.

Я надеялся сделать ответное сообщение от Arduino своего рода флагом ; нужно ли ждать или переходить к следующей передаче, это на стороне python.

Однако это не так, поскольку отправка пакетов с Arduino происходит почти мгновенно даже с функциями задержки, и прежде чем Arduino сможет обработать информацию, передача будет выполнена.

1)Почему функция delay() не работает ?

2) Почему код не является последовательным ?

Это сторона Arduino

#include "SerialTransfer.h"


SerialTransfer myTransfer;
int motor1 = 13;
int motor2 = 10;

int obj_cordinates[9];
char reply [16] = {"Packet Recieved"};
void setup()
{
  Serial.begin(115200);
  pinMode(motor1,OUTPUT);
  pinMode(motor2,OUTPUT);
  
  myTransfer.begin(Serial);
}


void loop()
{
  if(myTransfer.available())
  {
    // use this variable to keep track of how many
    // bytes we've processed from the receive buffer
    uint16_t recSize = 0;
    uint16_t sendSize = 0;

    recSize = myTransfer.rxObj(obj_cordinates, recSize);
    sendSize = myTransfer.txObj(reply, sendSize);
    
     if( obj_cordinates[4] == 15) 
    {
      digitalWrite(motor1, HIGH);
      digitalWrite(motor2, LOW);
      
      delay(5000);
      
      digitalWrite(motor1, LOW);
      digitalWrite(motor2, HIGH);
      delay(5000);
    }

    myTransfer.sendData(sendSize);
  }
  
}

Питоновская сторона вещей

import time
from pySerialTransfer import pySerialTransfer as txfer

def Ser_tran_list (list_):

    try:
        link = txfer.SerialTransfer('COM6')  
        link.open()
        time.sleep(2) # allow some time for the Arduino to completely reset

        to_transfer = True
        while to_transfer:
            send_size = 0
            
            # Send a list
            
            list_size = link.tx_obj(list_)
            send_size += list_size
            
            # send a character
            str_ = 'Sending data Packet'
            str_size = link.tx_obj(str_, send_size) - send_size
            send_size += str_size
            link.send(send_size)
            
            while not link.available():
                if link.status < 0:
                    if link.status == txfer.CRC_ERROR:
                        print('ERROR: CRC_ERROR')
                    elif link.status == txfer.PAYLOAD_ERROR:
                        print('ERROR: PAYLOAD_ERROR')
                    elif link.status == txfer.STOP_BYTE_ERROR:
                        print('ERROR: STOP_BYTE_ERROR')
                    else:
                        print('ERROR: {}'.format(link.status))

            # Parse response string
            
            rec_str_   = link.rx_obj(obj_type=type(str_),
                                     obj_byte_size=16,
                                     start_pos=0)
            
            
            # Display the received data
            
            print('SENT: {} {}'.format(list_,str_))
            print('Recieved: {}'.format(rec_str_))
            
            to_transfer = False

, 👍3

Обсуждение

1) Вероятно, потому, что obj_cordinates[4] != 15 Вы не можете использовать delay() для чего-то, что в конечном итоге нуждается в некоторой *приостановке* ..., @DataFiddler


1 ответ


2

Функция delay() использует прерывание в миллисекундах. Внутри обработчика прерываний все остальные прерывания приостанавливаются, поэтому счетчик millis() не считается, а функция delay() никогда не заканчивается. Функция delayMicroseconds() будет работать в процедуре прерывания, потому что она просто находится в цикле занятости. Перепишите код, чтобы устранить функцию задержки, вы можете использовать миллис, если хотите. Это говорит вам о том, что в функции задержки практически все останавливается до тех пор, пока не будет завершено.

,

Существует несколько протоколов, которые будут делать то, что вы хотите. Существует аппаратное рукопожатие и последовательное рукопожатие. Эта ссылка многое объясняет и о том, и о том, как работает управление потоком. https://stackoverflow.com/questions/7578812/serial-port-handshake-what-the-difference-between-hardware-and-none-handshaking, @Gil