⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 thread.cpp

📁 基于XILINX的内嵌POWERPC的处理器的串行通讯的应用源代码.
💻 CPP
字号:
//---------------------------------------------------------------------------#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 阾re ouvert   if (hComm == INVALID_HANDLE_VALUE)return;// Definition d'un 関鑞ement   osReader.hEvent = CreateEvent(NULL, true, false, NULL);   if (osReader.hEvent == NULL)   // Error creating overlapped event; abort.   {      sLastErr = "Erreur lors de la creation d'ev鑞ement";   	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 阾re 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'閏riture 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);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -