rs232 в win98/me и ниже
2 Zmei
Так вот... В винде с rs232 тоже проблем никаких нет :)
HANDLE hCom;
DCB dcb;
COMSTAT comStat;
DWORD dwError
......
hCom = CreateFile("COM1",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL
);
..........
GetCommState(hCom, &dcb);
dcb.BaudRate = CBR_9600;
dcb.fParity = FALSE;
dcb.fOutxCtsFlow=TRUE;
dcb.fOutxDsrFlow=FALSE;
dcb.fDtrControl=DTR_CONTROL_DISABLE;
dcb.fDsrSensitivity=FALSE;
dcb.fTXContinueOnXoff=TRUE;
dcb.fOutX=FALSE;
dcb.fInX=FALSE;
dcb.fErrorChar=FALSE;
dcb.fNull=FALSE;
dcb.fRtsControl= RTS_CONTROL_ENABLE;
dcb.fAbortOnError=FALSE;
dcb.Parity = NOPARITY;
dcb.ByteSize = 8;
dcb.StopBits = ONESTOPBIT;
SetCommState(hCom, &dcb);
................
switch (fRTS)
{
case RTS_NULL_BEFORE_TRANS:
crc.wcrc=GetCRC(command,6);
command[6]=crc.lByte;
command[7]=crc.hByte;
// состояние порта
ClearCommError(hCom, &dwError, &comStat);
// Если есть данные в очереди - очищаем ее
if (comStat.cbInQue)
ReadFile(hCom,m.bBuff,comStat.cbInQue,&dwByteRead,NULL);
// Пишем
fSuccess=WriteFile(hCom,command,8,&dwByteWrite,NULL);
SetTimer(hWnd,IDT_MS,1,NULL);
fRTS=RTS_NULL_AFTER_TRANS;
case RTS_NULL_AFTER_TRANS:
EscapeCommFunction(hCom,SETRTS);
SetTimer(hWnd,IDT_MS,8000,NULL);
fRTS=RTS_ONE;
break;
case RTS_ONE:
ClearCommError(hCom, &dwError, &comStat);
if (comStat.cbInQue)
{
// Здесь читаем из порта
ReadFile(hCom,m.bBuff,comStat.cbInQue,&dwByteRead,NULL);
// Если прочитали сколько в очереди было - все ок
if (comStat.cbInQue==dwByteRead)
{
// Тут моя обработка полученных данных
switch (m.bBuff[1])
{
case 0xb1:
B1(m.bBuff[2]+5);
break;
case 0xb3:
B3(m.bBuff[2]/4);
break;
default:
lstrcpy(str,"uncnown");
break;
}
SendDlgItemMessage(hWnd,IDC_EDIT1,WM_SETTEXT,0,(LPARAM)(LPCTSTR) str);
}
// Иначе что то не так :)
else MessageBox(hWnd,"not
true","error",MB_OK);
}
break;
}
.................
Открывает com1 скорость 8n1 без контроля четности, позволяет дергать
линией RTS по своему усмотрению.
Не будет работать на NT и выше, т.к. управление RTS происходит
посредством прямого обращения к портам i/o.
В данном случае был обмен данными с девайсом по rs485 по
ModBus-совместимому протоколу с преобразователем 232-485 (для 485 линией
RTS сигнализируем о приеме передаче данных от мастера) Можно еще ошибки
обрабатывать при открытии порта и т.д....
Почти то же самое :) на асме:
................
setcomport proc
invoke CreateFile, addr COMN.buff, GENERIC_READ+GENERIC_WRITE, 0,
NULL, OPEN_EXISTING, 0, NULL
mov hCom, eax
invoke GetCommState, hCom, addr dcb
mov dword ptr[dcb.fbits],01085h
mov dcb.BaudRate,CBR_9600
mov dcb.Parity,NOPARITY
mov dcb.ByteSize,8
mov dcb.StopBits,ONESTOPBIT
invoke SetCommState, hCom, addr dcb
ret
setcomport endp
.............
BeginRequest proc
invoke EscapeCommFunction, hCom, CLRRTS
mov fRTS,RTS_NULL
invoke SetTimer, hWndMain, IDT_MS, 1, NULL
ret
BeginRequest endp
..................
.if fRTS==RTS_NULL
invoke getcrc, addr command, 6
mov command[6],al
mov command[7],ah
invoke ClearCommError, hCom, addr dwError, addr comStat
mov eax,comStat.cbInQue
.if (eax)
invoke ReadFile, hCom, addr mbuf, eax, addr dwByteRead, NULL
.endif
invoke WriteFile, hCom, addr command, 8, addr dwByteWrite, NULL
mov fRTS,RTS_NULL_AT
invoke SetTimer, ebx, IDT_MS, 1, NULL
.elseif fRTS==RTS_NULL_AT
invoke EscapeCommFunction, hCom, SETRTS
invoke SetTimer, ebx, IDT_MS, 4000, NULL
mov fRTS,RTS_ONE
.elseif fRTS==RTS_ONE
invoke ClearCommError, hCom, addr dwError, addr comStat
mov eax,comStat.cbInQue
or eax,eax
jz nxtr
invoke ReadFile, hCom, addr mbuf, eax, addr dwByteRead, NULL
mov eax,dwByteRead
cmp eax,comStat.cbInQue
jne nxtr
......................
Hello Schreibikus,
В общем идея понятна... Н-да, проблем особых нет...
Спасибо.