Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Win 2000 ошибка?


Автор: Mephisto 23.2.2004, 19:26
Код
mov  dx,37Ah
mov  al,00001101b
out  dx,al

Почему в вин 2000 и ХР при запуске данного кода выбивает ошибку, хотя в других ничего нет?

Автор: Serzh 23.2.2004, 20:45
дык не разрешает нт порты вроде...
а с лпт мона и по другому работать.

Автор: VAV 24.2.2004, 21:49
А как усётаки в NT,2000,XP с портами работать?

Автор: Mephisto 25.2.2004, 15:21
Цитата
дык не разрешает нт порты вроде...
а с лпт мона и по другому работать.

А как всё таки?

Автор: Mephisto 5.4.2004, 17:29
Люди, ну очень нуна. Может кто знает?

Автор: oleg1973 5.4.2004, 20:26
делаеш createfile с именем lpt
и все, работаеш как с файлом, пишеш тудыть и читаеш оттудыть smile.gif

Автор: Mephisto 20.4.2004, 18:13
У меня устройство работает с лпт. Мне необхоимо тудыть биты передавать. В вынь 98 нет проблем а в 2000 фанарь. sad.gif

Автор: Mephisto 26.4.2004, 17:08
Цитата
делаеш createfile с именем lpt

Есть такое дело.
Но, когда создаю такой файл, но нет никакого драйвера принтера, то функция возвращает ошибку. А если принтер установлен, то пишет что принтер не отвечает!
А ваще каким образом мона управлять регистрами?
Я пользуюсь функцией WriteFile для синхронной передачи.
Функцией DeviceIOControl не могу. Какой-то из парамеров не знаю как установить. По-моему второй. Сейчас просто нет при себе исходников.

Автор: Jin X 26.4.2004, 21:25
Имелся в виду файл с именем "lpt1", "lpt2" и т.д, какой именно нужен.
Вот ещё глянь: http://www.skvozilka.com.ru/Delphi/Doc/hardware.htm

Автор: Kagor 26.4.2004, 23:10
Ошибся, почему-то подумал, что это форум по C/C++. smile.gif
Добавлено @ 23:17
А вообще может, кому ни будь пригодиться пример по работе с COM портами на C++(должно и в 2k и в Xp работать).
Код
#if defined (WIN32)
# include <windows.h>
# include <mmsystem.h>

static HANDLE hCom;
static char *CommPort[] = {"COM1","COM2"};

#else // UNIX
# include <sys/types.h>
# include <sys/stat.h>
# include <sys/time.h>
# include <sys/select.h>
# include <stdlib.h>
# include <string.h>
# include <fcntl.h>
# include <errno.h>
# include <unistd.h>
# include <termios.h>

static int hCom = -1;
static char *CommPort[] = {"/dev/cua/a","/dev/cua/b"};
static termios tio_save;
static int g_readTimeout;

static int baudRateFlag (int bps)
{
   int s = bps;
   int baud_speed = 0;
     if (s <= (bps = 50))  baud_speed = B50;
else if (s <= (bps = 75))  baud_speed = B75;
else if (s <= (bps = 110))  baud_speed = B110;
else if (s <= (bps = 134))  baud_speed = B134;
else if (s <= (bps = 150))  baud_speed = B150;
else if (s <= (bps = 200))  baud_speed = B200;
else if (s <= (bps = 300))  baud_speed = B300;
else if (s <= (bps = 600))  baud_speed = B600;
else if (s <= (bps = 1200))  baud_speed = B1200;
else if (s <= (bps = 1800))  baud_speed = B1800;
else if (s <= (bps = 2400))  baud_speed = B2400;
else if (s <= (bps = 4800))  baud_speed = B4800;
else if (s <= (bps = 9600))  baud_speed = B9600;
else if (s <= (bps = 19200))  baud_speed = B19200;
else if (s <= (bps = 38400))  baud_speed = B38400;
else if (s <= (bps = 57600))  baud_speed = B57600;
else if (s <= (bps = 115200))  baud_speed = B115200;
else if (s <= (bps = 230400))  baud_speed = B230400;
else     baud_speed = B115200;
   return baud_speed;
}

