Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Очевидно нет, вот текст портовой обслуги :

Отправлено UraGun (77.93.41.58) 19 января 2011, г. 10:50
В ответ на: ПРиём по полингу и прерыванию? отправлено Trashy 19 января 2011, г. 10:41

//---------------------------------------------------------------------------

#include "stdafx.h"
#include <vcl.h>
#include <assert.h>
#pragma hdrstop
//using namespace System;
//using namespace System::IO::Ports;
//private System::IO::Ports::SerialPort^serialPort1;


TPort *ComPort = NULL;
HANDLE hReadPortThread = NULL;
extern TTimer *Timer3;

//=================================================================================
TPort::TPort()
{
hPort = INVALID_HANDLE_VALUE;
}
//=================================================================================
TPort::~TPort()
{
Close();
}
//=================================================================================
// Cae?uou ii?o
//=================================================================================
bool TPort::Close()
{
bool ret = false;
if(hPort != INVALID_HANDLE_VALUE)
{
ret = (CloseHandle(hPort) != 0);
hPort = INVALID_HANDLE_VALUE;
}

return ret;
}
//=================================================================================
// Ioe?uou ii?o
//=================================================================================
bool TPort::Open(unsigned char comm)
{
if(hPort != INVALID_HANDLE_VALUE) Close();

switch (comm)
{
case 0: hPort = CreateFile("COM1", GENERIC_READ |GENERIC_WRITE,0,NULL,
OPEN_EXISTING, 0/*FILE_FLAG_OVERLAPPED*/, NULL);break;
case 1: hPort = CreateFile("COM2", GENERIC_READ | GENERIC_WRITE,0,NULL,
OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);break;
case 2: hPort = CreateFile("COM3", GENERIC_READ | GENERIC_WRITE,0,NULL,
OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);break;
case 3: hPort = CreateFile("COM4", GENERIC_READ | GENERIC_WRITE,0,NULL,
OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);break;
case 4: hPort = CreateFile("COM5", GENERIC_READ | GENERIC_WRITE,0,NULL,
OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);break;
case 5: hPort = CreateFile("COM6", GENERIC_READ | GENERIC_WRITE,0,NULL,
OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);break;
case 6: hPort = CreateFile("COM7", GENERIC_READ | GENERIC_WRITE,0,NULL,
OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);break;
case 7: hPort = CreateFile("COM8", GENERIC_READ | GENERIC_WRITE,0,NULL,
OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);break;
case 8: hPort = CreateFile("COM9", GENERIC_READ | GENERIC_WRITE,0,NULL,
OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);break;
case 9: hPort = CreateFile("COM10", GENERIC_READ | GENERIC_WRITE,0,NULL,
OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);break;
default:break;

}
return (hPort != INVALID_HANDLE_VALUE);
}
//=================================================================================
// Na?ineou ana aooa?a
//=================================================================================
bool TPort::Purge()
{
return (
0 != PurgeComm(hPort,
PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR)
);
}

//=================================================================================
// Onoaiiaeou iniiaiua iano?ieee ii?oa
//=================================================================================
bool TPort::InitDCB(unsigned long BaudRate)
{
DCB dcb;
if (!GetCommState(hPort, &dcb)) return false;
dcb.BaudRate = BaudRate; // Nei?inou ia?aaa?e aaiiuo 38400 Aia
dcb.fBinary=TRUE; // Win32 anaaaa TRUE
dcb.fParity=TRUE; // IA auiieiyou i?iaa?eo ?aoiinoe
dcb.fOutxCtsFlow =FALSE; // -
dcb.fOutxDsrFlow= FALSE; // -
dcb.fDtrControl=DTR_CONTROL_DISABLE; // Eeie? DTR iu ia eniieucoai
dcb.fDsrSensitivity = FALSE; // Ioeacuaaainy ii oie ?a i?e?eia
dcb.fTXContinueOnXoff=TRUE; // Ia ionea?eaaou ia?aiieiaiea i?eaiiiai aooa?a a?aeaa?a Windows
dcb.fAbortOnError=FALSE; // ClearCommError - ia aucuaaou
dcb.fOutX=FALSE; //
dcb.fInX=FALSE; //
dcb.fErrorChar=FALSE; // Neiaie n ioeai?iie ?aoiinou? ia caiaiyou ie?ai
dcb.fRtsControl = RTS_CONTROL_DISABLE; // aee??eou
dcb.ByteSize = 8; // 8 Aeo
dcb.Parity = EVENPARITY;//NOPARITY; // Aac eiio?iey ?aoiinoe
dcb.StopBits = ONESTOPBIT; // Iaei noiiiaue aeo
dcb.fNull =false; //ia ioa?anuaaou ioeaaua aaeou
return (SetCommState(hPort, &dcb) != 0) ;
}
//=================================================================================
// Onoaiiaea oaei-aooia aey iia?aoee ?oaiey/caiene
//=================================================================================
bool TPort::SetTimeOut()
{
COMMTIMEOUTS CommTimeouts;
CommTimeouts.ReadIntervalTimeout = 1000;
CommTimeouts.ReadTotalTimeoutMultiplier = 1;
CommTimeouts.ReadTotalTimeoutConstant = 0;
CommTimeouts.WriteTotalTimeoutMultiplier = 1;
CommTimeouts.WriteTotalTimeoutConstant = 0;
return (SetCommTimeouts(hPort,&CommTimeouts) !=0);
}
//=================================================================================
// Onoaiaaeeaaai ?acia? ?aeiiaiaoaiiai aooa?a iaiaia
//=================================================================================
bool TPort::SetBufferSize()
{
return (SetupComm(hPort,256,256) != 0);
}


