[phpBB Debug] PHP Warning: in file [ROOT]/includes/bbcode.php on line 240: Undefined array key 1
[phpBB Debug] PHP Warning: in file [ROOT]/includes/functions.php on line 4191: Cannot modify header information - headers already sent by (output started at [ROOT]/includes/functions.php:3076)
[phpBB Debug] PHP Warning: in file [ROOT]/includes/functions.php on line 4191: Cannot modify header information - headers already sent by (output started at [ROOT]/includes/functions.php:3076)
[phpBB Debug] PHP Warning: in file [ROOT]/includes/functions.php on line 4191: Cannot modify header information - headers already sent by (output started at [ROOT]/includes/functions.php:3076)
[phpBB Debug] PHP Warning: in file [ROOT]/includes/functions.php on line 4191: Cannot modify header information - headers already sent by (output started at [ROOT]/includes/functions.php:3076)
freepascal.ru • Тонкости работы с COM портом - Страница 6
Страница 6 из 9

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

Добавлено: 01.02.2010 17:30:18
serg_iv
a = 0

Все верно - на ком порту данные не были приняты в течении одной миллисекунды.
Задача то какая стоит? А то "помогите разобраться" без постановки задачи как то не очень помогает ее хотя бы понять...

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

Добавлено: 11.02.2010 15:31:19
Yurakl
на устройство(компьютер) поступают данные через комп порт, а далее если есть связь по Еthernet, то они поступают уже на компьютер, если нет, то сохраняются в памяти, и при появлении соединения передаются получателю.
Вот такая задача!

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

Добавлено: 11.02.2010 16:37:42
serg_iv
Данные на ком порту какие? Байты или строки, с каким нибудь спецефическим символом конца строки?
Конфигурация порта - на какой скорости поступают данные, есть бит паритета или нет?
Это известно?

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

Добавлено: 12.02.2010 00:11:17
alexrayne
Народ. тут вроде ветку стартовали с задачи обмена по РС485. подкажите ктонить сцылко на открытый протокол обмена, чтоб свой велосипед не городить. в теории надо надо связать несколько устройств в общую сеть, походу даже с одним мастером. вопрос нестолько в обмене сколько в процедурах договаривания о скоростях, восстановлении сбоев и проверке и восстановлении передаваемых сообщений.

Для тех кто может заинтересоваться, в свое время усиленно думал какими компонентами пользоваться для обмена по ком, от библиотеки sysnaser, и подобных отказался по причине тяжеловесности. для своих консольных прог написал библиотеку врапер виндовых вызовов к ком устройствам чтобы получить оверлапед ввод\вывод похожий на работу с файлами. вообще попробовал както линевый стиль работы с терминалами адаптировать. вобщем получилось мелкое и простое в использовании либо. если охота ознакомится, выложу на фрипаскалевский контрибутор.

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

Добавлено: 12.02.2010 00:36:06
Mr.Smart
Сам стандарт RS485 как и RS232 оговаривает уровни сигналов, скорости и гальваническую развязку. Он является физически уровнем и не более того. Для транспорта используются множество других протоколов, как стандартизированных так и не. Мне не известен ни один протокол, который бы удовлетворял Вашим требованиям (договариваться о параметрах связи и т.д.). Один из самых популярных протоколов - это ModBus. Можно за основу адресации и проверки на ошибки взять данный протокол (что большинство производителей приборов и делает) и создать свой под конкретные нужды :wink:

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

Добавлено: 12.02.2010 01:33:22
alexrayne
вообчето рс232 и рс485 даже притом что они оговаривают только уровни, но всетаки надо понимать что рс232 по логике ближе к РС422, а 485 просто другая жизнь ибо он многоточечный\разделяемый, а остальные упомянутые точка-точка. про модбас я уже поставил заметку, но спрасил в надежде что есть какаято альтернатива, из чего выбрать.

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

Добавлено: 12.02.2010 08:36:29
Yurakl
serg_iv писал(а):Данные на ком порту какие? Байты или строки, с каким нибудь спецефическим символом конца строки?
Конфигурация порта - на какой скорости поступают данные, есть бит паритета или нет?
Это известно?


На ком порт поступает пакет данных(байты), но в принципе это не так важно, что туда поступает, так как он должен передать все, что к нему пришло. Порт можно и самим же сконфигурировать, но устройство передает на скорости 4800 бод

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