#endif // UNIX

int Init_485(int Port,int TimeOut)
{
#if defined (WIN32)
   DCB dcb;

   BOOL fSuccess;

   if (Port < 0) Port = 0;
   if (Port > 1) Port = 1;
   hCom = CreateFile(CommPort[Port],
           GENERIC_READ | GENERIC_WRITE,
           0,    
           NULL,
           OPEN_EXISTING, // comm devices must use OPEN_EXISTING
           0,    // not overlapped I/O
           NULL  // hTemplate must be NULL for comm devices
           );

   if (hCom == INVALID_HANDLE_VALUE)
       return 1;


   fSuccess = GetCommState(hCom, &dcb);
   if (!fSuccess)
       return 1;

   memset (&dcb, 0, sizeof (DCB));
   dcb.BaudRate = CBR_38400;     // set the baud rate
   dcb.fBinary = TRUE;
   dcb.ByteSize = 8;             // data size, xmit, and rcv
   dcb.Parity = NOPARITY;        // no parity bit
   dcb.StopBits = ONESTOPBIT;    // one stop bit
   dcb.fDtrControl = DTR_CONTROL_DISABLE;
   dcb.fRtsControl = RTS_CONTROL_DISABLE;

   fSuccess = SetCommState(hCom, &dcb);

   if (!fSuccess)
       return 1;

   if (TimeOut)
   {
       COMMTIMEOUTS CommTimeouts;
       CommTimeouts.ReadIntervalTimeout            = TimeOut;
       CommTimeouts.ReadTotalTimeoutMultiplier     = 0;
       CommTimeouts.ReadTotalTimeoutConstant       = TimeOut;
       CommTimeouts.WriteTotalTimeoutMultiplier    = 0;
       CommTimeouts.WriteTotalTimeoutConstant      = 0;
       fSuccess = SetCommTimeouts(hCom,&CommTimeouts);

       if (!fSuccess)
           return 1;
   }
#else // UNIX

   if (Port < 0) Port = 0;
   if (Port > 1) Port = 1;

   termios tio;
   memset (&tio, 0, sizeof (termios));
   
   tio.c_iflag = IGNBRK;
   tio.c_cflag =
       CS8 |           // 8 bit
       // CSTOPB |     // 2 stop bits
       // PARENB |     // enable parity
       // PARODD |     // odd parity
       CLOCAL |        // dont use CD & DCD signals
       CREAD |         // enable receive
       0;
   cfsetospeed (&tio, baudRateFlag (38400));
   cfsetispeed (&tio, baudRateFlag (38400));
   tio.c_cc [VMIN] = 1;    // minimum packet size == 1 byte

   hCom = ::open (CommPort[Port], O_RDWR | O_NOCTTY | O_NONBLOCK, 0);
   int
   status = hCom != -1;
   status = (status ? tcflush   (hCom, TCIOFLUSH) : -1)      != -1;
   status = (status ? tcgetattr (hCom, &tio_save) : -1)     != -1;
   status = (status ? tcsetattr (hCom, TCSANOW, &tio) : -1) != -1;

   g_readTimeout = TimeOut;

   if (! status) return 1;

#endif // UNIX

   return 0;
}

int Close_485(void)
{
#if defined (WIN32)
   CloseHandle(hCom);
#else
   if (hCom != -1) {
     int
     result  = tcflush   (hCom, TCIOFLUSH) == -1;
     result += tcsetattr (hCom, TCSANOW, &tio_save) == -1;
     result += ::close   (hCom) == -1;
     hCom = -1;
     return result ? 1 : 0;
   }
#endif
   return 0;
}

