Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 сентября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Давно заметил, что всё-таки языки С/C++ это не самый лучший вариант программирования под Windows. Сейчас появилась масса более современных и удобных языков, например тот же Python - кроссплатформенный язык, очень легок в изучение. Я его изучил буквально за несколько дней по этому курсу - ссылка. Автор постарался, там видеоуроки на удивление легкие и понятные.

Работа с COM портом в Visual C++


Автор: Paul Belikian.

Обычно порт открывается как обычный файл. Как только порт открыт, то в него можно записывать и считывать как из обычного файла. Конечно же прийдётся добавить различные проверки байтов при чтении и записи.

CComPort::CComPort(CString& sComPort)
 {
 	m_sComPort = sComPort;
 	m_bPortReady = FALSE;
 } // конец конструктора CComPort
 
 CComPort::~CComPort()
 {
 
 } // конец деструктора CComPort
 
 //
 // инициализация COM порта
 //
 BOOL CComPort::Initialize()
 {
 	DWORD	dwRC;
 	DWORD	dwError;
 	char	sMsg[512];
 
 	m_bPortReady = TRUE; // всё OK
 
 	m_hCom = CreateFile(m_sComPort,
 		GENERIC_READ | GENERIC_WRITE,
 		0, // экслюзивно занимаем порт
 		NULL, // no security
 		OPEN_EXISTING,
 		0, // no overlapped I/O
 		NULL); // null template
 
 	if (m_hCom == INVALID_HANDLE_VALUE)
 	{
 		m_bPortReady = FALSE;
 		dwError = GetLastError();
 
 		// обработка ошибки
 		LPVOID lpMsgBuf;
 		lpMsgBuf = NULL;
 		dwRC = FormatMessage(
 			FORMAT_MESSAGE_ALLOCATE_BUFFER |
 			FORMAT_MESSAGE_FROM_SYSTEM |
 			FORMAT_MESSAGE_IGNORE_INSERTS,
 			 NULL,
 			dwError, //  из GetLastError(),
 			MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //
 			(LPTSTR) &lpMsgBuf,
 			0,
 			NULL);
 
 		if (dwRC && lpMsgBuf)
 		{
 			sprintf(sMsg, "COM open failed: Port=%s Error=%d - %s",
 				m_sComPort, dwError, lpMsgBuf);
 			AfxMessageBox(sMsg);
 		}
 		else
 		{
 			sprintf(sMsg, "COM open failed: Port=%s Error=%d ",
 				m_sComPort, dwError);
 			AfxMessageBox(sMsg);
 		} // end if
 		if (dwRC && lpMsgBuf)
 		{
 			LocalFree( lpMsgBuf );
 		} // end if
 
 	} // end if
 
 	if (m_bPortReady)
 	{
 		m_bPortReady = SetupComm(m_hCom,
 				128, 128); // размер буфера
 		if (!m_bPortReady)
 		{
 			dwError = GetLastError();
 			sprintf(sMsg, "SetupComm failed: Port=%s Error=%d",
 				m_sComPort, dwError);
 			AfxMessageBox(sMsg);
 
 		} // end if
 	} // end if
 
 	if (m_bPortReady)
 	{
 		m_bPortReady = GetCommState(m_hCom, &m_dcb);
 		if (!m_bPortReady)
 		{
 			dwError = GetLastError();
 			sprintf(sMsg, "GetCommState failed: Port=%s Error=%d",
 				m_sComPort, dwError);
 			AfxMessageBox(sMsg);
 		} // end if
 	} // end if
 
 	if (m_bPortReady)
 	{
 		m_dcb.BaudRate = 9600;
 		m_dcb.ByteSize = 8;
 		m_dcb.Parity = NOPARITY;
 		m_dcb.StopBits = ONESTOPBIT;
 		m_dcb.fAbortOnError = TRUE;
 
 		m_bPortReady = SetCommState(m_hCom, &m_dcb);
 		if (!m_bPortReady)
 		{
 			dwError = GetLastError();
 			sprintf(sMsg, "SetCommState failed: Port=%s Error = %d",
 				m_sComPort, dwError);
 			AfxMessageBox(sMsg);
 		}
 	} // end if
 
 	if (m_bPortReady)
 	{
 		m_bPortReady = GetCommTimeouts (m_hCom, &m_CommTimeouts);
 		if (!m_bPortReady)
 		{
 			dwError = GetLastError();
 			sprintf(sMsg, "GetCommTimeouts failed: Port=%s Error = %d",
 				m_sComPort, dwError);
 			AfxMessageBox(sMsg);
 		} // end if
 	} // end if
 
 	if (m_bPortReady)
 	{
 		m_CommTimeouts.ReadIntervalTimeout = 50;
 		m_CommTimeouts.ReadTotalTimeoutConstant = 50;
 		m_CommTimeouts.ReadTotalTimeoutMultiplier = 10;
 		m_CommTimeouts.WriteTotalTimeoutConstant = 50;
 		m_CommTimeouts.WriteTotalTimeoutMultiplier = 10;
 		m_bPortReady = SetCommTimeouts (m_hCom, &m_CommTimeouts);
 		if (!m_bPortReady)
 		{
 			dwError = GetLastError();
 			sprintf(sMsg, "SetCommTimeouts failed: Port=%s Error = %d",
 				m_sComPort, dwError);
 			AfxMessageBox(sMsg);
 		} // end if
 	} // end if
 
 	return m_bPortReady;
 } // end CComPort::Initialize
 
 
 //
 // освобождаем COM порт
 //
 void CComPort::Terminate()
 {
 	CloseHandle(m_hCom);
 } /
 
 
Еще один пример здесь

Еще какой-то стандартный исходник, чуть ли не микрософтовский. По нему разобраться в принципе можно, как с компортом работать. здесь

<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS