· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Ребята, выручайте!!! Проблема с СОМ-портом

. 1 . 2 . >>

Посл.отвђт Сообщен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

Откуда вобще этот С-шный исходник, может давно пора его в топик в виде аттача прицепить?

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.192