Тонкости работы с COM портом

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

dionic
новенький
Сообщения: 90
Зарегистрирован: 17.06.2009 21:00:08

Сообщение dionic »

Нет счетчик СЭТ-4ТМ.

А что эта команда даст ls /dev/ttyUSB*? Я вроде написал "ls /dev/ttyUSB0". А должна эта строчка устройства белой подсвечиваться в mc? Вот например как там @cdrom подсвечивается...?

Почему то в /dev есть только один USB0, хотя к USB порта подключена мышь и оптопорт?
Аватара пользователя
Attid
долгожитель
Сообщения: 2588
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

воткни устройство и посмотри что выведет тебе dmesg какой там название будет тако и пробуй использовать.

сунасер по умолчанию работает только с ttyS но это правится, правкой одной строки.

Добавлено спустя 2 минуты 20 секунд:
dionic писал(а):мышь

мышь имеет другое имя /dev/input/xxxx
dionic
новенький
Сообщения: 90
Зарегистрирован: 17.06.2009 21:00:08

Сообщение dionic »

У меня вот такую строку выводит dmesg FTDI USB Serial Device converter now attached to ttyUSB0. Это как я понимаю у меня произошло подсоединение к ttyUSB0 моего датчика.

А строчку вот эту нужно исправить:
FDevice := '/dev/ttyS' + IntToStr(FComNr) на FDevice := '/dev/ttyUSB' + IntToStr(FComNr)?
Вроде бы в модуле synaser исправил все строчки где встречается '/dev/ttyS', даже номер устройства теперь определяет правильно, а открывать этот порт все равно не хочет...

А как работать (с помощью каких функций) работать с портом если не через synaser, подскажите плиз народ.
Аватара пользователя
Attid
долгожитель
Сообщения: 2588
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

dionic писал(а):FDevice := '/dev/ttyS' + IntToStr(FComNr) на FDevice := '/dev/ttyUSB' + IntToStr(FComNr)?

ну я бы менял уневерсально

Код: Выделить всё

FDevice := comport;

пишу по памяти как точно зовется переменная не помню.

а весь код с FComNr выкинул бы.

dionic писал(а):а открывать этот порт все равно не хочет...

так и говорит "не хочу" ?

может линь не те драйвера ему сует попробуй поработать с портом из консоли

читать их порта
cat /dev/ttyUSB0

писать
echo AT+ > /dev/ttyUSB0

если так не будет работать то никак не будет работать =)

dionic писал(а):А как работать (с помощью каких функций) работать с портом если не через synaser, подскажите плиз народ.

открываешь код синасера и смотришь, тебе надо всего 4 функции открыть\читать\писать\закрыть там все это есть.
serg_iv
постоялец
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

Сообщение serg_iv »

Вроде бы в модуле synaser исправил все строчки где встречается '/dev/ttyS', даже номер устройства теперь определяет правильно, а открывать этот порт все равно не хочет...

в общем то эт лишнее, synaser понимает и явное указание - /dev/ttyUSB0
а пример простой пожалста:

Код: Выделить всё

//инициализация последовательного порта
  ser:=TBlockserial.Create; //создаем устройство
  ser.RaiseExcept:=false;   //не обрабатываем исключения ошибок связи
  ser.Connect('/dev/ttyUSB0');      //соединяемся с портом
  ser.Config(115200,8,'N',0,false,false);//настраиваем скорость, стоп биты, паритет
  //пересылаем данные
  ser.SendInteger(data);
  //принимаем данные от устройства
  a:=ser.RecvInteger(4);
  ser.Free;//освобождаем устройство

Так как порт используется USB, с настройками скорости паритетов и пр. можешь не париться, используй любые
Аватара пользователя
Attid
долгожитель
Сообщения: 2588
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

serg_iv писал(а):в общем то эт лишнее, synaser понимает и явное указание - /dev/ttyUSB0

зачем лудей вводишь в заблуждение посмотри реализацию Connect в линуксе. зачем там так сделано не знаю, но сделано =)
sergeypankov
незнакомец
Сообщения: 8
Зарегистрирован: 11.07.2009 23:20:52

Сообщение sergeypankov »

Здравствуйте! Я новичок в Lazarus, программировал под Delphi. Нашел тут инфо о компоненте cportlaz для Lazarus. Скачал. А каким образом его установить? Открываю в Lazarusе файл CPortLib10.lpk в появившемся окне нажимаю compile, компилятор пишет Can not find unit libc used by CPort. Что это за ошибка и где можно достать этот Unit. Компонент Cport мне нравится, под Delphi работал с ним успешно. Lazarus установлен в ОС Ubuntu.
serg_iv
постоялец
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

Сообщение serg_iv »

зачем лудей вводишь в заблуждение посмотри реализацию Connect в линуксе. зачем там так сделано не знаю, но сделано =)

Но у меня именно так работает, только железка висит на /dev/ttyACM0
Аватара пользователя
Attid
долгожитель
Сообщения: 2588
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

serg_iv писал(а):Но у меня именно так работает, только железка висит на /dev/ttyACM0


Код: Выделить всё

procedure TBlockSerial.Connect(comport: string);
begin
  FDevice := comport;
  GetComNr(comport);
{******}
  if FComNr <> PortIsClosed then
    FDevice := '/dev/ttyS' + IntToStr(FComNr);
  FHandle := THandle(Libc.open(pchar(FDevice), O_RDWR or O_SYNC));
{******}
end;



Код: Выделить всё

