COM порт

WMix

герр M:)ller
Партнер клуба
хотим купить весы, которые подают вес на COM порт...
хотел спросить, правильно ли я думаю, что прочесть что подается на порт можно легко с помощью
PHP:
cat /dev/ttyS0
далее вопрос как это получить результат
PHP:
$result = exec('cat /dev/ttyS0 > /path/to/file &');
и далее читать его, или можно просто подменить stdout и получить результат... или может все еще проще, и просто вторым аргументом команды exec можно получить вес...

я не очень понимаю как работает com порт это всего одна цифра или это непрерываемый поток...
 

WMix

герр M:)ller
Партнер клуба
классная ссылка, правда там чтото про железо написано и протоколы, мне кажется на моем уровне будет конечное число, вопрос только это число будет непрерывным потоком или всеже на каждое обращение будет всего одно число,.. (есть предположение что это от весов зависит) .. будут весы разберусь конечно, сейчас хотелось бы просто только чтоб заранее представлять ....
 

Ragazzo

TDD interested
WMix
com порт это всего одна цифра или это непрерываемый поток..
что значит одна цифра? :S вообще все используют обертки, ну или возьми делфи какую-то там вроде есть компонент которому выставляешь старт-стоп биты и частоту он и работает.
 

fixxxer

К.О.
Партнер клуба
да никакого там класса не нужно, просто fopen('/dev/ttyXN')

ну еще сначала командой stty настроить скорость и все такое, если дефолты не устраивают
 

WMix

герр M:)ller
Партнер клуба
ну чтож подержал весы, читать умею, тестовый скриптик выглядит так
PHP:
$device = "/dev/ttyS0";
// настройка
exec('stty -F '.$device.' 600 -parenb cs8 -cstopb time 2');
$dh = fopen($device, "r+b");
$count=0;
$last=0;

 // пока не устаканиться
do{
  fwrite($dh, "\x1B\x70"); // взвешивай
  $weight=(float)str_replace(" kg","",trim(fgets($dh))); // сколько получилось
  if ( $weight > 0 &&  $last == $weight  )  {
    $count++;
  }
  elseif($weight >0) {
    $last = $weight;
    $count = 1;
  }
  else $count = 0;
}while($count<3);

fclose($dh);
echo $weight;
вот теперь думаю: сервер в бюро, взвешивать будут в другом месте, можно ли com перебросить как-нибуть по сети (сервер знает удаленный комп по имени и находится в одной сетке), или настраивать новый сервер и аяксом или ws долбить?
 

С.

Продвинутый новичок
А весы у тебя отдельным проводком из бюро до "другого места" будут соеденены?
 

WMix

герр M:)ller
Партнер клуба
А весы у тебя отдельным проводком из бюро до "другого места" будут соеденены?
вот поэтому и думаю
весы и принтеры подключены к рабочему месту, на принтер кидаю по cups задачи на печать, осталось порт перекинуть,
нашел скриптик, только не понимаю
как это работает < $SERIAL_PORT > $SERIAL_PORT, после буду думать.
Код:
#!/bin/sh

TCP_PORT=4000
SERIAL_PORT=/dev/ttyS1
BAUDRATE=19200

while (true)
        do
        (stty $BAUDRATE -echo clocal raw pass8 ; exec nc -l -p $TCP_PORT) \
                < $SERIAL_PORT > $SERIAL_PORT
done
хотел спросить, а как вы бы это замутили?
 

С.

Продвинутый новичок
Очевидно, что весы будут подключены к рабочему месту. Другие варианты не имеет смысла рассматривать. Соответственно напрашиватся какое-то клиентское ПО, которое скажем будет заполнять поле в форме. Форма уходит на сервер с весом и прочими реквизитами.
 

WMix

герр M:)ller
Партнер клуба
вся прога в броузере, общаются по wifi, все уже давно работает, только вес ручками вбивали.

мысль была такая, что чел сканит баркод, это дает событие ENTER, запускается аякс, (запрос активирует весы) и они начинают выжидать (пикать) пока вес не 0 и не устаканился (пикать баркод можно непосредственно на весах),

ну а дальше просто собрать данные воедино, либо вернуть аяксу и запостить форму, либо аякс уже кинул форму и сервер ожидает весы перед записью.

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

линк позже погляжу, спасибо
 

WMix

герр M:)ller
Партнер клуба
кажись понял
Код:
$ man nc 
NAME
       nc - TCP/IP swiss army knife

SYNOPSIS
       nc [-options] hostname port[s] [ports] ...
       nc -l -p port [-options] [hostname] [port]

DESCRIPTION

netcat  is  a simple unix utility which reads and writes data across network connections, using TCP or
       UDP protocol. It is designed to be a reliable "back-end" tool that can  be  used  directly  or  easily
       driven  by  other  programs and scripts.  At the same time, it is a feature-rich network debugging and
       exploration tool, since it can create almost any kind of connection you would  need  and  has  several
       interesting  built-in  capabilities.  Netcat, or "nc" as the actual program is named, should have been
       supplied long ago as another one of those cryptic but standard Unix tools. 
...
а это же ввод < и вывод >
< $SERIAL_PORT > $SERIAL_PORT...
и все доступно по 4000 порту, должно быть просто
 

WMix

герр M:)ller
Партнер клуба
fixxxer
nc рулит, и ява не нужна!
Код:
#!/bin/sh

TCP_PORT=4000
SERIAL_PORT=/dev/ttyS0

while (true)
        do
        (stty -F $SERIAL_PORT 600 -parenb cs8 -cstopb time 2 ; exec nc -l -p $TCP_PORT) \
                < $SERIAL_PORT > $SERIAL_PORT
done
PHP:
//$device = "/dev/ttyS0";
// настройка
//exec('stty -F '.$device.' 600 -parenb cs8 -cstopb time 2'); // этот кусок на компе уже строится
// малюсенькое изменение
$dh = fsockopen("удаленный комп с весами", 4000, $errno, $errstr, 30); //fopen($device, "r+b");
$count=0;
$last=0;

 // пока не устаканиться
do{
  fwrite($dh, "\x1B\x70"); // взвешивай
  $weight=(float)str_replace(" kg","",trim(fgets($dh))); // сколько получилось
  if ( $weight > 0 &&  $last == $weight  )  {
    $count++;
  }
  elseif($weight >0) {
    $last = $weight;
    $count = 1;
  }
  else $count = 0;
}while($count<3);

fclose($dh);
echo $weight;
 
Сверху