//=================================================================================
//
//=================================================================================
int TPort::Read(unsigned char *buf,int szbuf)
{
DWORD ReadCount;
OVERLAPPED osReader = {0};
bool RetVal = true;

osReader.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (osReader.hEvent == NULL) return false; // Iieiue iaeii
if (!(ReadFile(hPort, buf ,szbuf, &ReadCount, &osReader))){
if (GetLastError() != ERROR_IO_PENDING) RetVal = false;
else{
DWORD dwRes = WaitForSingleObject(osReader.hEvent, 10000);
switch(dwRes){
case WAIT_OBJECT_0:
if (!GetOverlappedResult(hPort, &osReader, &ReadCount, FALSE))
RetVal = false;
break;
case WAIT_TIMEOUT:
RetVal = false;
break;
default:
RetVal = false;
break;
}
}
}
CloseHandle(osReader.hEvent);
return RetVal;
}

//================================================================================
//
//=================================================================================
int TPort::Write(unsigned char *buf,int szbuf){

DWORD ReadCount;
OVERLAPPED osWrite = {0};
bool RetVal = true;

osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (osWrite.hEvent == NULL) return false; // Iieiue iaeii

if (!WriteFile(hPort,buf, szbuf , &ReadCount, &osWrite)){
if (GetLastError() != ERROR_IO_PENDING) RetVal = false;
else{
DWORD dwRes = WaitForSingleObject(osWrite.hEvent, INFINITE);
switch(dwRes){
case WAIT_OBJECT_0:
if (!GetOverlappedResult(hPort, &osWrite, &ReadCount, FALSE))
RetVal = false;
break;
default:
RetVal = false;
break;
}
}
}

CloseHandle(osWrite.hEvent);
return RetVal;
}

//=================================================================================
//
//=================================================================================
bool TPort::Run(unsigned char com, unsigned long BaudRate)
{
if(!Open(com)) return false;
if(!InitDCB(BaudRate)) return false;
if(!SetBufferSize()) return false;
if(!Purge()) return false;
if(!SetTimeOut()) return false;


return true;
}




//=================================================================================
// Ioi?aaea niiauaie
//=================================================================================
bool ComSendMessage(unsigned char *buff, int sz_buff)
{




if (ComPort){
ComPort->Purge();
ComPort->Write(buff,sz_buff);

return true;
}
return false;
}

//==============================
// i?e?i niiauaeiy
//==============================

bool ComGetMessage(unsigned char *buff, int sz_buff)
{

if (ComPort){
//ComPort->Write(buff,sz_buff);

ComPort->Read(buff,sz_buff) ;
//if (buff[0]==13)
//{for (int cou=0;cou<sz_buff;cou++) buff[cou]=buff[cou+1];}
return true;
}
return false;
}
//=================================================================================
// Ioe?uoea ii?oa.
//=================================================================================
bool RunComPort(unsigned char com, unsigned long BaudRate){
DWORD dwThreadID1;
DWORD dwThreadID2;
bool ret = false;
if (!ComPort){
ComPort = new TPort();
ret = ComPort->Run(com,BaudRate);
if (!hReadPortThread){
hReadPortThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ReadPortThread,0,0,&dwThreadID1);
SetThreadPriority(hReadPortThread,THREAD_PRIORITY_TIME_CRITICAL);
}
}
return ret;
}
//=================================================================================
// Cae?uoea ii?oa.
//=================================================================================
bool StopComPort(void){
if (hReadPortThread){
TerminateThread(hReadPortThread,0);
CloseHandle(hReadPortThread);
hReadPortThread = NULL;
}
if (ComPort){
if (!ComPort->Close()) return false;
delete ComPort;
ComPort = NULL;
return true;
}
return false;
}
//=================================================================================
// Ooieoey iioiea.
//=================================================================================
DWORD ReadPortThread(void *Param){
unsigned char Char;
while(1){
if(ComPort->Read(&Char,1)){
SendMessage(FindWindow("TFormMain","AppCom"),WM_USER,Char,0);
}
}
}
//---------------------------------------------------------------------------




Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 654:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru