Тонкости работы с COM портом
Модератор: Модераторы
Нет счетчик СЭТ-4ТМ.
А что эта команда даст ls /dev/ttyUSB*? Я вроде написал "ls /dev/ttyUSB0". А должна эта строчка устройства белой подсвечиваться в mc? Вот например как там @cdrom подсвечивается...?
Почему то в /dev есть только один USB0, хотя к USB порта подключена мышь и оптопорт?
А что эта команда даст 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
- Контактная информация:
воткни устройство и посмотри что выведет тебе dmesg какой там название будет тако и пробуй использовать.
сунасер по умолчанию работает только с ttyS но это правится, правкой одной строки.
Добавлено спустя 2 минуты 20 секунд:
мышь имеет другое имя /dev/input/xxxx
сунасер по умолчанию работает только с ttyS но это правится, правкой одной строки.
Добавлено спустя 2 минуты 20 секунд:
dionic писал(а):мышь
мышь имеет другое имя /dev/input/xxxx
У меня вот такую строку выводит 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, подскажите плиз народ.
А строчку вот эту нужно исправить:
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
- Контактная информация:
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 функции открыть\читать\писать\закрыть там все это есть.
Вроде бы в модуле 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
- Контактная информация:
serg_iv писал(а):в общем то эт лишнее, synaser понимает и явное указание - /dev/ttyUSB0
зачем лудей вводишь в заблуждение посмотри реализацию Connect в линуксе. зачем там так сделано не знаю, но сделано =)
-
sergeypankov
- незнакомец
- Сообщения: 8
- Зарегистрирован: 11.07.2009 23:20:52
Здравствуйте! Я новичок в Lazarus, программировал под Delphi. Нашел тут инфо о компоненте cportlaz для Lazarus. Скачал. А каким образом его установить? Открываю в Lazarusе файл CPortLib10.lpk в появившемся окне нажимаю compile, компилятор пишет Can not find unit libc used by CPort. Что это за ошибка и где можно достать этот Unit. Компонент Cport мне нравится, под Delphi работал с ним успешно. Lazarus установлен в ОС Ubuntu.
зачем лудей вводишь в заблуждение посмотри реализацию Connect в линуксе. зачем там так сделано не знаю, но сделано =)
Но у меня именно так работает, только железка висит на /dev/ttyACM0
- Attid
- долгожитель
- Сообщения: 2588
- Зарегистрирован: 27.10.2006 17:29:15
- Откуда: 44°32′23.63″N 41°2′25.2″E
- Контактная информация:
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;
хм. а вообще да будет работать
serg_iv писал(а):/dev/ttyACM0
сотовый телефон ?
сотовый телефон ?
Нее, разрабатывать начал устройство ввода - вывода, а с писанием драйверов заморачиваться очень не хочется
-
sergeypankov
- незнакомец
- Сообщения: 8
- Зарегистрирован: 11.07.2009 23:20:52
Может вопрос не сюда, но кто нибудь пробовал устанавливать визуальный компонент Cportlaz в Lazarus под Linux? В Lazarus под винду встал без проблем, а под Linux ни в какую не хочет.Сначала писал что не найдены модули libc, установил пакет fp-units-i386, теперь вот не может найти модули Windows а где ж их взять в Linuxe, не из винды же тащить.
Вопрос глуп, не внимательно посмотрел на страничке загрузки, что компонент переделан только под Lazarus для Linux.
Вопрос глуп, не внимательно посмотрел на страничке загрузки, что компонент переделан только под Lazarus для Linux.
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;
хм. а вообще да будет работатьстроку с 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). "
sergeypankov писал(а):Может вопрос не сюда, но кто нибудь пробовал устанавливать визуальный компонент Cportlaz в Lazarus под Linux? В Lazarus под винду встал без проблем, а под Linux ни в какую не хочет.Сначала писал что не найдены модули libc, установил пакет fp-units-i386, теперь вот не может найти модули Windows а где ж их взять в Linuxe, не из винды же тащить.
Если в Linux компонент просит модуль Windows - это должно насторожить! Действительно ли данный компонент написан и под эту систему
- Attid
- долгожитель
- Сообщения: 2588
- Зарегистрирован: 27.10.2006 17:29:15
- Откуда: 44°32′23.63″N 41°2′25.2″E
- Контактная информация:
sergeypankov
скорее всего он только под венду.
dionic
смотрим внимательно FComNr останется -1
тогда первая стока выполнется, а третья нет (PortIsClosed = -1 это константа)
опять же внимательнее я сказал
размер имеет значение, хотя компонет сам сказал
только верхний регистр. думаю он проверяет это по первому слешу, проверять лень.
скорее всего он только под венду.
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)
только верхний регистр. думаю он проверяет это по первому слешу, проверять лень.
Простите неуча
жестоко ошибался... Attid был прав. Как в первом случае, если указать /dev/ttyUSB0, так и во втором, если указать COM1 под Linux.
Через RS-232 все работает ОК,а вот, когда я начинаю работать через USB, и подключаю туда свой счетчик, Linux его определят на ttyUSB0. Посылаю туда данные, synaser создает файл /var/lock/LK..USB0 и записывает их туды. А когда начинаю опрашиват, то данных там нет, прога виснет , видимо на таймауте. Возможно у меня какие-то настройки не выставлены для работы с USB, ну там биты четности и т.д. Хотя под Windows с теми же настройками работает и с COM портом и с USB (с виртуальным COM портом). Ладно всем спасибо за помощь... Будем разбираться дальше
Через RS-232 все работает ОК,а вот, когда я начинаю работать через USB, и подключаю туда свой счетчик, Linux его определят на ttyUSB0. Посылаю туда данные, synaser создает файл /var/lock/LK..USB0 и записывает их туды. А когда начинаю опрашиват, то данных там нет, прога виснет , видимо на таймауте. Возможно у меня какие-то настройки не выставлены для работы с USB, ну там биты четности и т.д. Хотя под Windows с теми же настройками работает и с COM портом и с USB (с виртуальным COM портом). Ладно всем спасибо за помощь... Будем разбираться дальше