int Wait_485_Readable (int millisec)
{
#if defined (WIN32)
   return 0;
#else
   fd_set readfds;
   FD_ZERO (&readfds);
   FD_SET  (hCom, &readfds);
   timeval tm;
   tm.tv_sec  =  millisec / 1000;
   tm.tv_usec = (millisec % 1000) * 1000;
   int result =
   select (hCom + 1, &readfds, 0, 0, &tm);
   if (result == -1 && errno != EINTR && errno != EAGAIN)
       return -1;  // Error
   if (result == 0)
       return 1;   // Timeout
   return 0;       // Ok
#endif
}

int Read_485(unsigned char &Data)
{
#if defined (WIN32)
   DWORD dwBytesTransferred = 0;
   if (!ReadFile (hCom, &Data, 1, &dwBytesTransferred, 0))
       return 1;
   if (dwBytesTransferred != 1)
       return 2;
   return 0;
#else
   if (hCom == -1)
       return 1;
       
   Wait_485_Readable (g_readTimeout);

   ssize_t n = ::read (hCom, &Data, 1);
   if (n == -1 && errno != EAGAIN)
       return 1;
   if (n == 1)
       return 0;
   return 2;
#endif
}

int Write_485(unsigned char &Data)
{
#if defined (WIN32)
   DWORD dwNumBytesWritten = 0;
   if (!WriteFile(hCom,              // Port handle
       &Data,              // Pointer to the data to write
       1,                  // Number of bytes to write
       &dwNumBytesWritten, // Pointer to the number of bytes written
       NULL))              // Must be NULL for Windows CE
       return 1;
   if (dwNumBytesWritten != 1)
       return 2;
#else
   if (hCom == -1)
       return 1;

   ssize_t n = ::write (hCom, &Data, 1);
   int
   status = (n != -1);
   status = (n == 1 ? tcdrain (hCom) : -1) != -1;
   usleep (20000);
   return status ? ((n == 1) ? 0 : 2) : 1;
#endif
   return 0;
}

#if __TEST

#include <stdio.h>

int main (int argc, char * argv [])
{
   int port = 0;
   int timeout = 2000;
   if (argc > 1)
port = strtol (argv[1], 0, 0);
   if (argc > 2)
timeout = strtol (argv[2], 0, 0) * 1000;

   printf ("COM%d timeout %d sec\n", port, timeout / 1000);

   if (Init_485 (port, timeout)) {
       printf ("Cannot open device: %s\n", strerror (errno));
       return -1;
   }

   setvbuf (stdout, 0, _IONBF, 0);

   if (argc > 3)
   {
       int err = 0;
       printf ("Send: [");
       for (int i = 3; i < argc; i++)
       {
           unsigned char out_buf = strtol (argv [i], 0, 0);
           int x = out_buf;
           printf (" 0x%X", x);
           int res = Write_485 (out_buf);
           printf ((res == 0) ? "+" :
                   (res == 1) ? "x" :
                   (res == 2) ? "-" : "?");
           err += res;
       }

       printf ("] %s\n", err ? "Error" : "Ok");
   }
   
   printf ("Recv: [");
   unsigned char in_buf;
   int res;
   while ((res = Read_485 (in_buf)) == 0)
   {
       int x = in_buf;
       printf (" 0x%X", x);
   }
   
   printf ("] %s\n", (res == 1) ? "Error" : "");
   printf ("End.\n");

   return 0;
}

#endif
smile.gif

Автор: Mephisto 27.4.2004, 16:49
Цитата
А вообще может, кому ни будь пригодиться пример по работе с COM портами на C++(должно и в 2k и в Xp работать).

Это хорошо, но как таким образом работать с ЛПТ. С таким синаксисом я выдаю в порт 1 байт, но этот гад выдает этот байт на драйвер, и ставит в очередь на печать. Естественно принтер не отвечает. Позже вылазит ошибка. mad.gif
Функция OUT запрещена, прерывание int 17h также ссылается на драйвер, о результате можете сами догадатся!
НО...:
Код
data segment byte public 'DATA'
String DB 'Test string$'
data ends
code segment byte public 'CODE'
assume cs:code, ds:data, es:data
start:
mov ax, data
mov ds, ax

mov dx, 378h
mov al, 00000000b
out dx, al