procedure TBlockSerial.GetComNr(Value: string);
begin
  FComNr := PortIsClosed;
  if pos('COM', uppercase(Value)) = 1 then
    FComNr := StrToIntdef(copy(Value, 4, Length(Value) - 3), PortIsClosed + 1) - 1;
  if pos('/DEV/TTYS', uppercase(Value)) = 1 then
    FComNr := StrToIntdef(copy(Value, 10, Length(Value) - 9), PortIsClosed - 1);
end;


хм. а вообще да будет работать :oops: строку с if я не приметил, так что можно ничего не править и даже указывать в линуксе COM1 и будет подключение к ttyS0. забавно.

serg_iv писал(а):/dev/ttyACM0

сотовый телефон ?
serg_iv
постоялец
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

Сообщение serg_iv »

сотовый телефон ?

Нее, разрабатывать начал устройство ввода - вывода, а с писанием драйверов заморачиваться очень не хочется
sergeypankov
незнакомец
Сообщения: 8
Зарегистрирован: 11.07.2009 23:20:52

Сообщение sergeypankov »

Может вопрос не сюда, но кто нибудь пробовал устанавливать визуальный компонент Cportlaz в Lazarus под Linux? В Lazarus под винду встал без проблем, а под Linux ни в какую не хочет.Сначала писал что не найдены модули libc, установил пакет fp-units-i386, теперь вот не может найти модули Windows а где ж их взять в Linuxe, не из винды же тащить.

Вопрос глуп, не внимательно посмотрел на страничке загрузки, что компонент переделан только под Lazarus для Linux.
dionic
новенький
Сообщения: 90
Зарегистрирован: 17.06.2009 21:00:08

Сообщение dionic »

Attid писал(а):
serg_iv писал(а):Но у меня именно так работает, только железка висит на /dev/ttyACM0


Код: Выделить всё

procedure TBlockSerial.Connect(comport: string);
begin
  FDevice := comport;
  GetComNr(comport);
{******}
  if FComNr <> PortIsClosed then
    FDevice := '/dev/ttyS' + IntToStr(FComNr);
  FHandle := THandle(Libc.open(pchar(FDevice), O_RDWR or O_SYNC));
{******}
end;



Код: Выделить всё

procedure TBlockSerial.GetComNr(Value: string);
begin
  FComNr := PortIsClosed;
  if pos('COM', uppercase(Value)) = 1 then
    FComNr := StrToIntdef(copy(Value, 4, Length(Value) - 3), PortIsClosed + 1) - 1;
  if pos('/DEV/TTYS', uppercase(Value)) = 1 then
    FComNr := StrToIntdef(copy(Value, 10, Length(Value) - 9), PortIsClosed - 1);
end;


хм. а вообще да будет работать :oops: строку с if я не приметил, так что можно ничего не править и даже указывать в линуксе COM1 и будет подключение к ttyS0. забавно.

serg_iv писал(а):/dev/ttyACM0

сотовый телефон ?


Просто интересно, а как у вас произойдет подсоединение к порту USB, если код синасера не переделывать , а просто написать /dev/ttyUSB0 ну или /dev/ttyACMO, ведь номер то устройства функция GetComNr не определит, потому что не найдет там в вашем переменной value выражение '/dev/TTYS' , а следовательно и не присвоит номер переменной FComNr и она останется равной -1 (присвоена в конструкторе create)...
И к тому же в линуксе ,даже в синасере описано надо указывать только /dev/ttyS*, для того чтобы правильно подключится к com порту, и нельзя указать com1.

"Connects to the port indicated by comport. Comport can be used in Windows style (COM2), or in Linux style (/dev/ttyS1). "
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

sergeypankov писал(а):Может вопрос не сюда, но кто нибудь пробовал устанавливать визуальный компонент Cportlaz в Lazarus под Linux? В Lazarus под винду встал без проблем, а под Linux ни в какую не хочет.Сначала писал что не найдены модули libc, установил пакет fp-units-i386, теперь вот не может найти модули Windows а где ж их взять в Linuxe, не из винды же тащить.

Если в Linux компонент просит модуль Windows - это должно насторожить! Действительно ли данный компонент написан и под эту систему :wink:
Аватара пользователя
Attid
долгожитель
Сообщения: 2588
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

sergeypankov
скорее всего он только под венду.

dionic
смотрим внимательно FComNr останется -1

тогда первая стока выполнется, а третья нет (PortIsClosed = -1 это константа)

Код: Выделить всё

  FDevice := comport;
  if FComNr <> PortIsClosed then
    FDevice := '/dev/ttyS' + IntToStr(FComNr);


dionic писал(а):и нельзя указать com1.

опять же внимательнее я сказал
Attid писал(а):даже указывать в линуксе COM1

размер имеет значение, хотя компонет сам сказал
dionic писал(а):Comport can be used in Windows style (COM2)

только верхний регистр. думаю он проверяет это по первому слешу, проверять лень.
dionic
новенький
Сообщения: 90
Зарегистрирован: 17.06.2009 21:00:08

Сообщение dionic »

Простите неуча :( жестоко ошибался... Attid был прав. Как в первом случае, если указать /dev/ttyUSB0, так и во втором, если указать COM1 под Linux.

Через RS-232 все работает ОК,а вот, когда я начинаю работать через USB, и подключаю туда свой счетчик, Linux его определят на ttyUSB0. Посылаю туда данные, synaser создает файл /var/lock/LK..USB0 и записывает их туды. А когда начинаю опрашиват, то данных там нет, прога виснет , видимо на таймауте. Возможно у меня какие-то настройки не выставлены для работы с USB, ну там биты четности и т.д. Хотя под Windows с теми же настройками работает и с COM портом и с USB (с виртуальным COM портом). Ладно всем спасибо за помощь... Будем разбираться дальше :)
Ответить