OpenCores
URL https://opencores.org/ocsvn/miniuart2/miniuart2/trunk

Subversion Repositories miniuart2

[/] [miniuart2/] [trunk/] [sw/] [TestCom/] [Thread.cpp] - Rev 26

Compare with Previous | Blame | View Log

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
 
#include <stdlib.h>
#include "Thread.h"
 
#pragma package(smart_init)
 
//static AnsiString asBuf = "";
static char sBuf[205];
static stErr stErr1;
HANDLE hComm;
 
//---------------------------------------------------------------------------
//   Important: Methods and properties of objects in VCL can only be
//   used in a method called using Synchronize, for example:
//
//      Synchronize(UpdateCaption);
//
//   where UpdateCaption could look like:
//
//      void __fastcall Thread_Com::UpdateCaption()
//      {
//        Form1->Caption = "Updated in a thread";
//      }
//---------------------------------------------------------------------------
__fastcall Thread_Com::Thread_Com(bool CreateSuspended,
   int NumPortD, int BaudRateD) : TThread(CreateSuspended)
{
   NumPort = NumPortD;
   BaudRate = BaudRateD;
   Priority = tpHigher;
}
 
//---------------------------------------------------------------------------
void __fastcall Thread_Com::AfterConstruction()
{
   DCB dcb;
   BOOL fSuccess;
   char str[5] = "COM0\x0";
 
   str[3] = NumPort + 0x30;
   hComm = CreateFile(str, GENERIC_READ | GENERIC_WRITE, 0, 0,
                      OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
 
   if (hComm == INVALID_HANDLE_VALUE)
   {
      sLastErr = "Impossible d'ouvrir COM"+AnsiString(NumPort);
   	dwLastErr = CANT_OPEN_COM;
      return;
   }
   fSuccess = GetCommState(hComm, &dcb);
   dcb.BaudRate = BaudRate;
   dcb.ByteSize = 8;
   dcb.Parity = NOPARITY;
   dcb.StopBits = ONESTOPBIT;
   fSuccess |= SetCommState(hComm, &dcb);
 
   if (!fSuccess)
   {
      sLastErr = "Impossible de configurer COM"+AnsiString(NumPort);
   	dwLastErr = CANT_CONFIG_COM;
      CloseHandle(hComm);
      return;
   }
 
   Resume();
}
 
 
//---------------------------------------------------------------------------
void __fastcall Thread_Com::Execute()
{
   LPSTR lpBuf;
   DWORD dwNumByteRead;
   DWORD dwRes;
   BOOL fWaitingOnRead = false;
   OVERLAPPED osReader = {0};
   lpBuf = (char *)malloc(2);
 
// Interdire l'execution si le port serie n'a pu être ouvert
   if (hComm == INVALID_HANDLE_VALUE)return;
 
// Definition d'un évènement
   osReader.hEvent = CreateEvent(NULL, true, false, NULL);
   if (osReader.hEvent == NULL)   // Error creating overlapped event; abort.
   {
      sLastErr = "Erreur lors de la creation d'evènement";
   	dwLastErr = CREATE_EV_ERROR;
   }
 
   while (Terminated == false)
   {
	// Procedure pour lire sur le port hComm
      if (!fWaitingOnRead)
      {
         // Issue the operation
         if (!ReadFile(hComm, lpBuf, 1, &dwNumByteRead, &osReader))
         {
            if (GetLastError() != ERROR_IO_PENDING)   // Read not delayed ?
            {  // Error in communications ; report it
      			sLastErr = "Erreur de lecture sur COM"+AnsiString(NumPort);
			   	dwLastErr = ERR_READ_COM;
            }
            else fWaitingOnRead = true;
         }
         else // read completed immediately
            HandleASuccessfulRead(*lpBuf);
      }
 
      if (fWaitingOnRead)
      {
         dwRes = WaitForSingleObject(osReader.hEvent, READ_TIMEOUT);
         switch(dwRes)
         {
            // Read completed
            case WAIT_OBJECT_0:
               if (!GetOverlappedResult(hComm, &osReader, &dwNumByteRead, FALSE))
               {   // Error in communications ; report it
   	   			sLastErr = "Erreur de fin de lecture sur COM"+AnsiString(NumPort);
				   	dwLastErr = ERR_READOVER_COM;
               }
               else // Read completed successfully.
               {
               	dwLastErr = 0;
                  HandleASuccessfulRead(*lpBuf);
                  // Reset flag so that another operation can be issued
                  fWaitingOnRead = false;
               }
               break;
            case WAIT_TIMEOUT:
               // possible background work
               break;
            default:
               // Error in the WaitforSingleObject; abort.
  	   			sLastErr = "Erreur d'attente de lecture sur COM"+AnsiString(NumPort);
			   	dwLastErr = ERR_READWAIT_COM;
               break;
         }
      }
   }
   free(lpBuf);
   CloseHandle(osReader.hEvent);
   CloseHandle(hComm);
}
//---------------------------------------------------------------------------
BOOL __fastcall Thread_Com::WriteToComPort(AnsiString ASbuf)
{
   OVERLAPPED osWrite = {0};
   DWORD dwToWrite;
   DWORD dwNumByteWritten;
   BOOL fRes;
 
// Si le port serie n'a pu être ouvert, Sortir
   if (hComm == INVALID_HANDLE_VALUE)return false;
 
   dwToWrite = ASbuf.Length();
   char *lpBuf = ASbuf.c_str();
 
	// Create this write operation's OVERLAPPED structure's hEvent.
   osWrite.hEvent = CreateEvent(NULL, true, false, NULL);
   if (osWrite.hEvent == NULL)
      // Error creating overlapped event handle
      return false;
 
   // Issue write.
   if (!WriteFile(hComm, lpBuf, dwToWrite, &dwNumByteWritten, &osWrite))
   {
      if (GetLastError() != ERROR_IO_PENDING)
      {
         // WriteFile failed, but isn't delayed. Report error and abort.
  			sLastErr = "Erreur d'écriture sur COM"+AnsiString(NumPort);
	   	dwLastErr = ERR_WRITE_COM;
         fRes = false;
      }
      else
      {
         // Write is pending.
         if (!GetOverlappedResult(hComm, &osWrite, &dwNumByteWritten, true))
            fRes = false;
         else
         // Write operation completed successfully.
            fRes = true;
      }
   }
   else //WriteFile completed immediately.
   dwLastErr = 0;
   fRes = true;
 
   CloseHandle(osWrite.hEvent);
   return fRes;
}
 
 
//---------------------------------------------------------------------------
extern void ReceiveCallBack(char *c);
 
void __fastcall Thread_Com::HandleASuccessfulRead(char c)
{
	ReceiveCallBack(&c);
}
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.