Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Не могу разобраться с WriteFile

31K
03 апреля 2008 года
lss
19 / / 03.04.2008
ATcommand - данная строка отсылается телефону, но что бы я не отсылал BytesWritten всегда равна 0... Помогите разобраться!!!


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;
}
535
03 апреля 2008 года
Нездешний
537 / / 17.01.2008
Вы, наверное, файл создаете с флагом FILE_FLAG_OVERLAPPED?
MSDN:
Цитата:
BOOL WriteFile(
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 Используйте в своих постах теги форматирования

87
03 апреля 2008 года
Kogrom
2.7K / / 02.02.2008
Iss, тут не весь код. Напишите вашу функцию открытия последовательного порта типа g_ComFile = CreateFile(...) тогда уже можно будет искать ошибку. Ну и настройки порта посмотреть надо.
31K
03 апреля 2008 года
lss
19 / / 03.04.2008
Цитата: Kogrom
Iss, тут не весь код. Напишите вашу функцию открытия последовательного порта типа g_ComFile = CreateFile(...) тогда уже можно будет искать ошибку. Ну и настройки порта посмотреть надо.



Окей вот класс:

[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="Нет соединения";
}
...

31K
03 апреля 2008 года
lss
19 / / 03.04.2008
[SIZE="4"]Всем спасибо!!!
Ошибка в строчке: GENERIC_READ||GENERIC_WRITE,
Надо: GENERIC_READ|GENERIC_WRITE,[/SIZE]
479
03 апреля 2008 года
Ухух
142 / / 05.05.2006
Я бы еще в CommTimeouts заглянул. Для передачи все нулями , а вот для приема надо расставить значения.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог