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

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

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

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

Сообщение serg_iv » 01.02.2010 18:30:18

a = 0

Все верно - на ком порту данные не были приняты в течении одной миллисекунды.
Задача то какая стоит? А то "помогите разобраться" без постановки задачи как то не очень помогает ее хотя бы понять...
serg_iv
постоялец
 
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

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

Сообщение Yurakl » 11.02.2010 16:31:19

на устройство(компьютер) поступают данные через комп порт, а далее если есть связь по Еthernet, то они поступают уже на компьютер, если нет, то сохраняются в памяти, и при появлении соединения передаются получателю.
Вот такая задача!
Yurakl
новенький
 
Сообщения: 62
Зарегистрирован: 20.01.2010 08:59:53

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

Сообщение serg_iv » 11.02.2010 17:37:42

Данные на ком порту какие? Байты или строки, с каким нибудь спецефическим символом конца строки?
Конфигурация порта - на какой скорости поступают данные, есть бит паритета или нет?
Это известно?
serg_iv
постоялец
 
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

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

Сообщение alexrayne » 12.02.2010 01:11:17

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

Для тех кто может заинтересоваться, в свое время усиленно думал какими компонентами пользоваться для обмена по ком, от библиотеки sysnaser, и подобных отказался по причине тяжеловесности. для своих консольных прог написал библиотеку врапер виндовых вызовов к ком устройствам чтобы получить оверлапед ввод\вывод похожий на работу с файлами. вообще попробовал както линевый стиль работы с терминалами адаптировать. вобщем получилось мелкое и простое в использовании либо. если охота ознакомится, выложу на фрипаскалевский контрибутор.
alexrayne
постоялец
 
Сообщения: 125
Зарегистрирован: 03.12.2008 16:56:26

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

Сообщение Mr.Smart » 12.02.2010 01:36:06

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

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

Сообщение alexrayne » 12.02.2010 02:33:22

вообчето рс232 и рс485 даже притом что они оговаривают только уровни, но всетаки надо понимать что рс232 по логике ближе к РС422, а 485 просто другая жизнь ибо он многоточечный\разделяемый, а остальные упомянутые точка-точка. про модбас я уже поставил заметку, но спрасил в надежде что есть какаято альтернатива, из чего выбрать.
alexrayne
постоялец
 
Сообщения: 125
Зарегистрирован: 03.12.2008 16:56:26

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

Сообщение Yurakl » 12.02.2010 09:36:29

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


На ком порт поступает пакет данных(байты), но в принципе это не так важно, что туда поступает, так как он должен передать все, что к нему пришло. Порт можно и самим же сконфигурировать, но устройство передает на скорости 4800 бод
Yurakl
новенький
 
Сообщения: 62
Зарегистрирован: 20.01.2010 08:59:53

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

Сообщение serg_iv » 12.02.2010 10:34:29

Ну и пробуй, желательно вынести в отдельный поток:
Код: Выделить всё
//инициализация последовательного порта
  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.


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

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

Сообщение v-t-l » 12.02.2010 15:47:53

alexrayne писал(а):ветку стартовали с задачи обмена по РС485. подкажите ктонить сцылко на открытый протокол обмена, чтоб свой велосипед не городить.

Не подойдет?:http://ru.wikipedia.org/wiki/Modbus
v-t-l
энтузиаст
 
Сообщения: 728
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

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

Сообщение Yurakl » 12.03.2010 15:52:33

Доброго времени суток!!!
Возникла проблемка.
Код: Выделить всё
  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 секунд:
может это из-за того что до освобождения устройства программа не доходила??
Yurakl
новенький
 
Сообщения: 62
Зарегистрирован: 20.01.2010 08:59:53

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

Сообщение Mr.Smart » 12.03.2010 16:51:47

Как закончили работу - освободите порт Disconnect.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение Yurakl » 15.03.2010 08:50:07

для освобождения порта используется Free.
Однако я прервал выполнение программы, тем самым не дойдя до этой команды.
Но в тоже время у меня принятые данные равны 0. В чем может быть причина?настройки вроде выставлены правильно!
Yurakl
новенький
 
Сообщения: 62
Зарегистрирован: 20.01.2010 08:59:53

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

Сообщение Yurakl » 16.03.2010 14:44:45

порт я освободил.
Устройство подключено, оно передает данные. Однако на компьютере мне выводятся нули....
Yurakl
новенький
 
Сообщения: 62
Зарегистрирован: 20.01.2010 08:59:53

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

Сообщение swa1 » 16.03.2010 15:21:09

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 писал(а):Ну и пробуй, желательно вынести в отдельный поток
Аватара пользователя
swa1
новенький
 
Сообщения: 80
Зарегистрирован: 25.09.2007 11:04:08
Откуда: Ялта

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

Сообщение Yurakl » 16.03.2010 16:09:32

Yurakl писал(а):порт я освободил.

Как?

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

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

при команде
Код: Выделить всё
a:=ser.RecvByte(1000);
writeln(a);

Что происходит?? Записывается(выводится) один байт за 1000 мсек? а если за это время пришло 50 байт, к примеру?
Yurakl
новенький
 
Сообщения: 62
Зарегистрирован: 20.01.2010 08:59:53

Пред.След.

Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru