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

Subversion Repositories miniuart2

[/] [miniuart2/] [trunk/] [sw/] [TestCom/] [Thread.cpp] - Blame information for rev 26

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 philippe
//---------------------------------------------------------------------------
2
#include <vcl.h>
3
#pragma hdrstop
4
 
5
#include <stdlib.h>
6
#include "Thread.h"
7
 
8
#pragma package(smart_init)
9
 
10
//static AnsiString asBuf = "";
11
static char sBuf[205];
12
static stErr stErr1;
13
HANDLE hComm;
14
 
15
//---------------------------------------------------------------------------
16
//   Important: Methods and properties of objects in VCL can only be
17
//   used in a method called using Synchronize, for example:
18
//
19
//      Synchronize(UpdateCaption);
20
//
21
//   where UpdateCaption could look like:
22
//
23
//      void __fastcall Thread_Com::UpdateCaption()
24
//      {
25
//        Form1->Caption = "Updated in a thread";
26
//      }
27
//---------------------------------------------------------------------------
28
__fastcall Thread_Com::Thread_Com(bool CreateSuspended,
29
   int NumPortD, int BaudRateD) : TThread(CreateSuspended)
30
{
31
   NumPort = NumPortD;
32
   BaudRate = BaudRateD;
33
   Priority = tpHigher;
34
}
35
 
