Форум: "Система";
Текущий архив: 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