Я пытаюсь автоматизировать диспенсер ленты Better Pack BP555eMA, управляя им с ПК с помощью адаптера USB-to-Serial.
Я потратил много времени, пытаясь, и хочу рассказать, как это работает.
Ответ
Протокол (EP1002)
Аппарат использует специальный протокол ASCII.
- Скорость передачи данных: 9600 (стандарт)
- Настройки: 8 бит данных, без четности, 1 стоповый бит (8N1).
- Рукопопожатие ()[/b]: Вы ДОЛЖНЫ сначала отправить эту команду, чтобы «разбудить» машину. Он не будет реагировать на команды выдачи, пока не получит их.
Код: Выделить всё
@1T - Выдача ()[/b]: формат @1D, за которым следует длина в «отсчетах».
Код: Выделить всё
@1D...- Преобразование: ~4 отсчета на см (точно 61 отсчет = 6 дюймов / 15,24 см).
- Пример: для распределения 20 см -> 20 * 4 = 80 -> Отправить @1D80.
- Терминатор: Все команды должны заканчиваться ().
Код: Выделить всё
\r\n
Полезно для автономных серверов или фоновых сценариев.
Код: Выделить всё
import serial
import time
# Configure Port (Try 9600 first, then 2400)
ser = serial.Serial('COM3', 9600, timeout=1)
# 1. Handshake (Required)
ser.write(b'@1T\r\n')
time.sleep(0.5) # Wait for machine to initialize
# 2. Dispense 20cm
# 20cm * 4 counts/cm = 80 counts
ser.write(b'@1D80\r\n')
ser.close()
Решение без установки: Работает непосредственно в Chrome/Edge без какого-либо внутреннего сервера.
Код: Выделить всё
Connect
Dispense 20cm
let writer;
async function connect() {
// User selects port
const port = await navigator.serial.requestPort();
await port.open({ baudRate: 9600 });
const textEncoder = new TextEncoderStream();
const writableStreamClosed = textEncoder.readable.pipeTo(port.writable);
writer = textEncoder.writable.getWriter();
// Handshake
await writer.write("@1T\r\n");
}
async function dispense(cm) {
if (!writer) return alert("Connect first!");
const counts = Math.floor(cm * 4);
await writer.write(`@1D${counts}\r\n`);
}
document.getElementById('connectBtn').addEventListener('click', connect);
Подробнее здесь: https://stackoverflow.com/questions/798 ... -and-web-s
Мобильная версия