36
//---------------------------------------------------------------------------
37
void __fastcall Thread_Com::AfterConstruction()
38
{
39
   DCB dcb;
40
   BOOL fSuccess;
41
   char str[5] = "COM0\x0";
42
 
43
   str[3] = NumPort + 0x30;
44
   hComm = CreateFile(str, GENERIC_READ | GENERIC_WRITE, 0, 0,
45
                      OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
46
 
47
   if (hComm == INVALID_HANDLE_VALUE)
48
   {
49
      sLastErr = "Impossible d'ouvrir COM"+AnsiString(NumPort);
50
        dwLastErr = CANT_OPEN_COM;
51
      return;
52
   }
53
   fSuccess = GetCommState(hComm, &dcb);
54
   dcb.BaudRate = BaudRate;
55
   dcb.ByteSize = 8;
56
   dcb.Parity = NOPARITY;
57
   dcb.StopBits = ONESTOPBIT;
58
   fSuccess |= SetCommState(hComm, &dcb);
59
 
60
   if (!fSuccess)
61
   {
62
      sLastErr = "Impossible de configurer COM"+AnsiString(NumPort);
63
        dwLastErr = CANT_CONFIG_COM;
64
      CloseHandle(hComm);
65
      return;
66
   }
67
 
68
   Resume();
69
}
70
 
71
 
72
//---------------------------------------------------------------------------
73
void __fastcall Thread_Com::Execute()
74
{
75
   LPSTR lpBuf;
76
   DWORD dwNumByteRead;
77
   DWORD dwRes;
78
   BOOL fWaitingOnRead = false;
79
   OVERLAPPED osReader = {0};
80
   lpBuf = (char *)malloc(2);
81
 
82
// Interdire l'execution si le port serie n'a pu être ouvert
83
   if (hComm == INVALID_HANDLE_VALUE)return;
84
 
85
// Definition d'un évènement
86
   osReader.hEvent = CreateEvent(NULL, true, false, NULL);
87
   if (osReader.hEvent == NULL)   // Error creating overlapped event; abort.
88
   {
89
      sLastErr = "Erreur lors de la creation d'evènement";
90
        dwLastErr = CREATE_EV_ERROR;
91
   }
92
 
93
   while (Terminated == false)
94
   {
95
        // Procedure pour lire sur le port hComm
96
      if (!fWaitingOnRead)
97
      {
98
         // Issue the operation
99
         if (!ReadFile(hComm, lpBuf, 1, &dwNumByteRead, &osReader))
100
         {
101
            if (GetLastError() != ERROR_IO_PENDING)   // Read not delayed ?
102
            {  // Error in communications ; report it
103
                        sLastErr = "Erreur de lecture sur COM"+AnsiString(NumPort);
104
                                dwLastErr = ERR_READ_COM;
105
            }
106
            else fWaitingOnRead = true;
107
         }
108
         else // read completed immediately
109
            HandleASuccessfulRead(*lpBuf);
110
      }
111
 
112
      if (fWaitingOnRead)
113
      {
114
         dwRes = WaitForSingleObject(osReader.hEvent, READ_TIMEOUT);
115
         switch(dwRes)
116
         {
117
            // Read completed
118
            case WAIT_OBJECT_0:
119
               if (!GetOverlappedResult(hComm, &osReader, &dwNumByteRead, FALSE))
120
               {   // Error in communications ; report it
121
                                sLastErr = "Erreur de fin de lecture sur COM"+AnsiString(NumPort);
122
                                        dwLastErr = ERR_READOVER_COM;
123
               }
124
               else // Read completed successfully.
125
               {
126
                dwLastErr = 0;
127
                  HandleASuccessfulRead(*lpBuf);
128
                  // Reset flag so that another operation can be issued
129
                  fWaitingOnRead = false;
130
               }
131
               break;
132
            case WAIT_TIMEOUT:
133
               // possible background work
134
               break;
135
            default:
136
               // Error in the WaitforSingleObject; abort.
137
                                sLastErr = "Erreur d'attente de lecture sur COM"+AnsiString(NumPort);
138
                                dwLastErr = ERR_READWAIT_COM;
139
               break;
140
         }
141
      }
142
   }
143
   free(lpBuf);
144
   CloseHandle(osReader.hEvent);
145
   CloseHandle(hComm);
146
}
147
//---------------------------------------------------------------------------
148
BOOL __fastcall Thread_Com::WriteToComPort(AnsiString ASbuf)
149
{
150
   OVERLAPPED osWrite = {0};
151
   DWORD dwToWrite;
152
   DWORD dwNumByteWritten;
153
   BOOL fRes;
154
 
155
// Si le port serie n'a pu être ouvert, Sortir
156
   if (hComm == INVALID_HANDLE_VALUE)return false;
157
 
158
   dwToWrite = ASbuf.Length();
159
   char *lpBuf = ASbuf.c_str();
160
 
161
        // Create this write operation's OVERLAPPED structure's hEvent.
162
   osWrite.hEvent = CreateEvent(NULL, true, false, NULL);
163
   if (osWrite.hEvent == NULL)
164
      // Error creating overlapped event handle
165
      return false;
166
 
167
   // Issue write.
168
   if (!WriteFile(hComm, lpBuf, dwToWrite, &dwNumByteWritten, &osWrite))
169
   {
170
      if (GetLastError() != ERROR_IO_PENDING)
171
      {
172
         // WriteFile failed, but isn't delayed. Report error and abort.
173
                        sLastErr = "Erreur d'écriture sur COM"+AnsiString(NumPort);
174
                dwLastErr = ERR_WRITE_COM;
175
         fRes = false;
176
      }
177
      else
178
      {
179
         // Write is pending.
180
         if (!GetOverlappedResult(hComm, &osWrite, &dwNumByteWritten, true))
181
            fRes = false;
182
         else
183
         // Write operation completed successfully.
184
            fRes = true;
185
      }
186
   }
187
   else //WriteFile completed immediately.
188
   dwLastErr = 0;
189
   fRes = true;
190
 
191
   CloseHandle(osWrite.hEvent);
192
   return fRes;
193
}
194
 
195
 
196
//---------------------------------------------------------------------------
197
extern void ReceiveCallBack(char *c);
198
 
199
void __fastcall Thread_Com::HandleASuccessfulRead(char c)
200
{
201
        ReceiveCallBack(&c);
202
}

powered by: WebSVN 2.1.0

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