mov dx, offset String
mov ah, 9
int 21h

mov ax, 4c00h
int 21h

code ends
end start

Вот этот код на тасме не выдает ошибки, к моему удивлению, но нифига не делает! Что тоже меня удивляет. Может растолкует мне кто почему?

Автор: Kagor 28.4.2004, 19:45
Mephisto
В NT(2k, Xp 2k+3) драйвер уровня ядра может напрямую работать с портами, т.е. без дополнительных извратов, так может тебе написать драйвер и работать через него?

Автор: Chingachguk 28.4.2004, 21:09
Цитата

if (s <= (bps = 50))  baud_speed = B50;
else if (s <= (bps = 75))  baud_speed = B75;
else if (s <= (bps = 110))  baud_speed = B110;
else if (s <= (bps = 134))  baud_speed = B134;
else if (s <= (bps = 150))  baud_speed = B150;
else if (s <= (bps = 200))  baud_speed = B200;
else if (s <= (bps = 300))  baud_speed = B300;
...


Интересно, таблицы подстановок запрещено использовать ?...

Автор: Kagor 28.4.2004, 22:36
Chingachguk
Цитата
Интересно, таблицы подстановок запрещено использовать ?...
Эта часть кода под Unix и я её не разу не использовал hehe.gif Да и вообще этот код написал не я. Я только из него выдрал, что мне надо(под Win) и все... smile.gif baaa.gif

Автор: DHK 29.4.2004, 19:14
Примерчик на паскале. Обмен с COM портом. По аналогии сделай с LPT. Работает в 2000, 98, ХР ...



uses Crt;
Type TBinary = String[8];
Var
RSt:Byte;
Ch : Char;
BinStat, BinDat : TBinary;
f:text;

Function BBinary(B:Byte):TBinary;
Var
Bit,I : Byte;
TempS : TBinary;
Begin
TempS:='';
TempS[0]:=Chr(8);
Bit:=1;
For I:=0 To 7 Do TempS[8-i]:=Chr(Ord('0')+((Bit shl i) And B) shr i);
BBinary:=TempS;
End;

Procedure Init_Com2;
var
DIni : Byte;
begin
DIni:= 127; { DLAB set}
Port[$3FB] := DIni ;
DIni:= $00;
Port[$3F9] := DIni ; { High byte divider }
DIni:= 12;
Port[$3F8] := DIni ; { Low byte divider }
DIni:= $00;
Port[$3FB] := DIni; { DLAB clear}
DIni:= $02; { 0000 0010}
Port[$3FB] := DIni;
DIni := $00;
Port[$3F9] := DIni;
DIni :=$0B; {00011011}
Port[$3FC]:=DIni;
End;

Procedure Eror;
Begin
end;

Procedure ReadData;
Begin
Ch:= Chr(Port[$3F8]);
Write(Ch);
end;

Procedure WriteData;
Begin
Ch := ReadKey;
Port[$278] := Ord(Ch);
end;

Begin
clrscr;
Init_Com2;
assign(f,'text.txt');
reset(f);
RSt:= Port[$3FD];
while not eof(f) do
Begin
read(f,Ch);
Port[$3F8]:=Ord(Ch);
BinStat:=Bbinary(Port[$3FD]);
delay(10);
if BinStat[5] = '0' then ReadData;
End;
Close(f);
Ch:=readkey;
End.

Автор: Mephisto 6.5.2004, 18:07
Цитата
В NT(2k, Xp 2k+3) драйвер уровня ядра может напрямую работать с портами, т.е. без дополнительных извратов, так может тебе написать драйвер и работать через него?

Отсюда мона подробнее?

Автор: Kagor 10.5.2004, 01:26
Цитата(Mephisto @ 6.5.2004, 18:07)
Цитата
В NT(2k, Xp 2k+3) драйвер уровня ядра может напрямую работать с портами, т.е. без дополнительных извратов, так может тебе написать драйвер и работать через него?

Отсюда мона подробнее?

jmp http://www.wasm.ru smile.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)