purebasic.info

PureBasic forum
Текущее время: Чт июн 04, 2020 5:28 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 385 ]  На страницу Пред.  1 ... 21, 22, 23, 24, 25, 26  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Сб апр 06, 2013 2:47 pm 
Не в сети
студент

Зарегистрирован: Вс мар 10, 2013 8:00 pm
Сообщений: 7
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Добрый день.
Пытаюсь читать код ошибки из приблуды. Вылетает сообщение "126". Такой ошибки нет, что я делаю не так?

Вот процедура:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
 Procedure Get_Status()      ;Чтение инфы из приблуды
     
      NbDataToRead.l = ComInputBufferCount(#COM_Port)            ; Get the number of data waiting in the com buffer
MessageRequester("Nb Data...",Str(NbDataToRead))
   
If NbDataToRead > 0
        MyBuffer2.s = Space(NbDataToRead)             ;Set the buffer size to store the data
        MyBuffer1.s = "0xA1"
 
        If WriteSerialPortString(#COM_Port, Chr(161) )
         
         
         
;         ComWrite(#COM_Port,@MyBuffer1,Len(MyBuffer1))
ComRead(#COM_Port,@MyBuffer2,NbDataToRead)
       
       
        ;       If ComRead(#COM_Port,@MyBuffer2,NbDataToRead)
        MessageRequester("Reading...","Data: " + MyBuffer2)
        z=@MyBuffer2
        EndIf
EndIf
 
    EndProcedure
 



Вот, на всякий выкладываю из sdk:

Get Errors
Compact protocol: 0xA1
Pololu protocol: 0xAA, device number, 0x21
Response: error bits 0-7, error bits 8-15
Use this command to examine the errors that the Maestro has detected. Section 4.b lists the specific errors that can be detected by the Maestro. The error register is sent as a two-byte response immediately after the command is received, then all the error bits are cleared. For most applications using serial control, it is a good idea to check errors continuously and take appropriate action if errors occur.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб апр 06, 2013 3:09 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11650
Благодарил (а): 4 раз.
Поблагодарили: 502 раз.
soloviev.en писал(а):
ComRead(#COM_Port,@MyBuffer2,NbDataToRead)
Это работает? :shock: :shock:
Зачем смешивать две разные библиотеки, да еще с ошибками?
Почему не использовать ReadSerialPortData() для чтения данных из порта?

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб апр 06, 2013 4:27 pm 
Не в сети
студент

Зарегистрирован: Вс мар 10, 2013 8:00 pm
Сообщений: 7
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
soloviev.en писал(а):
ComRead(#COM_Port,@MyBuffer2,NbDataToRead)
Это работает? :shock: :shock:
Зачем смешивать две разные библиотеки, да еще с ошибками?
Почему не использовать ReadSerialPortData() для чтения данных из порта?


Ну а почему нет-то, если MVCOM установлен?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб апр 06, 2013 4:35 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11650
Благодарил (а): 4 раз.
Поблагодарили: 502 раз.
Тогда нужно использовать или одну или другую библиотеку.
В данном случае, ComRead() передается ИД порта, а не его хендл. Поэтому работать не будет.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб апр 06, 2013 4:47 pm 
Не в сети
студент

Зарегистрирован: Вс мар 10, 2013 8:00 pm
Сообщений: 7
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
Тогда нужно использовать или одну или другую библиотеку.
В данном случае, ComRead() передается ИД порта, а не его хендл. Поэтому работать не будет.


Код:
1
2
3
 
ReadSerialPortData(#COM_Port, @MyBuffer2, NbDataToRead)
 



Всё равно не работает.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб апр 06, 2013 4:58 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11650
Благодарил (а): 4 раз.
Поблагодарили: 502 раз.
soloviev.en писал(а):
Всё равно не работает.
Очень информативно!

Это так задумано, ждать пока будет получен хоть один байт, отправлять данные и принимать те, что были ранее получены (до отправки)?

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб апр 06, 2013 5:26 pm 
Не в сети
студент

Зарегистрирован: Вс мар 10, 2013 8:00 pm
Сообщений: 7
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
soloviev.en писал(а):
Всё равно не работает.
Очень информативно!

Это так задумано, ждать пока будет получен хоть один байт, отправлять данные и принимать те, что были ранее получены (до отправки)?


Нет, Пётр, задумывалось так:
1. Отправляются данные
2. Принимается ответ

Пока не могу сообразить как это сделать. Результат- во вложении.


Вложения:
10.JPG [35.09 KiB]
Скачиваний: 20
Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб апр 06, 2013 5:37 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11650
Благодарил (а): 4 раз.
Поблагодарили: 502 раз.
soloviev.en писал(а):
как это сделать
Как-то так.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
NbDataToRead = AvailableSerialPortInput(#COM_Port)
If NbDataToRead>0 ; Какие-то "левые" данные.
  For i=1 To NbDataToRead
    ReadSerialPortData(#COM_Port, @x, 1) ; Чистим буфер приема.
  EndIf
EndIf
 
 
 
 
MyBuffer1.s = "0xA1"
 
WriteSerialPortString(#COM_Port, Chr(161))
Delay(800)
NbDataToRead.l = AvailableSerialPortInput(#COM_Port)
If NbDataToRead>0 ; Требуемые данные получены.
  MyBuffer2.s = Space(NbDataToRead)             ;Set the buffer size to store the data
  ReadSerialPortData(#COM_Port, @MyBuffer2, NbDataToRead)
EndIf


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн дек 16, 2013 4:23 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11650
Благодарил (а): 4 раз.
Поблагодарили: 502 раз.
kvitaliy писал(а):
Наверное тема давно не актуальна, но вот посмотрите.
Прога будет работать и со схемой из вашего сообщения, но она грузит порт (нет ограничивающего резистора перед стабилитроном и нет защиты от отрицательного напряжения, точнее ее выполняет стабилитрон еще сильнее нагружая порт).

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: COM порт
СообщениеДобавлено: Пн дек 16, 2013 5:02 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6609
Благодарил (а): 34 раз.
Поблагодарили: 230 раз.
Пункты репутации: 61
Петя, ты гонишь, меня в этой теме вообще нет!

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: COM порт
СообщениеДобавлено: Пн дек 16, 2013 5:05 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11650
Благодарил (а): 4 раз.
Поблагодарили: 502 раз.
kvitaliy писал(а):
меня в этой теме вообще нет!
Это кто написал? viewtopic.php?p=4223#p4223

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: COM порт
СообщениеДобавлено: Пн фев 17, 2014 1:19 pm 
Не в сети
ассистент

Зарегистрирован: Пн фев 17, 2014 1:06 pm
Сообщений: 18
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Решил помучать сабж. Правда виртуальный (USB-COM). Думал что открыл да работай, ага... Щаз...
При попытке создать непрерывный поток (115200) окно виснет на период передачи WriteSerialPortData(#SerialPort, *Buffer, Length) - вешает окно пока не передаст, даже если ему отдельный поток выделить. Соответственно если у меня поток, то окно висит непрерывно (кнопочки не отжимаются).
Ну ладно, написал асинхронную работу через WinApi, заделал динамический FIFO буфер, думал, вот оно.ага... Щаз...
Вообще оно все работает, и окно не виснет вот тока без отладчика... Если запустиь с отладчиком - вылеты в разных непредсказуемых местах. Мутексы не помогли... Вот вобщем:
testcom2.pb
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
 
XIncludeFile "Fifo.pbi"
 
#BUFSIZE = 512
#COM_Port = 2
 
;Structure COMport_s
Global wrflag.l
Global Dim bufrd.c(#BUFSIZE)
Global Dim bufwr.c(#BUFSIZE)
Global CurCurSerialPortID.l
Global overlapped.OVERLAPPED
Global overlappedwr.OVERLAPPED
Global ThreadWR.l
Global ThreadRD.l
 
;Define.OVERLAPPED overlapped, overlappedwr
 
Procedure.s GetLastError(lpErr.l)
Define.l lpMsgBuffer, CharsInBuffer
lpMsgBuffer=0
CharsInBuffer=FormatMessage_(#FORMAT_MESSAGE_ALLOCATE_BUFFER|#FORMAT_MESSAGE_FROM_SYSTEM,0,lpErr,GetUserDefaultLangID_(),@lpMsgBuffer,0,0)
If msgBuffer<>0
  errMsg$=PeekS(lpMsgBuffer)
  LocalFree_(lpMsgBuffer)
  ProcedureReturn RemoveString(errMsg$,Chr(13)+Chr(10))
EndIf
EndProcedure
 
 
 
;главная функция потока, реализует приём байтов из COM-порта
Procedure ReadThread(*Value)
  ;структура текущего состояния порта, в данной программе
  ;используется для определения количества принятых в порт байтов
  Protected comstat.COMSTAT
 
  Protected.l btr, temp, mask, signal,btrr
 
 
 
 
  ;создать сигнальный объект-событие
  ;для асинхронных операций
  overlapped\hEvent = CreateEvent_(0,#True,#False,0)
 
 
  ;установить маску на срабатывание по событию приёма байта в порт
  ;пока поток не будет прерван, выполняем цикл
  SetCommMask_(CurCurSerialPortID,#EV_RXCHAR)
  Repeat
    ;ожидать события приёма байта
    ;(это и есть перекрываемая операция)
    WaitCommEvent_(CurCurSerialPortID,@mask,@overlapped)
    ;приостановить поток до прихода байта
   
    signal = WaitForSingleObject_(overlapped\hEvent, #INFINITE);
    ;если событие прихода байта произошло
    If signal = #WAIT_OBJECT_0
      ;проверяем, успешно ли завершилась перекрываемая операция WaitCommEvent
      x=GetOverlappedResult_(CurCurSerialPortID,@overlapped,@temp,#True)
      If x
        ;если произошло именно событие прихода байта
        ; Debug mask
        If mask & #EV_RXCHAR = 1
          ;нужно заполнить структуру COMSTAT
          ClearCommError_(CurCurSerialPortID,@temp,@comstat)
          ;и получить из неё количество принятых байтов
          btr = comstat\cbInQue
          ;если действительно есть байты для чтения
          If btr
            ;прочитать байты из порта в буфер программы
            ;Debug "Read"
            Repeat
              btrr=btr
              Repeat            
                If btrr>#BUFSIZE
                  btr=#BUFSIZE
                  btrr-#BUFSIZE
                  ;Debug "Read"
                Else
                  btrr=0
                EndIf
               
                ReadFile_(CurCurSerialPortID, @bufrd(), btr, @temp, @overlapped)
                ;Сделать обработку буфера
                ;Debug "Read"
                For n=0 To btr-1              
                  DFifoR(#CM_Dfifo_PushByte,bufrd(n))
                Next                
              Until btrr=0
              ClearCommError_(CurCurSerialPortID,@temp,@comstat)
              ;и получить из неё количество принятых байтов
              btr = comstat\cbInQue  
              ;Debug "Read : "+Str(btr)
            Until btr=0
            ;Debug "Read done"
           
          EndIf          
        EndIf        
      EndIf      
    EndIf    
  Until 0
  ;CloseHandle_(overlapped\hEvent);
 
EndProcedure
 
 
Procedure WriteThread(*Value)
  Protected.l temp, signal,sendb
  ;Define.OVERLAPPED overlappedwr
 
  ;создать сигнальный объект-событие
  ;для асинхронных операций
  PauseThread(ThreadWR)
  overlappedwr\hEvent=CreateEvent_(0,#True,#False,0)
  Repeat
    ;проверяем буфер на передачу
    trbyte.l=DFifoW(#CM_Dfifo_GetLenBuf,0)
    If trbyte
      Repeat
        If trbyte>#BUFSIZE
          For n=0 To #BUFSIZE-1
            bufwr(n)=DFifoW(#CM_Dfifo_PopByte,0)
            ;Debug bufwr(n)
          Next
          sendb=#BUFSIZE
          trbyte-#BUFSIZE
        Else
          For n=0 To trbyte-1
            bufwr(n)=DFifoW(#CM_Dfifo_PopByte,0)
            ;Debug bufwr(n)
          Next
          sendb=trbyte
          trbyte=0
        EndIf        
        ;записать байты в порт (перекрываемая операция!)
        WriteFile_(CurCurSerialPortID, @bufwr(), sendb, @temp, @overlappedwr)
        ;Debug "Write"
        ;приостановить поток, пока не завершится перекрываемая операция WriteFile
        signal = WaitForSingleObject_(overlappedwr\hEvent, #INFINITE)
        ;Debug "Signal"
        If (signal = #WAIT_OBJECT_0) And (GetOverlappedResult_(CurCurSerialPortID,@overlappedwr,@temp,#True))
          ; Передача прошла успешно
          ;Debug "OK"
        Else
          ; Ошибка передачи
          ;Debug "Ошибка передачи"
        EndIf
      Until trbyte=0
      ;Debug "S1"
    Else
      wrflag=0
      ;ResumeThread(ThreadRD)
      ;Debug "Stop"
      PauseThread(ThreadWR)
      ;Debug "Start"
      ;PauseThread(ThreadRD)
      wrflag=1
    EndIf  
  Until 0
EndProcedure
 
Procedure initCom()
;CreateThread(
CurCurSerialPortID.l = CreateFile_("COM8",#GENERIC_READ|#GENERIC_WRITE,0,#Null,#OPEN_EXISTING,#FILE_FLAG_OVERLAPPED,#Null)
If CurCurSerialPortID = #INVALID_HANDLE_VALUE
  LastErr = GetLastError_()
  MessageRequester("Error Opening Communication Port",GetLastError(LastErr))
  End
EndIf
 
myDCB.DCB
GetCommState_(CurCurSerialPortID, myDCB)
myDCB\DCBlength   = SizeOf(DCB)
myDCB\BaudRate    = 115200
;myDCB\BaudRate    = 300
;myDCB\fbits       = 129
;myDCB\wReserved          = 0
;myDCB\XonLim      = 0
;myDCB\XoffLim     = 0
;myDCB\ByteSize   = 8
;myDCB\Parity             = 0
;myDCB\StopBits   = 0
;myDCB\XonChar            = 0
;myDCB\XoffChar   = 0
;myDCB\ErrorChar          = 0
;myDCB\EofChar            = 0
;myDCB\EvtChar            = 0
;myDCB\wReserved1  = 0
 
;Save and use the DCB settings.
SetCommState_(CurCurSerialPortID, myDCB)
 
 myCTO.COMMTIMEOUTS
;
 GetCommTimeouts_(CurCurSerialPortID,myCTO)
;
 myCTO\ReadIntervalTimeout           = 0
 myCTO\ReadTotalTimeoutMultiplier    = 0
 myCTO\ReadTotalTimeoutConstant      = 0
 myCTO\WriteTotalTimeoutMultiplier   = 0
 myCTO\WriteTotalTimeoutConstant     = 0
 
SetCommTimeouts_(CurCurSerialPortID,myCTO)
 
 
 
ThreadWR=CreateThread(@WriteThread(),0)
ThreadRD=CreateThread(@ReadThread(),0)
 
EndProcedure
 
Procedure initCom2()
; ;CreateThread(
; CurCurSerialPortID.l = CreateFile_("COM8",#GENERIC_READ|#GENERIC_WRITE,0,#Null,#OPEN_EXISTING,#FILE_FLAG_OVERLAPPED,#Null)
; If CurCurSerialPortID = #INVALID_HANDLE_VALUE
;   LastErr = GetLastError_()
;   MessageRequester("Error Opening Communication Port",GetLastError(LastErr))
;   End
; EndIf
;
; myDCB.DCB
; GetCommState_(CurCurSerialPortID, myDCB)
; myDCB\DCBlength   = SizeOf(DCB)
; myDCB\BaudRate    = 115200
; ;myDCB\fbits       = 129
; ;myDCB\wReserved        = 0
; ;myDCB\XonLim      = 0
; ;myDCB\XoffLim     = 0
; ;myDCB\ByteSize         = 8
; ;myDCB\Parity           = 0
; ;myDCB\StopBits         = 0
; ;myDCB\XonChar                  = 0
; ;myDCB\XoffChar         = 0
; ;myDCB\ErrorChar        = 0
; ;myDCB\EofChar                  = 0
; ;myDCB\EvtChar                  = 0
; ;myDCB\wReserved1  = 0
;
; ;Save and use the DCB settings.
; Debug SetCommState_(CurCurSerialPortID, myDCB)
;
; ; myCTO.COMMTIMEOUTS
; ;
; ; GetCommTimeouts_(CurCurSerialPortID,myCTO)
; ;
; ; myCTO\ReadIntervalTimeout           = 50
; ; myCTO\ReadTotalTimeoutMultiplier    = 50
; ; myCTO\ReadTotalTimeoutConstant      = 50
; ; myCTO\WriteTotalTimeoutMultiplier   = 50
; ; myCTO\WriteTotalTimeoutConstant     = 50
; ;
; ; Debug SetCommTimeouts_(CurCurSerialPortID,myCTO)
 
 
OpenSerialPort(2, "COM8", 115200, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 255, 255)
CurCurSerialPortID=SerialPortID(2)
 
ThreadWR=CreateThread(@WriteThread(),0)
ThreadRD=CreateThread(@ReadThread(),0)
 
EndProcedure
 
 
Procedure stopCom()
  If ThreadWR
    KillThread(ThreadWR)
  EndIf
  If ThreadRD  
    KillThread(ThreadRD)
  EndIf
 
  ;CloseSerialPort(2)
  CloseHandle_(overlapped\hEvent);
  CloseHandle_(overlappedwr\hEvent);
  CloseHandle_(CurSerialPortID)
EndProcedure
 
 
Procedure InData() ; Прием данных.    
  Protected InBytes      
  Static sss  
  InBytes = DFifoR(#CM_Dfifo_GetLenBuf,0)
  sss+InBytes
  SetGadgetText(2,Str(sss))
 
  If InBytes>0 ; Получены данные.      
    Protected Dim InBuffer.a(InBytes), RealInBytes  
    a.s=""
    For n=1 To InBytes
      InBuffer(n-1)=DFifoR(#CM_Dfifo_PopByte,0)
      a=a+Chr(InBuffer(n-1))
    Next
    ;Debug a
    ;RealInBytes = ReadSerialPortData(#COM_Port, @InBuffer(), InBytes)      
    If InBytes>0      
      AddGadgetItem(4, -1, PeekS(@InBuffer(), InBytes, #PB_Ascii))      
    EndIf      
   
  EndIf          
EndProcedure    
 
Procedure Select_ComPort()      
     Protected Port.s, Text.s, Color      
       
     If IsSerialPort(#COM_Port)   ; С таким ИД уже открыт порт.      
       CloseSerialPort(#COM_Port) ; Закрываем его.      
     EndIf  
     
     stopCom()
     
     Port = GetGadgetText(3)      
     If OpenSerialPort(#COM_Port, Port, 115200, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 255, 255)      
       Text="Порт "+Port+" открыт" : Color=RGB(46, 137, 36)
       CloseSerialPort(#COM_Port) ; Закрываем его.  
       initCom()
     Else      
       Text="Не удалось открыть порт "+Port : Color=RGB(255,0,0)      
     EndIf      
       
     SetGadgetText(5, Text)        
     SetGadgetColor(5, #PB_Gadget_FrontColor, Color)      
       
   EndProcedure      
   
Mutex = CreateMutex()
 
;initCom()
 
If OpenWindow(0, 300, 100, 650, 415, "Тестовая программа")        
     ButtonGadget(1, 90, 360, 100, 35, "Принять данные", #PB_Button_Default)          
     TextGadget(2,10,360,125,15,"Порт") ; Выводим в окно надпись "Порт".        
     ComboBoxGadget(3, 10, 375, 70, 21, #PB_ComboBox_Editable)
     
     For i=1 To 99
       If OpenSerialPort(2, "COM"+Str(i), 115200, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 255, 255)
         AddGadgetItem(3,-1,"COM"+Str(i))
         CloseSerialPort(2)
       EndIf      
     Next i      
       
     SetGadgetState(3,0); Делаем активным нулевой пункт выпадающего списка.        
       
     ;StringGadget(4, 8,  10, 630, 300, "", #PB_String_ReadOnly) ;строковый гаджет, сюда пишем принятые данные        
     EditorGadget(4, 8,  10, 630, 300,#PB_String_ReadOnly)      
     TextGadget(5,10,400,200,15,"")                             ;Здесь будет отображаться результат открытия порта.        
     ButtonGadget(6, 200, 360, 100, 35, "Очистить окно", #PB_Button_Default)      
       
     ;Select_ComPort()      
       
     Repeat        
         
       Event = WaitWindowEvent()        
         
       InData()                       ;принимаем данные из UART      
         
       If Event=#PB_Event_Gadget        
         Gadget = EventGadget ( )                    ;узнаем какой гаджет был активирован        
         If Gadget=1                    ;если нажата кнопка          
           ;MessageRequester("Сообщение", "Нажата кнопка", 0) ;выполняемая функция по нажатию кнопки        
            ;ComTestOut()  
            ;ComOut("BlaBLalaaaa")                    ;Переходим на процедуру передачи байта.    
            For n=1 To 20000
             DFifoW(#CM_Dfifo_PushByte,n)
           Next
           ResumeThread(ThreadWR)
           ;Delay(1000)
 
           ;InData()      
         ElseIf Gadget=3                    ;если был активирован выпадающий список          
           ComboBox.s=GetGadgetText(3) ; Считываем текст из текущего пункта выпадающего списка.        
           If EventType() = #PB_EventType_Change      
           ; Переходим на процедуру, закрывающую текущий порт и открывающую выбранный.          
           Select_ComPort()      
             
           EndIf        
             
         ElseIf Gadget=6        ;нажата кнопка очистки      
           ClearGadgetItems(4) ;удаляем содержимое окна с данными    
         EndIf        
       EndIf        
         
     Until Event=#PB_Event_CloseWindow          
       
   EndIf          
   stopCom()
End  
 





Fifo.pbi


Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
 
#CM_Dfifo_LenMas = 65000 ; Длинна единицы буфера
 
Structure byte32
  StructureUnion
    a.l
    b.c[4]
  EndStructureUnion
EndStructure
 
Structure DFifo_s
  b.c[#CM_Dfifo_LenMas]
  ;Pend.l ; Точка конца буфера
  ;Pstart.l ; Точка начала буфера
EndStructure
 
 
 
Enumeration ;DFifo_en
  #CM_Dfifo_PushByte
  #CM_Dfifo_Push16b
  #CM_Dfifo_Push32b
  #CM_Dfifo_PopByte
  #CM_Dfifo_GetLenBuf
  #CM_Dfifo_Clear
EndEnumeration
 
;Global NewList DFifob.DFifo_s()
Procedure.l DFifoR(mode.l,in.l)
  Static Pstart.l,Pend.l,Plen.l,InitFalg.l=0
  Static NewList DFifob.DFifo_s()
  Static *startel,*endel
  Shared Mutex
 
  LockMutex(Mutex)    ; uncomment this to see the difference
 
  If Not InitFalg
    ClearList(DFifob())
    AddElement(DFifob())
    *startel=@DFifob()
    *endel=@DFifob()
    Pstart=0
    Pend=0
    Plen=0
    InitFalg=1
  EndIf
  Select mode
    Case #CM_Dfifo_Clear
      InitFalg=0
      ret.l=DFifoR(#CM_Dfifo_GetLenBuf,0)
      UnlockMutex(Mutex) ; uncomment this to see the difference
      ProcedureReturn ret
    Case #CM_Dfifo_GetLenBuf
      UnlockMutex(Mutex) ; uncomment this to see the difference
      ProcedureReturn Plen      
    Case #CM_Dfifo_PushByte
      If Not *endel=@DFifob()
        ChangeCurrentElement(DFifob(),*endel)
      EndIf
      If Pend=>#CM_Dfifo_LenMas
        If Not AddElement(DFifob())
          InitFalg=0
          UnlockMutex(Mutex) ; uncomment this to see the difference
          ProcedureReturn 0
        EndIf
        *endel=@DFifob()
        Pend=0        
      EndIf
      DFifob()\b[Pend]=in      
      Plen+1
      Pend+1
    Case #CM_Dfifo_Push16b
      z.byte32\a=in
      DFifoR(#CM_Dfifo_PushByte,z\b[0])
      DFifoR(#CM_Dfifo_PushByte,z\b[1])
    Case #CM_Dfifo_Push32b
      z.byte32\a=in
      DFifoR(#CM_Dfifo_PushByte,z\b[0])
      DFifoR(#CM_Dfifo_PushByte,z\b[1])
      DFifoR(#CM_Dfifo_PushByte,z\b[2])
      DFifoR(#CM_Dfifo_PushByte,z\b[3])
    Case #CM_Dfifo_PopByte      
      If Plen
        If Not *startel=@DFifob()
          ChangeCurrentElement(DFifob(),*startel)
        EndIf
        If Pstart=>#CM_Dfifo_LenMas
          If Not NextElement(DFifob())
            InitFalg=0
            UnlockMutex(Mutex) ; uncomment this to see the difference
            ProcedureReturn 0
          EndIf
          *startel=@DFifob()
          Pstart=0
          PreviousElement(DFifob())
          DeleteElement(DFifob())
          ChangeCurrentElement(DFifob(),*startel)
        EndIf
        ret.l=DFifob()\b[Pstart]
        Pstart+1
        Plen-1
        UnlockMutex(Mutex) ; uncomment this to see the difference
        ProcedureReturn ret
      EndIf    
  EndSelect
 
  UnlockMutex(Mutex) ; uncomment this to see the difference
  ;*in\l
EndProcedure
 
Procedure.l DFifoW(mode.l,in.l)
  Static Pstart.l,Pend.l,Plen.l,InitFalg.l=0
  Static NewList DFifob.DFifo_s()
  Static *startel,*endel
  Shared Mutex
 
  LockMutex(Mutex)    ; uncomment this to see the difference
 
  If Not InitFalg
    ClearList(DFifob())
    AddElement(DFifob())
    *startel=@DFifob()
    *endel=@DFifob()
    Pstart=0
    Pend=0
    Plen=0
    InitFalg=1
  EndIf
  Select mode
    Case #CM_Dfifo_Clear
      InitFalg=0
      ret.l=DFifoW(#CM_Dfifo_GetLenBuf,0)
      UnlockMutex(Mutex) ; uncomment this to see the difference
      ProcedureReturn ret
    Case #CM_Dfifo_GetLenBuf
      UnlockMutex(Mutex) ; uncomment this to see the difference
      ProcedureReturn Plen      
    Case #CM_Dfifo_PushByte
      If Not *endel=@DFifob()
        ChangeCurrentElement(DFifob(),*endel)
      EndIf
      If Pend=>#CM_Dfifo_LenMas
        If Not AddElement(DFifob())
          InitFalg=0
          UnlockMutex(Mutex) ; uncomment this to see the difference
          ProcedureReturn 0
        EndIf
        *endel=@DFifob()
        Pend=0        
      EndIf
      DFifob()\b[Pend]=in      
      Plen+1
      Pend+1
    Case #CM_Dfifo_Push16b
      z.byte32\a=in
      DFifoW(#CM_Dfifo_PushByte,z\b[0])
      DFifoW(#CM_Dfifo_PushByte,z\b[1])
    Case #CM_Dfifo_Push32b
      z.byte32\a=in
      DFifoW(#CM_Dfifo_PushByte,z\b[0])
      DFifoW(#CM_Dfifo_PushByte,z\b[1])
      DFifoW(#CM_Dfifo_PushByte,z\b[2])
      DFifoW(#CM_Dfifo_PushByte,z\b[3])
    Case #CM_Dfifo_PopByte      
      If Plen
        If Not *startel=@DFifob()
          ChangeCurrentElement(DFifob(),*startel)
        EndIf
        If Pstart=>#CM_Dfifo_LenMas
          If Not NextElement(DFifob())
            InitFalg=0
            UnlockMutex(Mutex) ; uncomment this to see the difference
            ProcedureReturn 0
          EndIf
          *startel=@DFifob()
          Pstart=0
          PreviousElement(DFifob())
          DeleteElement(DFifob())
          ChangeCurrentElement(DFifob(),*startel)
        EndIf
        ret.l=DFifob()\b[Pstart]
        Pstart+1
        Plen-1
        UnlockMutex(Mutex) ; uncomment this to see the difference
        ProcedureReturn ret
      EndIf    
  EndSelect
 
  UnlockMutex(Mutex) ; uncomment this to see the difference
 
  ;*in\l
EndProcedure
 
Procedure.l DFifo(mode.l,in.l)
  Static Pstart.l,Pend.l,Plen.l,InitFalg.l=0
  Static NewList DFifob.DFifo_s()
  Static *startel,*endel
 
  If Not InitFalg
    ClearList(DFifob())
    AddElement(DFifob())
    *startel=@DFifob()
    *endel=@DFifob()
    Pstart=0
    Pend=0
    Plen=0
    InitFalg=1
  EndIf
  Select mode
    Case #CM_Dfifo_Clear
      InitFalg=0
      ProcedureReturn DFifo(#CM_Dfifo_GetLenBuf,0)
    Case #CM_Dfifo_GetLenBuf
      ProcedureReturn Plen      
    Case #CM_Dfifo_PushByte
      If Not *endel=@DFifob()
        ChangeCurrentElement(DFifob(),*endel)
      EndIf
      If Pend=>#CM_Dfifo_LenMas
        If Not AddElement(DFifob())
          InitFalg=0
          ProcedureReturn 0
        EndIf
        *endel=@DFifob()
        Pend=0        
      EndIf
      DFifob()\b[Pend]=in      
      Plen+1
      Pend+1
    Case #CM_Dfifo_Push16b
      z.byte32\a=in
      DFifo(#CM_Dfifo_PushByte,z\b[0])
      DFifo(#CM_Dfifo_PushByte,z\b[1])
    Case #CM_Dfifo_Push32b
      z.byte32\a=in
      DFifo(#CM_Dfifo_PushByte,z\b[0])
      DFifo(#CM_Dfifo_PushByte,z\b[1])
      DFifo(#CM_Dfifo_PushByte,z\b[2])
      DFifo(#CM_Dfifo_PushByte,z\b[3])
    Case #CM_Dfifo_PopByte      
      If Plen
        If Not *startel=@DFifob()
          ChangeCurrentElement(DFifob(),*startel)
        EndIf
        If Pstart=>#CM_Dfifo_LenMas
          If Not NextElement(DFifob())
            InitFalg=0
            ProcedureReturn 0
          EndIf
          *startel=@DFifob()
          Pstart=0
          PreviousElement(DFifob())
          DeleteElement(DFifob())
          ChangeCurrentElement(DFifob(),*startel)
        EndIf
        ret.l=DFifob()\b[Pstart]
        Pstart+1
        Plen-1
        ProcedureReturn ret
      EndIf    
  EndSelect
  ;*in\l
EndProcedure
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: COM порт
СообщениеДобавлено: Пн фев 17, 2014 2:00 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11650
Благодарил (а): 4 раз.
Поблагодарили: 502 раз.
AlexSVC писал(а):
вешает окно пока не передаст, даже если ему отдельный поток выделить.
Окно не виснет, если отправлять в отдельном потоке.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
CompilerIf #PB_Compiler_Thread=0
  CompilerError "Включите поддержку многопоточности"
CompilerEndIf
 
Procedure Thread(x)
 
  SetGadgetState(1, 0)
 
  If OpenSerialPort(0, "COM1", 11520, #PB_SerialPort_NoParity,
                    8, 1, #PB_SerialPort_NoHandshake, 256, 256)
   
    Dim x.a(250)
    For i=1 To 20
      WriteSerialPortData(0, @x(), 250)
      SetGadgetState(1, i)
    Next
   
    CloseSerialPort(0)
    MessageRequester("", "Данные были отправлены")
  Else
    MessageRequester("", "Не удалось открыть порт")
  EndIf
EndProcedure
 
OpenWindow(0, 0, 0, 150, 80, "", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
ButtonGadget(0, 40, 20, 80, 24, "Старт")
ProgressBarGadget(1, 4, 50, 142, 16, 0, 20)
 
Repeat
  Event = WaitWindowEvent()
  If Event = #PB_Event_Gadget And EventGadget()=0
    If IsThread(x)=0
      x=CreateThread(@Thread(), 0)
    Else
      MessageRequester("", "Данные еще не отправлены. Ждите.")
    EndIf
  EndIf
Until Event = #PB_Event_CloseWindow


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: COM порт
СообщениеДобавлено: Пн фев 17, 2014 2:13 pm 
Не в сети
ассистент

Зарегистрирован: Пн фев 17, 2014 1:06 pm
Сообщений: 18
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Спасибо, действительно работает.
"Включите поддержку многопоточности"
Это опция "Создать приложение с безопасным потоком ?"


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: COM порт
СообщениеДобавлено: Пн фев 17, 2014 2:19 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11650
Благодарил (а): 4 раз.
Поблагодарили: 502 раз.
AlexSVC писал(а):
Это опция "Создать приложение с безопасным потоком ?"
Да. В русификаторе начиная с PB 5.20, переведено как "Поддержка многопоточности".

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 385 ]  На страницу Пред.  1 ... 21, 22, 23, 24, 25, 26  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB