Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.07.01;
Скачать: CL | DM;

Вниз

Com порт к вопросу о бите четности   Найти похожие ветки 

 
KPY ©   (2002-04-02 11:49) [0]

Нашел в архиве форума тему где обсуждалась тема 9 бита, бита четности для com порта. Вопрос бурно обсуждался но про то как присвоить биту четности 0 или 1 по своему желанию никто так и не высказался. Хотелось бы опять поднять эту тему. 9 бит который четности мне нужен для управления железякой. Она хочет при инициализации в 9 бите 1 а при работе 0


 
Digitman ©   (2002-04-02 13:19) [1]

см. Win32 API help

модель поиска = "DCB"
(структура DCB, используемая в SetCommState())

конкретно по твоему вопросу - поле структуры
BYTE Parity;


 
KPY ©   (2002-04-02 13:46) [2]

В Parity есть 5 параметров
BYTE Parity; // 0-4=no,odd,even,mark,space
первые 3 ясно посдедние что то не очень понятно.

Мне непонятно если я включаю проверку чености при инициализации порта, мне вручную значение бита четности задавать что ли нужно?
Тогда и стартовые и стоповые тоже придется. Вообще я делаю так


function PortInit : boolean; //инициализация
var
ct: TCommTimeouts;
dcb: TDCB;
begin
f := Windows.CreateFile(PChar("COM1"), GENERIC_READ or
GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE,
nil, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0);
if (f < 0) or not Windows.SetupComm(f, 2048, 2048)or not
Windows.GetCommState(f, dcb) then exit; //init error

dcb.BaudRate :=CBR_9600;
dcb.StopBits := ONESTOPBIT;
dcb.Parity := 2;
dcb.ByteSize := 8;
if not Windows.SetCommState(f, dcb)
or not Windows.GetCommTimeouts(f, ct) then exit; //error
ct.ReadTotalTimeoutConstant := 50;
ct.ReadIntervalTimeout := 50;
ct.ReadTotalTimeoutMultiplier := 1;
ct.WriteTotalTimeoutMultiplier := 0;
ct.WriteTotalTimeoutConstant := 10;
if not Windows.SetCommTimeouts(f, ct)
or not Windows.SetCommMask(f, EV_RING + EV_RXCHAR + EV_RXFLAG + EV_TXEMPTY)
then exit; //error
result := true;
end;


function PostComm(var Buf; size: word): integer; //пеpедача в поpт
var p: pointer; i: integer;
begin
p := @Buf;
result := 0;
while size > 0 do begin
if not WriteFile(f, p^, 1, i, nil) then exit;
inc(result, i); inc(integer(p)); dec(size);
Application.ProcessMessages;
end;
end;







 
Digitman ©   (2002-04-02 15:07) [3]

насчет SPACE - не знаю, уточни в MSDN
а прочие, imho, вполне ясно и из хэлпа :

Parity

Specifies the parity scheme to be used. This member can be one of the following values:

Value Meaning
// каждая посылка явно дополняется признаком ЧЕТНОСТЬ = Да
EVENPARITY Even

MARKPARITY Mark

// посылки не дополняются признаком ЧЕТНОСТИ вообще
NOPARITY No parity

// каждая посылка явно дополняется признаком ЧЕТНОСТЬ = Нет
ODDPARITY Odd


расчет значения бита в случае Mark, а так же явная его установка в состояние Even и Odd осуществляется аппаратно контроллером UART при передаче каждой отдельной посылки, начиная с момента реинициализации вызовом SetCommState(), которая может выполняться тобой неоднократно, в нужный момент времени перед посылкой, требующей ту или иную логику трансляции бита четности приемнику


 
SoftOne ©   (2002-04-02 15:53) [4]

> Digitman © (02.04.02 15:07)
А Вы ничего не путаете?
По-моему Mark - фиксированная четность 1.
Space - фиксированная четность 0.
А вот Even и Odd - это как раз переменные четности, которые рассчитываются в зависимости от значения передаваемого байта.


 
Digitman ©   (2002-04-02 16:22) [5]

>SoftOne
да может - и так .. я не занимался этим вплотную ..
просто автору подсказал, что драйвер порта, используя DCB, программирует UART-чип на предмет бита четности строго определенным образом, и отсюда как бы понятно должно стать, что напрямую манипулировать битом невозможно
а конкретные предустановки - это уже тонкости, которые вполне можно уточнить в MSDN


 
KPY ©   (2002-04-02 16:28) [6]

Хорошо спасибо я с четностью разберусь, еще такой вопрос
почему в моем примере в процедуре вывода в порт в строке
if not WriteFile(f, p^, 1, i, nil) then exit;
выдается ошибка
[Error] Unit1.pas(86): Types of actual and formal var parameters must be identical


 
sniknik ©   (2002-04-02 16:49) [7]

похоже он указательпросит вместо i


 
KPY ©   (2002-04-03 08:26) [8]

Спасибо со всем разобрался и с посылкой и с девятым битом только вот теперь такой вопрос: на порт заглушку надо вешать когда прогу отлаживаешь? Что с чем "заглушить"? :)


 
Anatoly Podgoretsky ©   (2002-04-03 13:24) [9]

Digitman © (02.04.02 16:22)
SoftOne сказал абсолютно точно, вообще всего пять возможностей

None - ,бит не используется
Odd - нечет
Even - чет
Mark - всегда 1
Space - всегда 0

Это перекрывает все потребности.

KPY © (03.04.02 08:26)
RX/TX как минимум (это контакты 2 и 3)
Если этого будет недостаточно, то еще RTS-CTS, DTR-DSR-CD
Контакты зависят от типа разъема 9/25



Страницы: 1 вся ветка

Текущий архив: 2002.07.01;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
8-1106
Саша
2002-02-20 17:40
2002.07.01
Подушечные изображения


14-1172
-=CrazyFish=-
2002-05-28 17:15
2002.07.01
прикол


7-1224
gklbery
2002-04-04 13:27
2002.07.01
потеря типов параметров запросов при копировании файлов


14-1180
VID
2002-05-30 17:55
2002.07.01
Листок заказов на UBPFD.


1-1044
Arkan
2002-06-18 17:22
2002.07.01
Dos-unix