Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.10.2010, 17:44   #1
SilverRulezz
 
Аватар для SilverRulezz
 
Регистрация: 10.06.2010
Сообщений: 5
По умолчанию И вновь COM-порт

Есть примитивный код чтения-записи в COM-порт. Но и какого то [куча матов] он не работает.Точнее не работает ReadFile, а еще точнее просто зависает. Помогите разобраться в чем дело!

Код:
#include <iostream>
#include <windows.h>

using namespace std;

int main()
{
	HANDLE hComPort = CreateFileA("COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
	if(hComPort != INVALID_HANDLE_VALUE)
	{
		COMMTIMEOUTS ComTimeouts;
		ComTimeouts.ReadIntervalTimeout = 0;
		ComTimeouts.ReadTotalTimeoutConstant = 0;
		ComTimeouts.ReadTotalTimeoutMultiplier = 0;
		ComTimeouts.WriteTotalTimeoutConstant = 0;
		ComTimeouts.WriteTotalTimeoutMultiplier = 0;

		if(!SetCommTimeouts(hComPort, &ComTimeouts))
		{
			cout << "Cann't SetCommTimeouts!\n";
			return 0;
		}
		cout << "SetCommTimeouts\n";

		if(!PurgeComm(hComPort, PURGE_TXCLEAR|PURGE_RXCLEAR))
		{
			cout << "Cann't PurgeComm!\n";
			return 0;
		}
		cout << "PurgeComm\n";

		char *buf_out = "Test string!";
		DWORD bytes;

		if(!WriteFile(hComPort, buf_out, strlen(buf_out), &bytes, NULL) ||
			bytes != strlen(buf_out))
		{
			cout << "Cann't WriteFile!\n";
			return 0;
		}
		cout << "WriteFile\n";

		char *buf_in = new char[strlen(buf_out)];
		memset(buf_in, NULL, sizeof(char*));

		BOOL IsRead = ReadFile(hComPort, &buf_in, strlen(buf_out), &bytes, NULL);
		if(!IsRead)
		{
			cout << "Cann't ReadFile!\n";
			return 0;
		}
		else
			cout << "Readed: " << buf_in << "\n";
	}
	else
		cout << "Cann't open COM1 port!\n";
	return 0;
}
Доступные COM-порты:
Screen
COM-1 родной, а все остальные созданы с помощью Virtual Serial Port Kit ради теста. На ноуте вообще их куча, но не с одним этот код не пашет.
ICQ: 67-zero-5-zero-19
mail: silverrulezz[сабака]mail.ru
SilverRulezz вне форума Ответить с цитированием
Старый 17.10.2010, 19:27   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Читаем доки для начала.
Цитата:
When reading from a communications device, the behavior of ReadFile is governed by the current communication time-out as set and retrieved by using the SetCommTimeouts and GetCommTimeouts functions. Unpredictable results can occur if you fail to set the time-out values. For more information about communication time-outs, see COMMTIMEOUTS.
Цитата:
ReadIntervalTimeout
... A value of zero indicates that interval time-outs are not used.
Цитата:
A value of zero for both the ReadTotalTimeoutMultiplier and ReadTotalTimeoutConstant members indicates that total time-outs are not used for read operations.
p51x вне форума Ответить с цитированием
Старый 17.10.2010, 20:01   #3
SilverRulezz
 
Аватар для SilverRulezz
 
Регистрация: 10.06.2010
Сообщений: 5
По умолчанию

Спасибо за наводку
Немного модифицируем код проставим во всех значениях COMMTIMEOUTS 100 и получим еще более интересные результаты:

Код:
#include <iostream>
#include <windows.h>

using namespace std;

int main()
{
	char szComPort[100];
	char buf[4];

	for(int i = 1; i < 6; i++)
	{
		strcpy_s(szComPort, "\\\\.\\COM");
		_itoa(i, buf, 10); 
		strcat(szComPort, buf);

		HANDLE hComPort = CreateFileA(szComPort, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
		if(hComPort != INVALID_HANDLE_VALUE)
		{
			cout << "Port " << szComPort << " open.\n";
			COMMTIMEOUTS ComTimeouts;
			ComTimeouts.ReadIntervalTimeout = 100;
			ComTimeouts.ReadTotalTimeoutConstant = 100;
			ComTimeouts.ReadTotalTimeoutMultiplier = 100;
			ComTimeouts.WriteTotalTimeoutConstant = 100;
			ComTimeouts.WriteTotalTimeoutMultiplier = 100;

			if(!SetCommTimeouts(hComPort, &ComTimeouts))
			{
				cout << "Cann't SetCommTimeouts!\n";
				return 0;
			}
			cout << "SetCommTimeouts\n";

			if(!PurgeComm(hComPort, PURGE_TXCLEAR|PURGE_RXCLEAR))
			{
				cout << "Cann't PurgeComm!\n";
				return 0;
			}
			cout << "PurgeComm\n";

			char *buf_out = "Test!";
			DWORD bytes;

			if(!WriteFile(hComPort, buf_out, strlen(buf_out), &bytes, NULL) ||
				bytes != strlen(buf_out))
			{
				cout << "Cann't WriteFile!\n";
				return 0;
			}
			cout << "WriteFile\n";

			char *buf_in = new char[strlen(buf_out)];
			memset(buf_in, 1, sizeof(char*));

			ReadFile(hComPort, buf_in, strlen(buf_out), &bytes, NULL);
			cout << "Readed: " << buf_in << "\nBytes: " << bytes << "\n\n";
		}
		else
			cout << "Cann't open port! " << szComPort << "\n\n";
	}
	return 0;
}
Результат: http://d.imagehost.org/download/0357/1_3
ICQ: 67-zero-5-zero-19
mail: silverrulezz[сабака]mail.ru

Последний раз редактировалось SilverRulezz; 17.10.2010 в 20:04.
SilverRulezz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
И вновь проблема с DateTimePicker sl963 БД в Delphi 15 06.06.2010 17:15
Порт Bat{CMD}_Men Работа с сетью в Delphi 1 20.12.2009 21:07
Защита листа вновь созданой макросом книги. КаМММ Microsoft Office Excel 1 27.04.2009 06:14
COM порт SanekIrk Win Api 2 28.12.2008 06:20
порт ps/2 _Dmitry Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 01.10.2007 21:28