Как принять данные с COM-порта, используя Synaser?
IdHTTPServer, как принять данные с порта?
Как принять данные с порта, XE8, на с++ 6.0 принимал так void __fastcall.
Как принять данные из com-порта, посылаемые из Windows?
Есть 2 ПК — на одном установлена ОС Debian Linux на другом Windows XP. COM-порты этих ПК соединены.
Принять данные с одного порта, распарсить и отправить на другой порт
Доброго времени суток, уважаемые! Второй день сижу над задачей сам себя уже запутал читая все.
Как принять число из последовательного порта и отобразить его в edit_box?
Как принять число из последовательного порта и отобразить его?Работаю с помощью CreateFile и.
Теперь мне нужно постоянно слушать порт и выводить принятые данные. Не получается отследить факт приёма портом байта/пакета байт, т. к. функции WaitingData и RecvByte в отсутствие принятых данных всё равно возвращают какой-то «мусор». Как от него избавиться или как отследить факт приёма портом байта/пакета байт с последующим выведением его в Edit?
Вложения
synaser.zip (31.3 Кб, 46 просмотров) |
Размещаю на форме TComPort и TComComboBox
Настраиваю порт (ControlRTS у меня rtsToogle, т.к. управляю через RTS направлением передачи RS485, Parity оставляю по умолчанию). Основные настройки подчёркнуты, у вас может быть по другому.
Компиляция пакета CPortLib10 1.0: Код завершения 1, ошибок: 3
CPortCtl.pas(97,19) Error: No property found to override
CPortCtl.pas(97,19) Error: This kind of property cannot be published
CPortCtl.pas(97,19) Fatal: Syntax error, «READ» expected but «;» found
Ну да ладно, продолжу изучение synaser, я к нему уже и привыкнуть успел.
Вот и я столкнулся с такой же проблемой. Как определить начало и конец пакета, если его длина заранее неизвестна? К примеру, сейчас я отправляю с терминалки строку 123456789. Та же терминалка принимает её как одно целое, а у меня одна процедура принимает эту строку кусками, а другая «склеивает» две строки вместе или вообще теряет часть данных, если отправить их сразу одну за другой. Пробовал поиграться с интервалом таймера, таймаутами — добился лишь незначительного улучшения.
Вот справка по функциям synaser:
function CanRead(Timeout: integer): boolean; virtual;
Returns True, if you can from read any data from the port. Status is tested for a period of time given by the Timeout parameter (in milliseconds). If the value of the Timeout parameter is 0, the status is tested only once and the function returns immediately. If the value of the Timeout parameter is set to -1, the function returns only after it detects data on the port (this may cause the process to hang).
function RecvByte(timeout: integer): byte; virtual;
Waits until one data byte is received which is returned as the function result. If no data is received within the Timeout (in milliseconds) period, LastError is set to ErrTimeout.
function RecvPacket(Timeout: Integer): AnsiString; virtual;
Read all available data and return it in the function result string. This function may be combined with Recvstring, RecvByte or related methods.
function WaitingData: integer; virtual;
Returns the number of received bytes waiting for reading. 0 is returned when there is no data waiting.
Получается, что нужно замерять временной интервал между каждым принятым байтом, да ещё и в зависимости от скорости передачи? Прав я или не прав?
Ну и наконец — как всё это дело реализовать?
5dpo: чтение данных из Serial port
Неблокирующее чтение с Serial Port Perl
Только начал изучать perl. Требуется написать модуль к проекту. В модуле должны быть реализованы.
Serial Port — прием данных
Добрый вечер! Пишу программу для работы с последовательным портом. Не работает прием данных. Также.
Serial port прием и вывод чистых данных
Всем привет столкнулся с такой проблемой, как прием данных через СОМ порт и вывод их на форму.
Вывод данных из Serial Port в Linux в файл
Требуется считывать данные из COM-порта в тестовый файл. Данные туда попадают от Arduino UNO. .
=== ЛОГ:
СОМ1: 9600бод OnLine: 24.10.2017 2:15:25
+++ati
Модем в режим команд
Команда модему:at
Ответ модема:
at
Модем в режим команд
Команда модему:ati
Ответ модема:
ati
— Сеанс завершен: 24.10.2017 2:16:11
Сохранено в H:\WZ\Lazarus_14\COM_P_RS232_(2)\20171024_021611.log
=======
То есть последнюю команду модем просто не увидел?
Что не так?
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.
Работа Scilab Serial Port Library (COM port)
Как работает Scilab Serial Port Library ? (может кто то встречал описание подробное, поделитесь.
Как настраивать serial port под Linux для приёма данных от Arduino Uno
Здравствуйте! Есть устройство на базе Arduino Uno с которым ПК с Линкусом ( Федора ).
Как настраивать serial port под Linux для приёма данных от Arduino Uno
Здравствуйте! Есть устройство на базе Arduino Uno с которым ПК с Линкусом ( Федора ).
serial port
Здравствуйте. Использую стандартные классы .net для работы с ком портом. Работу с портом.
INT 21h
Lazarus: работа с последовательным портом
Чтобы передать моему устройству информацию по UART и не придумывать очередной велосипед (а велосипедистов в Lazarus тьма просто), я использую уже готовую мультиплатформенную библиотеку Synaser. Ее даже устанавливать не надо. Просто распакуйте в директорию с программой и добавьте ее в Uses.
Кстати, чтобы программа собралась под Linux, мне пришлось наложить небольшой патч. Откройте файл synaser.pas и исправьте строку 1902 с SerialCheck(fpioctl(FHandle, TCFLSH, Pointer(TCIOFLUSH))); на SerialCheck(fpioctl(integer(FHandle), TCFLSH, Pointer(TCIOFLUSH))); . Ошибка не страшная, но запутать вопросом “какого хрена не собирается?!” может.
На сайте библиотеки есть примеры использования, но они не охватили использование обработчиков ошибок. А они ой как полезны! Например, возмем уже известный пример и добавим в него проверку на ошибки.
Программа отправит что-то микроконтроллеру и что-то должна получить в ответ. Скорость 9600 обычно стоит везде по умолчанию. Ее выбираю и я для своих устройств ser.config(9600,8,’N’,0,false,false); . Чтобы обработать ошибочные ситуации в библиотеке есть переменные с ошибкой последнего действия. Я не стал делать exit из try сразу, но правильней было бы выйти сразу же при ошибке, но это вы уже сами сделаете в своих программах, а сейчас главное узнать о возможностях. LastError хранит 0, если последний вызов функций библиотеки был без ошибок, а LastErrorDesc покажет вам объяснение что именно случилось. Ну и конечно в конце полученный ответ возвращаем туда, откуда вызвали функцию send.
Обращаю ваше внимание на то, что у микроконтроллеров, работающих на некоторых частотах, возможны сбои при передачи информации! Иногда пакет с данными нужно отправлять дважды. Изучите таблицы 6-2 Determining Baud Rate на этой странице. По ним вы можете подобрать соответствующий кварц и режим работы, чтобы ошибок не было совсем.
Получение списка доступных COM портов
Получение списка доступных COM портов
Всем здравствуйте. Не могу выделить в отдельную функцию работающий код. Всё что написано в.
Получение списка доступных шрифтов
Как получить список установленных в системе шрифтов?
Получение списка доступных Wi-Fi сетей и подключение к выбранной сети
Здравствуйте, уважаемые форумчане! Googl’ил — Муглил, но ответа пока не нашёл, а вопросы таковы.
Получение списка всех доступных методов из библиотеки jar
Добрый день! Подскажите пожалуйста, как получить из jar библиотеки список всех методов, которые.
Решение
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.
Баг с получение списка блютузных com портов
Здравствуйте, столкнулся со странной проблемой получения com портов. Обычные порты получаю.
Вывод доступных com-портов в combobox
Добрый день подскажите пожалуйста как вывести в Combobox1 все доступные порты(порты которые.
Список сом-портов, доступных в системе
Кто-нибудь разбирался как получить Список сом-портов, доступных в системе? Пока единственный.
Как узнать список доступных портов в Qt
Здравствуйте, я хочу создать программу для «общения» с ардуино. Мне нужно узнать доступные порты и.
Как в WinAPI быстро и элегантно получить список всех доступных COM портов в системе?
Может ComDBGetCurrentPortUsage ? Или EnumPorts ? Или же простым перебором CreateFile ?
Получение всех доступных DHCP-серверов
Добрый день. Задача состоит в том, что бы через Командную строку вывести все доступные DHCP.
Lazarus linux serial port
Нет счетчик СЭТ-4ТМ.
А что эта команда даст ls /dev/ttyUSB*? Я вроде написал «ls /dev/ttyUSB0». А должна эта строчка устройства белой подсвечиваться в mc? Вот например как там @cdrom подсвечивается.
Почему то в /dev есть только один USB0, хотя к USB порта подключена мышь и оптопорт?
Re: Тонкости работы с COM портом
воткни устройство и посмотри что выведет тебе dmesg какой там название будет тако и пробуй использовать.
сунасер по умолчанию работает только с ttyS но это правится, правкой одной строки.
Добавлено спустя 2 минуты 20 секунд:
Re: Тонкости работы с COM портом
У меня вот такую строку выводит 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, подскажите плиз народ.
Re: Тонкости работы с COM портом
ну я бы менял уневерсально
Код: Выделить всё FDevice := comport;
пишу по памяти как точно зовется переменная не помню.
а весь код с FComNr выкинул бы.
так и говорит «не хочу» ?
может линь не те драйвера ему сует попробуй поработать с портом из консоли
читать их порта
cat /dev/ttyUSB0
писать
echo AT+ > /dev/ttyUSB0
если так не будет работать то никак не будет работать =)
Re: Тонкости работы с COM портом
Re: Тонкости работы с COM портом
Re: Тонкости работы с COM портом
Re: Тонкости работы с COM портом
Re: Тонкости работы с COM портом
Код: Выделить всё 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. забавно.
Re: Тонкости работы с COM портом
Re: Тонкости работы с COM портом
Может вопрос не сюда, но кто нибудь пробовал устанавливать визуальный компонент Cportlaz в Lazarus под Linux? В Lazarus под винду встал без проблем, а под Linux ни в какую не хочет.Сначала писал что не найдены модули libc, установил пакет fp-units-i386, теперь вот не может найти модули Windows а где ж их взять в Linuxe, не из винды же тащить.
Вопрос глуп, не внимательно посмотрел на страничке загрузки, что компонент переделан только под Lazarus для Linux.
Re: Тонкости работы с COM портом
Код: Выделить всё 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. забавно.
Просто интересно, а как у вас произойдет подсоединение к порту 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). «
Re: Тонкости работы с COM портом
Re: Тонкости работы с COM портом
sergeypankov
скорее всего он только под венду.
dionic
смотрим внимательно FComNr останется -1
тогда первая стока выполнется, а третья нет (PortIsClosed = -1 это константа)
Код: Выделить всё FDevice := comport;
if FComNr <> PortIsClosed then
FDevice := ‘/dev/ttyS’ + IntToStr(FComNr);
Re: Тонкости работы с COM портом
Простите неуча жестоко ошибался. Attid был прав. Как в первом случае, если указать /dev/ttyUSB0, так и во втором, если указать COM1 под Linux.
Через RS-232 все работает ОК,а вот, когда я начинаю работать через USB, и подключаю туда свой счетчик, Linux его определят на ttyUSB0. Посылаю туда данные, synaser создает файл /var/lock/LK..USB0 и записывает их туды. А когда начинаю опрашиват, то данных там нет, прога виснет , видимо на таймауте. Возможно у меня какие-то настройки не выставлены для работы с USB, ну там биты четности и т.д. Хотя под Windows с теми же настройками работает и с COM портом и с USB (с виртуальным COM портом). Ладно всем спасибо за помощь. Будем разбираться дальше