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

Вниз

COM-порт изменение скорости при синхронном режиме работы   Найти похожие ветки 

 
МистерТ   (2008-10-09 16:22) [0]

Здравствуйте!
Возник вопрос, возможно ответ лежит на поверхности, но проблемой, с которой косвенно связан вопрос, занимаюсь уже второй день и несколько "зациклился".
При обмене с железкой используется синхронное чтение и запись в СОМ-порт (отдельный поток с двумя очередями - на входящие и на исходящие сообщения). И вот в процессе общения необходимо изменить скорость обмена, количество стоповых бит и контроль четности.
Выполнимо ли это без закрытия/открытия-по-новой СОМ-порта ?
Если выполнимо в общих чертах, достаточно ли установить новый SetCommState() или потребуется что-то еще ?

Заранее благодарю за ответы.

З.Ы. сильно не пинайте, только подтолкните к решению :)


 
Сергей М. ©   (2008-10-09 16:34) [1]

Справка утверждает, что

The function reinitializes all hardware and control settings, but it does not empty output or input queues


 
Сергей М. ©   (2008-10-09 16:38) [2]

Но подозреваю, что если Read/WriteFile и SetCommState вызываются из разных потоков, хэндл открытого порта следует защитить крит.секцией


 
МистерТ   (2008-10-09 19:18) [3]

Собственно, что мне и нужно.
Просто одним SetCommState() в асинхронном режиме ограничится не удалось, приходится CloseHandle() + OpenFile() и т.д. и открывать вновь.

З.Ы. "не удалось" означает, что железка подобные операции как-то неадекватно воспринимает и не отвечает, а если пересоздать - работает замечательно.


 
Германн ©   (2008-10-10 01:28) [4]


> З.Ы. "не удалось" означает, что железка подобные операции
> как-то неадекватно воспринимает и не отвечает, а если пересоздать
> - работает замечательно.
>

А что тебе известно про "железку"? Тут ведь почти всё зависит именно от неё! Мои железки твои "ковыряния в носу" пошлют сразу нафиг. Или ты считаешь, что "железки" подключаемые к СОМ-порту обязаны следовать одному строго заданному правилу?


 
МистерТ   (2008-10-10 07:19) [5]

> Германн ©   (10.10.08 01:28) [4]
Знаю то, что первоначальный коннект осуществляется на скорости 1200/7бит/с контролем четности (Е).
После "обмена любезностями" железка отправляет сообщение что "мол не хотите ли сударь поменять скорость на человеческую" (9600/8бит/без контроля четности), ждет когда я ей отвечу на первоначальной и переключается на 9600.
Вот момент переключения и не проходит. Железка не отвечает на 9600, а через минуту (тайм-аут соединения) отвечает на 1200 мол "я Вас не так поняла и во взаимности отказываю" :)

З.Ы. железка - SEVC-D (старый который, не актарисовский)


 
GanibalLector ©   (2008-10-10 18:02) [6]

>Выполнимо ли это без закрытия/открытия-по-новой СОМ-порта ?

Вроде НЕТ.


 
GanibalLector ©   (2008-10-10 18:19) [7]

Хотя нет. Проверил, можно. Я и сам не знал ;)


function PortToStr(Port: Byte): string;
begin
 Str(Port, Result);
 Result := "\\.\COM" + Result;
end;

function OpenPort(Port:Byte): THandle;
var Tout: TCommTimeouts;
 DCB: TDCB;
begin
 Result := CreateFile(PChar(PortToStr(Port)),
   GENERIC_READ or GENERIC_WRITE,
   0, nil, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
 if Result= INVALID_HANDLE_VALUE then Exit;

 ZeroMemory(@DCB, SizeOf(DCB));
 DCB.DCBlength := SizeOf(DCB);
 DCB.Flags := 1;
 DCB.BaudRate := CBR_4800;
 DCB.Parity := NOPARITY;
 DCB.ByteSize := 8;
 DCB.StopBits := ONESTOPBIT;

 if not SetCommState(Result, DCB) then Exit;
end;

procedure ChangeBaud(const H:THandle);
  var DCB: TDCB;
begin
 ZeroMemory(@DCB, SizeOf(DCB));
 DCB.DCBlength := SizeOf(DCB);
 DCB.Flags := 1;
 DCB.BaudRate := CBR_9600;
 DCB.Parity := NOPARITY;
 DCB.ByteSize := 7;
 DCB.StopBits := ONESTOPBIT;

 if not SetCommState(H, DCB) then  Exit;
end ;

procedure TForm1.Button1Click(Sender: TObject);
 var H:THandle;
begin
H:= OpenPort(2) ;
ChangeBaud(H);
end;


Лог :

0.00006146 Project1.exe IRP_MJ_CREATE Serial1 SUCCESS Options: Open  
0.00000363 Project1.exe IOCTL_SERIAL_GET_BAUD_RATE Serial1 SUCCESS  
0.00000251 Project1.exe IOCTL_SERIAL_GET_LINE_CONTROL Serial1 SUCCESS  
0.00000223 Project1.exe IOCTL_SERIAL_GET_CHARS Serial1 SUCCESS  
0.00000223 Project1.exe IOCTL_SERIAL_GET_HANDFLOW Serial1 SUCCESS  
0.00000950 Project1.exe IOCTL_SERIAL_SET_BAUD_RATE Serial1 SUCCESS Rate: 4800
0.00000531 Project1.exe IOCTL_SERIAL_CLR_RTS Serial1 SUCCESS  
0.00000531 Project1.exe IOCTL_SERIAL_CLR_DTR Serial1 SUCCESS  
0.00000391 Project1.exe IOCTL_SERIAL_SET_LINE_CONTROL Serial1 SUCCESS StopBits: 1 Parity: NONE WordLength: 8
0.00000307 Project1.exe IOCTL_SERIAL_SET_CHAR Serial1 SUCCESS EOF:0 ERR:0 BRK:0 EVT:0 XON:0 XOFF:0
0.00000447 Project1.exe IOCTL_SERIAL_SET_HANDFLOW Serial1 SUCCESS Shake:0 Replace:0 XonLimit:0 XoffLimit:0
0.00000223 Project1.exe IOCTL_SERIAL_GET_BAUD_RATE Serial1 SUCCESS  
0.00000251 Project1.exe IOCTL_SERIAL_GET_LINE_CONTROL Serial1 SUCCESS  
0.00000196 Project1.exe IOCTL_SERIAL_GET_CHARS Serial1 SUCCESS  
0.00000223 Project1.exe IOCTL_SERIAL_GET_HANDFLOW Serial1 SUCCESS  
0.00000978 Project1.exe IOCTL_SERIAL_SET_BAUD_RATE Serial1 SUCCESS Rate: 9600
0.00000503 Project1.exe IOCTL_SERIAL_CLR_RTS Serial1 SUCCESS  
0.00000531 Project1.exe IOCTL_SERIAL_CLR_DTR Serial1 SUCCESS  
0.00000363 Project1.exe IOCTL_SERIAL_SET_LINE_CONTROL Serial1 SUCCESS StopBits: 1 Parity: NONE WordLength: 7
0.00000251 Project1.exe IOCTL_SERIAL_SET_CHAR Serial1 SUCCESS EOF:0 ERR:0 BRK:0 EVT:0 XON:0 XOFF:0
0.00000391 Project1.exe IOCTL_SERIAL_SET_HANDFLOW Serial1 SUCCESS Shake:0 Replace:0 XonLimit:0 XoffLimit:0



 
Германн ©   (2008-10-11 00:43) [8]


> МистерТ   (10.10.08 07:19) [5]
>
> > Германн ©   (10.10.08 01:28) [4]
> Знаю то, что первоначальный коннект осуществляется на скорости
> 1200/7бит/с контролем четности (Е).
> После "обмена любезностями" железка отправляет сообщение
> что "мол не хотите ли сударь поменять скорость на человеческую"
> (9600/8бит/без контроля четности), ждет когда я ей отвечу
> на первоначальной и переключается на 9600.
> Вот момент переключения и не проходит. Железка не отвечает
> на 9600, а через минуту (тайм-аут соединения) отвечает на
> 1200 мол "я Вас не так поняла и во взаимности отказываю"
> :)

Значит чего-то ты о ней не знаешь или чего-то делаешь неправильно. Железка своё отрабатывает давая ответ: "я Вас не так поняла и во взаимности отказываю". (Кстати, грамотная железка. Не все железки такие грамотные. Многие просто промолчали бы).


 
tesseract ©   (2008-10-23 12:47) [9]


> GanibalLector ©   (10.10.08 18:19) [7]


Теоретически это и не запрещено, а ты попробуй данные попосылать, интересно что выйдет :-)



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

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

Наверх




Память: 0.49 MB
Время: 0.012 c
15-1254694926
Германн
2009-10-05 02:22
2009.12.06
Планировщик Windows


15-1254855575
TRSteep
2009-10-06 22:59
2009.12.06
Смена хеша пароля


9-1183815378
Dib@zol
2007-07-07 17:36
2009.12.06
По часовой стрелке


2-1255711170
den49
2009-10-16 20:39
2009.12.06
Чтение из файла при помощи Filestream


15-1254879107
VladOfMonster
2009-10-07 05:31
2009.12.06
Windows Seven