Форум: "Система";
Текущий архив: 2002.10.28;
Скачать: [xml.tar.bz2];
ВнизНЕОБЫЧНАЯ Работа с КОМ - портом Найти похожие ветки
← →
MAYOR (2002-08-13 16:26) [0]Здравия желаю!!!
У меня вот какая проблемаЖ я пишу код работы с ком портом используя ТФайлСтреам .Когда я работаю с этим кодом из формы то
данные передаются и принимаются как надо но стоит етот код один к одному перенести в ДЛЛ-ку так ничего не хочет работать!!
если есть возможность пишите на мыло быстрее решим етот вопрос
← →
DiamondShark (2002-08-14 00:59) [1]На код бы посмотреть...
PS
А на мыло -- это не по-товарищески. Вруг еще кому-то интересно?
← →
Ага, (2002-08-14 03:45) [2]а я пишу код работы с ком портом используя авторучку (шариковую, иногда). Дык когда она черного цвета - то все ОК, но стоит взять зеленую, так полный облом!!
Прошу на мыло (лучше Saveguard, если есть возможность! Все-таки микробов поменьше будет).
← →
MAYOR (2002-08-14 10:14) [3]>DiamondShark © (14.08.02 00:59)
>На код бы посмотреть...
function Connect(const aInitString: PChar): integer; stdcall;
var
tmpStr, Cmp: string;
tmpInt: integer;
m_res: integer;
begin
m_res := 1;
try
///otcrivaem com-port
tmpStr := copy(aInitString, 1, 4);
tmpInt := StrToInt(tmpStr);
if (tmpInt <= 1024) and (tmpInt > 0) then Cmp := "COM" + inttostr(tmpInt) else
Cmp := "COM1";
fs := TFileStream.Create(Cmp, fmOpenReadWrite);
///skorost obmena
tmpStr := copy(aInitString, 5, 6);
tmpInt := StrToInt(tmpStr);
m_hCom := fs.Handle;
m_bPortReady := SetupComm(m_hCom, 128, 128);
m_bPortReady := GetCommState(m_hCom, m_dcb);
fillchar(m_dcb.DCBlength, sizeof(m_dcb), 0);
m_dcb.DCBlength := sizeof(m_dcb);
m_dcb.BaudRate := tmpInt;
m_dcb.Flags := m_dcb.Flags or dcb_DtrControlEnable;
tmpStr := copy(aInitString, 11, 1);
tmpInt := StrToInt(tmpStr);
if (tmpInt < 8) and (tmpInt >= 5)
then m_dcb.ByteSize := tmpInt else m_dcb.ByteSize := 8;
tmpStr := copy(aInitString, 12, 3);
m_dcb.StopBits := ONESTOPBIT;
if tmpStr = "1.5" then m_dcb.StopBits := ONE5STOPBITS;
if tmpStr = " 2" then m_dcb.StopBits := TWOSTOPBITS;
m_dcb.Parity := NOPARITY;
m_bPortReady := SetCommState(m_hCom, m_dcb);
tmpStr := copy(aInitString, 15, 3);
tmpInt := StrToInt(tmpStr);
m_CommTimeouts.ReadIntervalTimeout := tmpInt;
tmpStr := copy(aInitString, 18, 3);
tmpInt := StrToInt(tmpStr);
m_CommTimeouts.ReadTotalTimeoutConstant := tmpInt;
tmpStr := copy(aInitString, 21, 3);
tmpInt := StrToInt(tmpStr);
m_CommTimeouts.ReadTotalTimeoutMultiplier := tmpInt;
tmpStr := copy(aInitString, 24, 3);
tmpInt := StrToInt(tmpStr);
m_CommTimeouts.WriteTotalTimeoutConstant := tmpInt;
tmpStr := copy(aInitString, 27, 3);
tmpInt := StrToInt(tmpStr);
m_CommTimeouts.WriteTotalTimeoutMultiplier := tmpInt;
m_bPortReady := SetCommTimeouts(m_hCom, m_CommTimeouts);
except
m_res := -1;
end;
result := m_res;
end;
//==============================================================================
//Разрыв соединения
function Disconnect: integer; stdcall;
begin
fs.Free;
result := 0;
end;
//==============================================================================
//Отправка данных на линию
function Write(const aBuffer: PChar): integer; stdcall;
begin
fs.WriteBuffer(aBuffer^, length(aBuffer));
result := 1;
end;
//==============================================================================
//Получение данных с линии
function Read(var aBuffer: PChar): integer; stdcall;
var
a, b: PChar;
n: integer;
begin
//a := "q";
n := 1;
// while n <> 0 do try
// m_bPortReady := GetCommState(m_hCom, m_dcb);
//if m_bPortReady then begin
//n := fs.Size;
// while (not EOF(fs)) do begin
fs.ReadBuffer(a^, 1);
strcat(b, a);
// end;
// end;
// except
n := 0;
aBuffer := b;
// end;
result := 1;
end;
← →
doomin (2002-08-20 11:09) [4]Необычный подход, ничего не скажешь. Но не проще ли воспользоваться старым добрым API или компонентом, обернутым вокруг него? В dll работает - проверено
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2002.10.28;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c