|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Май 18, 2004 15:06:07 Ребята, выручайте!!! как этот код выглядит на масме:
void CComportDlg::SetModem() //Настраиваем модем
{
BOOL bResult = TRUE;
m_sComPort = "Com1";
m_hCom = CreateFile(m_sComPort,
GENERIC_READ | GENERIC_WRITE,
0, // эксклюзивный доступ
NULL, // никакой безопасности :-)
OPEN_EXISTING,
0,
NULL);
m_bPortReady = SetupComm(m_hCom, 128, 128); // установка размера буфера
m_bPortReady = GetCommState(m_hCom, &m_dcb);
m_dcb.BaudRate = nBaudRate; //38400
m_dcb.ByteSize = nByteSize; //8
m_dcb.Parity = NOPARITY;
m_dcb.StopBits = ONESTOPBIT;
m_dcb.fAbortOnError = TRUE;
m_bPortReady = SetCommState(m_hCom, &m_dcb);
m_bPortReady = GetCommTimeouts (m_hCom, &m_CommTimeouts);
m_CommTimeouts.ReadIntervalTimeout = nReadIntervalTimeout; //50
m_CommTimeouts.ReadTotalTimeoutConstant = nReadTotalTimeoutConstant; //50
m_CommTimeouts.ReadTotalTimeoutMultiplier = nReadTotalTimeoutMultiplier; //10
m_CommTimeouts.WriteTotalTimeoutConstant = nWriteTotalTimeoutConstant; //50
m_CommTimeouts.WriteTotalTimeoutMultiplier = nWriteTotalTimeoutMultiplier; //10
m_bPortReady = SetCommTimeouts (m_hCom, &m_CommTimeouts);
sFirstCommand+="\r"; //AT&ATQ0
sSecondCommand+="\r"; //ATS7=20
// Первая команда
bWriteRC = WriteFile(m_hCom, (LPCVOID) sFirstCommand,
8, &iBytesWritten, NULL);
ReadPortData(); //Считываем ответ
if(sPortValue.Find("OK", 0) != -1) //Если вернулось "ОК" или "0"
{
//Вторая команда (тоже самое)
bWriteRC = WriteFile(m_hCom, (LPCVOID)sSecondCommand,
8, &iBytesWritten, NULL);
ReadPortData();
if(sPortValue.Find("OK", 0) == -1) bResult = FALSE;
}
else bResult = FALSE;
//Результат обеих команд
if(bResult) dlgRep.m_RepString="Modem initialization is OK";
else dlgRep.m_RepString="Modem initialization error occur";
CloseHandle(m_hCom);
m_uTimerID = SetTimer(0x451,1000,NULL);
dlgRep.DoModal(); //Окно с сообщением о результате
}
|
|
|
Дата: Май 18, 2004 15:17:37 · Поправил: Stenton Вот что я пишу...
invoke CreateFile,addr comX,GENERIC_READ or GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL
invoke SetupComm,hcomm,8192,8192
invoke GetCommState,hcomm,addr m_dcb
mov m_dcb.BaudRate,38400
mov m_dcb.ByteSize,8
mov m_dcb.Parity,NOPARITY;
mov m_dcb.StopBits,ONESTOPBIT;
;mov m_dcb.AbortOnError,TRUE; вообще строку не воспринимает мой РадАсм???
invoke SetCommState,hcomm,addr m_dcb
invoke GetCommTimeouts,hcomm,addr m_CommTimeouts
mov m_CommTimeouts.ReadIntervalTimeout,50
mov m_CommTimeouts.ReadTotalTimeoutConstant,50
mov m_CommTimeouts.ReadTotalTimeoutMultiplier,10
mov m_CommTimeouts.WriteTotalTimeoutConstant,50
mov m_CommTimeouts.WriteTotalTimeoutMultiplier,10
invoke SetCommTimeouts,hcomm,addr m_CommTimeouts
;sFirstCommand+="\r"; //AT&ATQ0 Не знаю как добавить к комманде "\r"
;sSecondCommand+="\r"; //ATS7=20
invoke WriteFile,hcomm,offset
sFirstCommand,2,addr iBytesWritten,NULL
invoke ReadFile,hcomm,addr ReadPortData,80,addr iBytesWritten,NULL
;if(sPortValue.Find("OK", 0) != -1) как на асме найти в ответе девайса "ОК" ???
invoke WriteFile,hcomm,offset sSecondCommand,0,addr iBytesWritten,NULL
invoke ReadFile,hcomm,addr ReadPortData,0,0,NULL
;if(sPortValue.Find("OK", 0) == -1) bResult = FALSE;
;else bResult = FALSE;
;if(bResult) dlgRep.m_RepString="Modem initialization is OK";
; else dlgRep.m_RepString="Modem initialization error occur";
;end
invoke CloseHandle,hcomm
;m_uTimerID =
invoke SetTimer,hWnd,addr nIDEvent,1000,NULL А нафига тут таймер??? я даже не знаю, но оставил как было.
;dlgRep.DoModal() Ну с окном все ясно, это можно не трогать...
invoke CloseHandle, hcomm
Вот что я смог переписать... В итоге ответа я не получаю... а именно, не вижу заветного "ОК" или не менее приятной надписи "ЕRROR" Может кто подскажет хоть что нибудь... В каком варианте код работать будет? |
|
|
Дата: Май 18, 2004 19:19:57 · Поправил: Quantum Stenton После CreateFile надо сохранить результат в hcomm: mov hcomm,eax "\r" на асме - это 13 или 0Dh. Можно добавить через lstrcat или вручную. |
|
|
Дата: Май 18, 2004 19:20:06 · Поправил: Stenton Спасибо Quantum!!!!!!!!!! очень рад слышать! |
|
|
Дата: Май 19, 2004 20:12:39 ;if(sPortValue.Find("OK", 0) != -1) как на асме найти в ответе девайса "ОК" ??? Похоже что метод String.Find ищет подстроку "OK" в основной строке. На асме это можно организовать следующим образом: .DATA sOK db "OK",0 sPortValue db 80 dup (0) ; . . . .CODE ; . . . invoke IsSubStr,OFFSET sOK,OFFSET sPortValue test eax,eax jz @notfound ; получен "OK"! Ну, и сама функция IsSubStr (код не оптимизирован): ; Check whether str1 is a substring of str2:
; -----------------------------------------
; Returns No - 0
; Yes - other
; =========================================
IsSubStr PROC str1:DWORD,str2:DWORD
mov eax,str2
mov edx,str1
@@: movzx ecx,BYTE PTR [eax]
jecxz @endloop ; no match
cmp BYTE PTR [edx],0
je @R ; match!
inc eax
inc edx
cmp cl,BYTE PTR [edx - 1]
je @B
add cl,32
cmp cl,BYTE PTR [edx - 1]
je @B
mov edx,str1
jmp @B
@endloop:
xor eax,eax
@R: ret
IsSubStr ENDP |
|
|
Дата: Май 19, 2004 20:25:01 Дык а проблем-то какие? Что, так трудно заставить компилер сделать ассемблерный листинг? Потом переписать по шаблону? В том же коде ничего, кроме вызовов API и нет! От MFC придется избавится, а в остальном - я не вижу принципиальных сложностей! |
|
|
Дата: Май 20, 2004 12:00:44 · Поправил: Stenton Quantum volodya Ребят, а может и не надо искать "ОК" в ответе? Может есть такая функция, которая автоматом возвращает ОК или ERROR после посыла данных (АТ-комманд) в порт, просто я о ней не знаю? п.с. Но за функцию поиска все равно спасибо... я не так пытался сделать.... вот моя вершен: .data comX db 'COM4',0 hOK db 'OK',0 .data? ReadPortData db ? PortText dd ?; это у меня в едит-бокс текст вводится (по умолчанию AT) m_dcb DCB <?> .code invoke CreateFile,addr comX,GENERIC_READ or GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL mov eax,hcomm - как сказал Quantum invoke SetupComm,hcomm,128,128 invoke GetCommState,hcomm,addr m_dcb mov m_dcb.BaudRate,115200 mov m_dcb.ByteSize,8 mov m_dcb.Parity,NOPARITY mov m_dcb.StopBits,ONESTOPBIT mov m_dcb.XonChar,11h mov m_dcb.XoffChar,13h mov m_dcb.XonLim,80 mov m_dcb.XoffLim,200 invoke SetCommState,hcomm,addr m_dcb invoke GetCommTimeouts,hcomm,addr m_CommTimeouts mov m_CommTimeouts.ReadIntervalTimeout,10 mov m_CommTimeouts.ReadTotalTimeoutConstant,0 mov m_CommTimeouts.ReadTotalTimeoutMultiplier,0 mov m_CommTimeouts.WriteTotalTimeoutConstant,5000 mov m_CommTimeouts.WriteTotalTimeoutMultiplier,0 invoke SetCommTimeouts,hcomm,addr m_CommTimeouts invoke SetCommMask,hcomm,EV_RLSD or EV_ERR; or EV_ERR invoke GetDlgItemText,hWnd,IDC_EDT1,addr PortText,50 invoke WriteFile,hcomm,addr PortText,50,addr iBytesWritten,NULL invoke ReadFile,hcomm,addr ReadPortData,50,addr NrOfBytesRead,NULL invoke FindFirstFile,addr ReadPortData,offset hOK ;mov eax,offset ReadPortData ;cmp eax,offset hOK - вот тут я и хотел найти ОК :о)) invoke SendDlgItemMessage,hWnd,IDC_LST2,LB_ADDSTRING,NULL,addr ReadPortData invoke CloseHandle,hcomm и в ответ я получаю туже комманду (тот же текст) что послал и куча мусора ... но никаких ОК или ERROR :о)) |
|
|
Дата: Май 20, 2004 13:23:59 Еще вопрос - после того, как я отправил в порт символы "АТ\r", наверное нужно перевести модем в режим передачи? или как он мне ответ вышлет??? т.е. я к тому, что я шлю шлю ему всяку дрянь, а в ответ он ниче не говорит, даже не ругается :о(( |
|
|
Дата: Май 20, 2004 17:53:40 Stenton FindFirstFile ищет файлы, а не ASCII-строки. А где код ReadPortData() на VC++? |
|
|
Дата: Май 20, 2004 18:07:49 Stenton > mov eax,hcomm - как сказал Quantum :-) Здаётся мне что он все-таки не так сказал как ты это представил ;-) |
|
|
Дата: Май 21, 2004 12:36:15 Asterix да, чето со зрением у мя :о))) Quantum А где код ReadPortData() на VC++? А какой должен быть код? может быть я че-то упустил? |
|
|
Дата: Май 21, 2004 16:21:40 invoke ReadPortData там где было ReadPortData() |
|
|
Дата: Май 21, 2004 17:10:21 · Поправил: Stenton Аааа, я понял про что речь... вот (это и есть код Quantum-а): ReadPortData PROC str1:DWORD,str2:DWORD
mov eax,str2
mov edx,str1
@@: movzx ecx,BYTE PTR [eax]
jecxz @endloop ; no match
cmp BYTE PTR [edx],0
je @R ; match!
inc eax
inc edx
cmp cl,BYTE PTR [edx - 1]
je @B
add cl,32
cmp cl,BYTE PTR [edx - 1]
je @B
mov edx,str1
jmp @B
@endloop:
xor eax,eax
@R: ret
ReadPortData ENDP
Вот какой код у меня сейчас: invoke GetDlgItemText,hWnd,IDC_EDT1,addr PortText,50 invoke lstrcat,offset PortText,offset sReturnChar invoke WriteFile,hcomm,addr PortText,50,addr iBytesWritten,NULL invoke ReadFile,hcomm,addr sPortValue,50,addr NrOfBytesRead,NULL invoke ReadPortData,offset sOK,offset sPortValue test eax,eax jz Notfound invoke SendDlgItemMessage,hWnd,IDC_LST2,LB_ADDSTRING,NULL,addr sOK Notfound: |
|
|
Дата: Май 21, 2004 17:26:50 Stenton В исходном коде на C++ есть вызов функции ReadPortData(). Где код этой функции? Там просто вызывается ReadFile или может быть что-то ещё. Ещё нужно проверять значение NrOfBytesRead. Если там ноль, то парсить полученную строку не имеет смысла. |
|
|
Дата: Май 21, 2004 18:17:09 Stenton Откуда вобще этот С-шный исходник, может давно пора его в топик в виде аттача прицепить? |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.192 |