|
|
|
| неполучается сделать что-то вроде опрос модема сотового
нашёл только статью : http://ru.wikibooks.org/wiki/COM-%D0%BF%D0%BE%D1%80%D1%82_%D0%B2_Windows_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29
но так как там у меня не заработало . даже нет нет этого include <vector>
попробовал обойти примерно так:
<?
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
static int TIMEOUT = 5000;
int main(int argc, char *argv[])
{
DWORD feedback; // ?
unsigned char *str = "";
HANDLE port;
int i, len;
/* функция выходa перед return */
int nosc(char *txt) {
printf("-- %s\n", txt);
CloseHandle(port);
system("PAUSE");
}
/* функция записи */
int wrmodem(char *zapr) {
len = strlen(zapr);
if(!WriteFile(port, zapr, len, &feedback, 0) || feedback != len ) {
nosc("NET WriteFile");
return 0;
}
FlushFileBuffers(port);
}
/* функция чтения ответа */
int modemread(char *str) {
unsigned int begin = GetTickCount();
feedback = 0;
unsigned int attempts = 3;
printf("%d\n", (len = strlen(str))); // X
while(len && ((GetTickCount()- begin) < (TIMEOUT / 3) || attempts)) {
if (attempts) attempts--;
if(!ReadFile(port, str, 8, &feedback, NULL)) {
nosc("NET ReadFile");
return 0;
}
//assert(feedback <= len); #include <assert.h>
// len -= feedback;
// str += feedback;
printf("%s\n", str);
}
return 1;
}
/* открытие порта */
port = CreateFile("COM5", GENERIC_WRITE|GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
if (port == INVALID_HANDLE_VALUE) {
printf("Nel'zja otkryt' port\n");
system("PAUSE");
return 0;
}
/* настройки */
SetCommMask(port, EV_RXCHAR);
SetupComm(port, 1500, 1500);
COMMTIMEOUTS CommTimeOuts;
CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF;
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
CommTimeOuts.ReadTotalTimeoutConstant = TIMEOUT;
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = TIMEOUT;
if(!SetCommTimeouts(port, &CommTimeOuts)) {
nosc("NET SetCommTimeouts");
return 0;
}
DCB ComDCM;
memset(&ComDCM,0,sizeof(ComDCM));
ComDCM.DCBlength = sizeof(DCB);
GetCommState(port, &ComDCM);
ComDCM.BaudRate = CBR_115200; // скорость портА модема
ComDCM.ByteSize = 8;
ComDCM.Parity = NOPARITY;
ComDCM.StopBits = ONESTOPBIT;
ComDCM.fAbortOnError = TRUE;
ComDCM.fDtrControl = DTR_CONTROL_DISABLE;
ComDCM.fRtsControl = RTS_CONTROL_DISABLE;
ComDCM.fBinary = TRUE;
ComDCM.fParity = FALSE;
ComDCM.fInX = ComDCM.fOutX = FALSE;
ComDCM.XonChar = 0;
ComDCM.XoffChar = 0xff;
ComDCM.fErrorChar = FALSE;
ComDCM.fNull = FALSE;
ComDCM.fOutxCtsFlow = FALSE;
ComDCM.fOutxDsrFlow = FALSE;
ComDCM.XonLim = 128;
ComDCM.XoffLim = 128;
if(!SetCommState(port, &ComDCM)) {
nosc("NET SetCommState");
return 0;
}
/* запись запроса */
// wrmodem("ATE0");
wrmodem("AT+CGMM");
/* чтение */
modemread(&str);
/* закрытие */
nosc("vsjo prochitano");
return 1;
} |
но почему-то сколько справочников не качал ни в одном нет даже таких функций
WriteFile(port, zapr, len, &feedback, 0) - непойму что за параметр feedback
и как-то странно объявляется DWORD feedback;
и ReadFile(port, str, 4, &feedback, NULL) тоже не смог сделать
там вместо 4 было int(data.size()), которое у меня не работает
я так понимаю оно определяло размер возвращаемого ещё его до получения.
вообще какие-то функции незнакомые типа GetTickCount()
но кажется неполучается из-за WriteFile и ReadFile и цикл while не работает как надо изза того что вместо data.size() - strlen(str)
как сделать правильно что-то похожее ? | |
|
|