Добавлено: 12.02.2010 09:34:29
serg_iv
Ну и пробуй, желательно вынести в отдельный поток:

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

//инициализация последовательного порта
  ser:=TBlockserial.Create; //создаем устройство
  ser.RaiseExcept:=false;   //не обрабатываем исключения ошибок связи
  ser.Connect(nPort);      //соединяемся с портом
  ser.Config(4800,8,'N',0,false,false);//настраиваем скорость, стоп биты, паритет
repeat 
  data := ser.RecvByte(1000);
  // .... тут твой код обработки данных
until Terminated;
ser.Free;//освобождаем устройство
end.


Удачи конечно, но все таки формат передачи данных посмотри: стоп бит и бит паритета

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

Добавлено: 12.02.2010 14:47:53
v-t-l
alexrayne писал(а):ветку стартовали с задачи обмена по РС485. подкажите ктонить сцылко на открытый протокол обмена, чтоб свой велосипед не городить.

Не подойдет?:http://ru.wikipedia.org/wiki/Modbus

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

Добавлено: 12.03.2010 15:20:23
Yurakl
Доброго времени суток!!!
Возникла проблемка.

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

  ser:=TBlockserial.Create; //создаем устройство
  ser.RaiseExcept:=false;   //не обрабатываем исключения ошибок связи
  ser.Connect('/dev/ttyS0');      //соединяемся с портом
  ser.Config(115200,8,'N',0,false,false);//настраиваем скорость, стоп биты, паритет
if ser.InstanceActive then
repeat
  data := ser.RecvByte(1000);
  writeln(data);
until Terminated;
ser.Free;//освобождаем устройство


после исполнения данной программы в следующее подключение InstanceActive становится равным FALSE.
из-за чего это так?

Добавлено спустя 27 минут 50 секунд:
может это из-за того что до освобождения устройства программа не доходила??

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

Добавлено: 12.03.2010 15:51:47
Mr.Smart
Как закончили работу - освободите порт Disconnect.

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

Добавлено: 15.03.2010 07:50:07
Yurakl
для освобождения порта используется Free.
Однако я прервал выполнение программы, тем самым не дойдя до этой команды.
Но в тоже время у меня принятые данные равны 0. В чем может быть причина?настройки вроде выставлены правильно!

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

Добавлено: 16.03.2010 13:44:45
Yurakl
порт я освободил.
Устройство подключено, оно передает данные. Однако на компьютере мне выводятся нули....

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

Добавлено: 16.03.2010 14:48:28
swa1
Yurakl писал(а):следующее подключение InstanceActive становится равным FALSE.

Попробуйте после Connect проверить на ошибки...

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

 if Ser.LastError<>0  then ShowMessage(' ОШИБКА - '+LastErrorDesc+'  ('+IntToStr(Ser.LastError)+')';

Что скажет.
Yurakl писал(а):В чем может быть причина?

Как видно вы работаете под линуксом. Попробуйте после Create поиграться с LinuxLock... Он отвечает за блокирование порта(для других програм...пользователей) после занятия. В папке /var/lock увидите образуемый там файл.

Я к примеру разрушаю(Serial.Free) по выходу из программы, а закрываю так:

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

  if Serial.Handle<>INVALID_HANDLE_VALUE then 
    begin
      Serial.Flush; // ждем до полного очищения буфера
      Serial.Purge; // если что то и есть до очищаем до конца
      Serial.CloseSocket; // отключаемся
   end;

Тогда уж точно в /var/lock ничего не останется и вы опять получите доступ :)

Начал писать еще утром, дописал только сейчас...Отвлекли.

Добавлено спустя 27 минут 19 секунд:
Yurakl писал(а):порт я освободил.

Как?
Yurakl писал(а):Устройство подключено, оно передает данные. Однако на компьютере мне выводятся нули....

значит что в data ничего не пишется. Попробуйте так:

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

 if  Ser.CanReadEx(100) then begin
     data := ser.RecvByte(0);
     writeln(data);
   end;

Ну и как писалось
serg_iv писал(а):Ну и пробуй, желательно вынести в отдельный поток

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

Добавлено: 16.03.2010 15:09:32
Yurakl
Yurakl писал(а):порт я освободил.

Как?

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

а нули выводились из-за неправильной настройки com порта на другой машине, воть так.

при команде

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

a:=ser.RecvByte(1000);
writeln(a);

Что происходит?? Записывается(выводится) один байт за 1000 мсек? а если за это время пришло 50 байт, к примеру?