Как приостановить последовательную передачу, а затем отменить ее?
Поэтому я запускаю 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
@Immanuel Jzv, 👍3
Обсуждение1 ответ
Функция delay()
использует прерывание в миллисекундах. Внутри обработчика прерываний все остальные прерывания приостанавливаются, поэтому счетчик millis()
не считается, а функция delay()
никогда не заканчивается. Функция delayMicroseconds()
будет работать в процедуре прерывания, потому что она просто находится в цикле занятости. Перепишите код, чтобы устранить функцию задержки, вы можете использовать миллис, если хотите. Это говорит вам о том, что в функции задержки практически все останавливается до тех пор, пока не будет завершено.
Существует несколько протоколов, которые будут делать то, что вы хотите. Существует аппаратное рукопожатие и последовательное рукопожатие. Эта ссылка многое объясняет и о том, и о том, как работает управление потоком. https://stackoverflow.com/questions/7578812/serial-port-handshake-what-the-difference-between-hardware-and-none-handshaking, @Gil
- Печать string and integer LCD
- Почему мои часы реального времени показывают неверное время с моего ПК?
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Отправьте несколько значений int из Python в Arduino, используя pySerial
- Глобальные переменные занимают много места в динамической памяти.
- (Код ультразвукового датчика: такого файла или каталога нет)
- rfid_default_keys проверить с помощью RC522
- Команда strtok() с Serial связью
1) Вероятно, потому, что
obj_cordinates[4] != 15
Вы не можете использоватьdelay()
для чего-то, что в конечном итоге нуждается в некоторой *приостановке* ..., @DataFiddler