Не могу разобраться с WriteFile
String TMobile::SendCommandToMobile(String ATcommand)
{
DWORD BytesWritten;
String s;
char d[1500];
DWORD BytesRead;
s=ATcommand;[COLOR="RoyalBlue"]// Пример ATcommand="AT+GMM"[/COLOR]
s=s+ char(13);[COLOR="RoyalBlue"]// Добавляем в конец символы 13 и 10[/COLOR]
s=s+ char(10);[COLOR="RoyalBlue"]//[/COLOR]
WriteFile(g_ComFile, s.c_str(), s.Length(), &BytesWritten, NULL); [COLOR="RoyalBlue"]//:и посылаем их телефону[/COLOR]
if (!(ReadFile(g_ComFile, d, sizeof(d), &BytesRead, NULL)))
{
return NULL;
}
[COLOR="RoyalBlue"] //Считываем ответ от телефона[/COLOR]
s = "";
for(int i=0;i<BytesRead;i++) s = s + d;
return s;
}
MSDN:
HANDLE hFile, // handle to file to write to
LPCVOID lpBuffer, // pointer to data to write to file
DWORD nNumberOfBytesToWrite, // number of bytes to write
LPDWORD lpNumberOfBytesWritten, // pointer to number of bytes written
LPOVERLAPPED lpOverlapped // pointer to structure for overlapped I/O
);
...
lpNumberOfBytesWritten
...
Windows NT: If lpOverlapped is not NULL, lpNumberOfBytesWritten can be NULL. If this is an overlapped write operation, you can get the number of bytes written by calling GetOverlappedResult. If hFile is associated with an I/O completion port, you can get the number of bytes written by calling GetQueuedCompletionStatus.
PS Используйте в своих постах теги форматирования
Окей вот класс:
[COLOR="SeaGreen"]#include <windows.h>[/COLOR]
class TMobile {
public:
TMobile();
~TMobile();
String GetMobileModel();
String SendCommandToMobile(String ATcommand);
bool Connect(String port,String speed);
bool OpenCOMPort(String ComString);
bool SetupCOMPort(int ComSpeed);
HANDLE g_ComFile; [COLOR="Blue"]//Хэндл создаваемого нами файла[/COLOR]
Boolean g_now_mobileconnect ; /[COLOR="Blue"]/подключен или не подключен (чтобы в дальнейшем проверять статус)[/COLOR]
String g_port;
String g_speed;
};
TMobile::TMobile() [COLOR="Blue"]//конструктор класса[/COLOR]
{
}
TMobile::~TMobile() [COLOR="Blue"]//деструктор класса[/COLOR]
{
CloseHandle(g_ComFile);
g_now_mobileconnect = false;
}
// ______________________________
// Производитель телефона
// ______________________________
String TMobile::GetMobileModel()
{
return SendCommandToMobile("AT+GMM");
}
[COLOR="Blue"] // ______________________________
// Отправляет команду на телефон и возвращает ответ
// ______________________________[/COLOR]
String TMobile::SendCommandToMobile(String ATcommand)
{
String s;
char d[1500];
DWORD BytesRead;
DWORD BytesWritten;
s=ATcommand;
s=s+ char(13);
s=s+ char(10);
s=s+ char(0);
int len=s.Length();
WriteFile(g_ComFile, s.c_str(), len , &BytesWritten, NULL); //:и посылаем их телефону
if (!(ReadFile(g_ComFile, d, sizeof(d), &BytesRead, NULL)))
{
MessageBox(NULL,"Ошибка чтения данных с телефона!", "error!", MB_ICONINFORMATION);
return NULL;
}
//Считываем ответ от телефона
s = "";
for(int i=1;i<BytesRead;i++) s = s + d;
return s;
}
[COLOR="Blue"] // ______________________________
// Подключение телефона
// ______________________________[/COLOR]
bool TMobile::Connect(String port,String speed)[COLOR="Blue"]// port="COM4" Speed="19200"[/COLOR]
{
String COM_str;
int COM_speed;
bool COM_valid;
String rez;
[COLOR="Blue"]// По умолчанию[/COLOR]
COM_valid = false;
g_port=port;
g_speed=speed;
COM_str = g_port;
COM_speed = StrToInt(g_speed);
[COLOR="Blue"]// Проверяем подключен ли телефон к этому порту[/COLOR]
if (OpenCOMPort(COM_str))
if (SetupCOMPort(COM_speed))
COM_valid = true;
[COLOR="Blue"]// ______________________________
// Открытие COM порта
// ______________________________[/COLOR]
bool TMobile::OpenCOMPort(String ComString)
{
// char DeviceName[]="COM4";
//ComString.c_str();
// DeviceName=ComString.c_str();
//StrPCopy(DeviceName, Device);
//bool Resulta;
g_ComFile = CreateFile(ComString.c_str(),
GENERIC_READ||GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
if (g_ComFile == INVALID_HANDLE_VALUE) g_now_mobileconnect = false;
else g_now_mobileconnect = true;
return g_now_mobileconnect;
}
[COLOR="Blue"] // ______________________________
// Настройка COM порта
// ______________________________[/COLOR]
bool TMobile::SetupCOMPort(int ComSpeed)
{
int RxBufferSize = 256;
int TxBufferSize = 256;
TDCB DCB;
TCommTimeouts CommTimeouts;
CommTimeouts.ReadIntervalTimeout= 0;
CommTimeouts.ReadTotalTimeoutMultiplier = 0;
CommTimeouts.ReadTotalTimeoutConstant = 1000;
CommTimeouts.WriteTotalTimeoutMultiplier = 0;
CommTimeouts.WriteTotalTimeoutConstant = 1000;
bool Res = True;
String Config = "baud=" + IntToStr(ComSpeed) + " parity=n data=8 stop=1"; //Устанавливаем скорость
if (!(SetupComm(g_ComFile, RxBufferSize, TxBufferSize))) Res=False;
if (!(GetCommState(g_ComFile, &DCB))) Res=False;
if (!(BuildCommDCB(Config.c_str(), &DCB))) Res=False;
if (!(SetCommState(g_ComFile, &DCB))) Res=False;
if (!(SetCommTimeouts(g_ComFile, &CommTimeouts))) Res = False;
return Res;
}
[SIZE="4"]// Создаете простое приложение с 2 Edit и 1 Мемо[/SIZE]
...
TMobile m;
/[COLOR="Blue"]/ Содеджание полей
//Edit1->Text="COM4"
//Edit2->Text="19200"[/COLOR]
if (m.Connect(Edit1->Text,Edit2->Text))
{
Memo1->Text=m.GetMobileModel();
}
else
{
Memo1->Text="Нет соединения";
}
...
Ошибка в строчке: GENERIC_READ||GENERIC_WRITE,
Надо: GENERIC_READ|GENERIC_WRITE,[/SIZE]