Форум: "WinAPI";
Текущий архив: 2008.03.16;
Скачать: [xml.tar.bz2];
ВнизRS-485 и ЦП8501/2 Найти похожие ветки
← →
balepa © (2007-07-20 06:15) [0]Помогите реализовать протокол для ЦП8501/2:
Каждый пакет состоит из нескольких полей, передающихся друг за другом без разрывов во времени.
Признаком конца пакета служит отсутствие передачи на линии в течении времени, необходимого для передачи 5-6 байт, после окончания передачи стоп-бита последнего байта.
Поля:
ADDR 2 байта (хотя max значение указано 7FFFFFh); = 0
CMD 1 байт команда = 40h
param 1 байт номер запрашиваемого параметра = 0
CRC 2 байта (2-х байтовый циклический избыточный код, вычис-ый по всем пред-им байтам пакета)
В итоге надо отправить ADDR-CMD-param-CRC (6 байт) в ответ получить ADDR-CMD-(nnnn)-CODE-CRC (10 байт), где (nnnn)-Single
1) Как посчитать время за которое передается 5-6 байт?
2) Как узнать что стоп-бит последнего байта передан?
3) RTS убирать после истечения времени (см. 1) или сразу после отправки последнего байта?
← →
Dib@zol © (2007-07-20 09:53) [1]Удалено модератором
← →
Dib@zol © (2007-07-20 09:54) [2]Удалено модератором
← →
balepa © (2007-07-20 10:04) [3]
> Dib@zol © (20.07.07 09:53) [1]
> И точно его измерить невозможно, так как в каждом
А точно и ненадо.
> с чего ты взял что признак конца пакета должен быть именно
> таким
В руководстве по эксплуатации
> Dib@zol © (20.07.07 09:54) [2]
> И вапще вопросец походу не сюда а в "Сеть"...
WinAPI система, оборудование и т.д.
← →
Anatoly Podgoretsky © (2007-07-20 10:18) [4]> balepa (20.07.2007 10:04:03) [3]
Побайтовое чтение и WaitForSingleObject с таймаутом
← →
balepa © (2007-07-20 10:22) [5]
> Anatoly Podgoretsky © (20.07.07 10:18) [4]
Это на какой вопрос ответ?
← →
Dib@zol © (2007-07-20 10:31) [6]
> 1) Как посчитать время за которое передается 5-6 байт?
> 2) Как узнать что стоп-бит последнего байта передан?
Вот на эти два. WaitForSingleObject будет, еснеошибаюсь, ждать начала след. цепочки байт и если не дождёцца значит усё пакет закончился :)
А стопбит, поскольку является девятым и последним, будет по-моему при побайтном чтении передан как байт со значением 1. Если наткнулся на таковой в пакете - врубай Wait.
← →
Anatoly Podgoretsky © (2007-07-20 10:34) [7]> balepa (20.07.2007 10:22:05) [5]
Это на твой вопрос, как определить (измерить) окончание передачи.
← →
balepa © (2007-07-20 10:49) [8]ЦП8501/2 это измерительное устройство подключеное по RS-485 через адаптер интерфейса AC3(направлением потока данных управляет RTS) к Com порту ПК.
Я понял так:
Вар№1: надо отправить запрос с ПК после того после окончания передачи стоп-бита последнего байта выждать время "для передачи 5-6 байт" установить RTS в 0 и читать
Вар№2: оправить -> установить RTS в 0 -> подождать время "для передачи 5-6 байт" ->считать.
Вот одно из этого мне и надо реализовать.
А при чем тут Побайтовое чтение и WaitForSingleObject с таймаутом?
Может запись?
Как высчитать сколько ждать?
← →
Dib@zol © (2007-07-20 10:58) [9]
> Может запись?
Может и запись...
> Как высчитать сколько ждать?
Вот так:
var time:Cardinal;
...
time:=GetTickCount;
<Отправить 6 байт>
time:=GetTickCount-time;
в результате получишь время этой самой передачи. Только пердупреждаю оно может оказаться ЖУТКОСТРАШНО неточным, поэтому после каждого сеанса приёмопередачи запускай вышеописанное ещё раз и вычисляй среднее арифметическое.
← →
balepa © (2007-07-20 10:59) [10]
> Dib@zol © (20.07.07 10:58) [9]
Только пердупреждаю оно может оказаться ЖУТКОСТРАШНО неточным
Аж мурашки по коже
← →
Dib@zol © (2007-07-20 11:02) [11]Зато работает! Или нет??...
← →
balepa © (2007-07-20 13:19) [12]Оказалось как всегда наудивление просто, что байты забыл(не то что забыл просто неподумал об этом :)) местами переменять когда в Single переводил.
Спасибо всем за участие.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2008.03.16;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c