Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2002.07.01;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.006 c
1-964
Samurai
2002-06-19 12:29
2002.07.01
Подскажите, как оптимизировать одну вещь...


3-908
Chuk
2002-06-07 12:52
2002.07.01
Использование баз данных Paradox в локальной сети


1-1037
ef2000
2002-06-18 16:35
2002.07.01
Помогите, плиз!


3-868
Chad
2002-06-06 16:12
2002.07.01
компонент наследник TTable


1-1073
Z0mb7
2002-06-17 07:55
2002.07.01
Быстрое закрытие окна дос-программы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский