Такое может быть из-за управления потоком. Например (+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Виноградов Алексей 18 сентября 2003 г. 14:19
В ответ на: Вопрос для Виноградова Алексея. Сишники не читать :)) отправлено des00 18 сентября 2003 г. 14:03

У вас какое управление потоком - аппаратное или программное?
Если аппаратное, то на 9-контактный разъем ножка 8 от внешнего устройства должен приходить лог. ноль (+12В), иначе машина не сможет передавать. Тот же перец и с приемом. Не видя ваш код, очень трудно сказать, что у вас происходит.
P.S. Флажки смотрите. Например, во всех моих проектах я использю управление RTS/CTS, и процедуры настройки порта выглядят так выглядят так (оставьте мыло - кину проект):

{Функция открывает COM-порт}
function tform1.OpenCOM:boolean;
var port_name : ansistring;
begin
if radiogroup2.itemindex=0 then port_name:='COM1' else port_name:='COM2';
{Откроем порт как файл}
hCom:= CreateFile(pchar(port_name), {Наименование порта}
GENERIC_READ or GENERIC_WRITE, {Открыть для чтения и для записи}
0, {Порты нельзя сделать разделяемыми}
nil, {Нет атрибутов безопасности}
OPEN_EXISTING, {Открывать существующий файл}
0, {Синхронный режим обмена данными}
0); {Описатель файла - шаблона, для портов всегда равен нулю}
{Проверим успешность открытия порта}
result:=false;
if hCom=INVALID_HANDLE_VALUE then exit;
{Прочитаем "основные" настройки порта в DCB-структуру.Если была ошибка, мы получим "FALSE"}
if GetCommState(hCom,dcb) = false then exit;
{Прочитаем "основные" настройки порта в структуру "CommTimeOuts".Если была ошибка,
мы получим "FALSE"}
if GetCommTimeouts(hCom,ComTo) = false then exit;
if GetCommProperties(hcom,commprop) = false then exit;
Result:=true;
end;

{Функция закрывает открытый COM-порт}
function CloseCOM:boolean;
begin
Result:=CloseHandle(hCom);
end;

{Функция устанавливает тайм-ауты порта.}
function SetTimeOuts(RIT, RTTM, RTTC, WTTM, WTTC:dword):boolean;
begin
{Собственно настройка тайм-аутов}
result:=false;
{Установка тайм-аутов}
ComTo.ReadIntervalTimeout:=RIT;
{10 миллисекунд на прием одного символа. Если будет приниматься несколько символов, то
значение поля "ReadTotalTimeoutMultiplier" умножается на их количество}
ComTo.ReadTotalTimeoutMultiplier:=RTTM;
ComTo.ReadTotalTimeoutConstant:=RTTC;
ComTo.WriteTotalTimeoutMultiplier:=WTTM;
ComTo.WriteTotalTimeoutConstant:=WTTC;
{Установка временных параметров порта}
if SetCommTimeouts(hCom,ComTo) = false then exit;
Result:=true;
end;

{Функция настраивает порт. Для нее нужно задать скорость, длину слова, тип
четности и количество стоп-битов}
function SetCOM(baud:DWORD;bsize,parity,sbits:BYTE):boolean;
begin
dcb.BaudRate:=baud; dcb.ByteSize:=bsize; dcb.Parity:=parity;
dcb.StopBits:=sbits; dcb.xofflim:=90;
dcb.flags:=8321;
{Здесь флаги имеют следующее значение:
- Включен двоичный режим обмена -
- Нет проверки четности -
- При передаче данных анализировать сигнал CTS (машина может передавать,
только если сигнал CTS имеет низкий уровень) -
- При передаче данных игнорировать сигнал DSR -
- Не использовать линию DTR для управления потоком -
- Игнорировать состояние линии DSR -
- Продолжать передачу, даже если приемный буфер близок к переполнению -
- Не останавливать передачу при приеме Xoff -
- Не передавать Xoff, когда приемный буфер близок к переполнению -
- Не заменять символы с ошибкой четности -
- Не отбрасываь нулевые байты при приеме -
- Линия RTS используется в режиме рукопожатия (если приемный буфер машины близок к
переполнению, она сбрасывает RTS в ноль, сигнализируя о неготовности к приему) -
- Не прекращать чтение/запись при возникновении ошибки -}

{Собственно конфигурирование порта}
result:=false;
if SetCommState(hCom,dcb) = false then exit;
{Установка тайм-аутов}
if SetTimeOuts(1, 1, 400, 1, 400) = false then exit;
Result:=true;
end;

{Функция сбрасывает очереди приема и передачи последовательного порта}
function ClrCOM:boolean;
begin
Result:=PurgeComm (hCom,PURGE_TXABORT or PURGE_RXABORT
or PURGE_TXCLEAR or PURGE_RXCLEAR);
end;



Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru