Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/22: Рейтинг темы: голосов - 22, средняя оценка - 4.73
1 / 1 / 1
Регистрация: 28.03.2008
Сообщений: 40

Где можно найти информацию про чтение из com-порта?

24.03.2008, 11:59. Показов 4595. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите пожалуйста найти информацию про com-порт, как ведется чтение из него???
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.03.2008, 11:59
Ответы с готовыми решениями:

Где можно найти и прочитать всю до мелочей информацию про прокси?
Расскажыте или подскажыте мне пожалуста где можна найти и прочитать всю до мелочей информацыю про ПРОКСИ ! Спасибо !

Подскажите, где можно найти информацию про ввод-вывод функций низкого уровня из библиотеки <io.h>?
Подскажите где можно найти информацию про Ввод-вывод функций низкого уровня из библиотеки &lt;io.h&gt;? ( На Русском или Англ )

Где можно найти информацию и различные примеры про то, как устроены вложенные циклы (for/repeat...untile/while)?
Доброго времени суток.Не можете подсказать,где можно найти информацию и различные примеры про то,как устроены вложенные...

21
Почетный модератор
 Аватар для Lord_Voodoo
8784 / 2537 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
24.03.2008, 12:04
Code Скопировано
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
bool __fastcall OpenPort()
{
   DCB ComDcb;
   COMMTIMEOUTS TimeOuts;
   int ok;
   // открытие СОМ- порта
   hCOM_Scaner = INVALID_HANDLE_VALUE;
   memset(&ComDcb, '\0', sizeof(DCB));
   String ComPort = "COM" + IntToStr(ScanerCom);
   String Speed= IntToStr(ScanerBound);
   hCOM_Scaner = CreateFile(ComPort.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
   ok = hCOM_Scaner != INVALID_HANDLE_VALUE;
   String tmp = "baud=" + Speed + " parity=N data=8 stop=1";
   ok = ok && BuildCommDCB(tmp.c_str(), &ComDcb);
   ComDcb.fDtrControl = DTR_CONTROL_ENABLE;
   ComDcb.fBinary = TRUE;
   ok = ok && SetCommState(hCOM_Scaner, &ComDcb);
   ok = ok && GetCommTimeouts(hCOM_Scaner, &TimeOuts);
   TimeOuts.ReadTotalTimeoutMultiplier = 50;
   ok = ok && SetCommTimeouts(hCOM_Scaner, &TimeOuts);
   if ((!ok) && (hCOM_Scaner != INVALID_HANDLE_VALUE)){
      showError("Неможливо установити параметри СОМ-порту сканера.");
      WriteLog("Неможливо установити параметри СОМ-порту сканера.", MainForm->isLog);
      CloseHandle(hCOM_Scaner);
      hCOM_Scaner = INVALID_HANDLE_VALUE;
      return false;
   }// if
   if (hCOM_Scaner == INVALID_HANDLE_VALUE){
      showError("COM-порт сканера не відкривається.");
      WriteLog("COM-порт сканера не відкривається.", MainForm->isLog);
      return false;
   }// if
   Stop = true;
   //Создаем нить для сканера
   TheScaner = new TTheScaner();
   return true;
}
//---------------------------------------------------------------------------
bool __fastcall ClosePort()
{
  // Закрываем COM порт
  Stop = false;
  TheScaner->Free();
  CloseHandle(hCOM_Scaner);
  return true;
}
 
int __fastcall ReadPort( unsigned char *buf, int len)
{
   DWORD rTmp;
   if(ReadFile(hCOM_Scaner, buf, len, &rTmp, NULL)){
      return rTmp;
   }
   return 0;
}
0
1 / 1 / 1
Регистрация: 28.03.2008
Сообщений: 40
27.03.2008, 18:02  [ТС]
у меня проблема разделения приходящей информации из ком порта, т.е. у меня когда работает один сканер то все читается на ура, а вот когда начинаещи считывать информацию двумя сканерами одновременно, то тогда получается ерунда. У меня получается надо сканером считывать два штрих-кода, так вот когда одним сканером считываешь то тогда все идет как надо, а вот когда двумя то получается что например считываем первым сканером 1-й штрих-код, а вторым 2-й штрих код, тогда формируется запись, а мне надо чтобы чтобы первый по отдельности считывал 1-й и 2-й штрих-коды, и второй считывал параллельно 1-й и 2-й штрихкод. Я так понимаю надо чтобы различались пакеть от разных сканеров...
0
Почетный модератор
 Аватар для Lord_Voodoo
8784 / 2537 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
28.03.2008, 11:46
а разве на последовательном порту такое возможно вообще...
0
1 / 1 / 1
Регистрация: 28.03.2008
Сообщений: 40
28.03.2008, 17:33  [ТС]
У мненя есть быза она присоединяется через КОМ порт к компу, а к самой базе по RS232 интерфейсу. Я предпологаю что надо как-то реализовать в программе то, что все приходящие пакеты программа различала. сканера запрограмированы под номерами 000, 001, 002, 003.
0
Почетный модератор
 Аватар для Lord_Voodoo
8784 / 2537 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
28.03.2008, 17:36
ну так все равно данные приходят последовательно, тут либо на несколько комов надо все это вешать... но на одном в данный момент времени можно только один штрих-код прочитать... мне так кажется... по крайней мере я не помню, чтобы по кому можно было параллельную обработку сделать...
0
1 / 1 / 1
Регистрация: 28.03.2008
Сообщений: 40
28.03.2008, 17:59  [ТС]
а проверку пакета от какого сканера пришла инфа можно сделать???
0
1 / 1 / 1
Регистрация: 28.03.2008
Сообщений: 40
28.03.2008, 21:12  [ТС]
и еще может знаешь Семафоры это что?? я так понемаю что это класс который разделяет потоки или что-то вроде этого...
0
1 / 1 / 1
Регистрация: 28.03.2008
Сообщений: 40
31.03.2008, 11:42  [ТС]
и ещё можно ли сделать параллельно, чтобы шли потоки???
0
Почетный модератор
 Аватар для Lord_Voodoo
8784 / 2537 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
31.03.2008, 11:47
семафоры используются для работы одного потока, т.е. у кого семафор включен - тот и работает, остальные в состоянии простоя
0
1 / 1 / 1
Регистрация: 28.03.2008
Сообщений: 40
31.03.2008, 12:31  [ТС]
так может создать семафоры для каждого сканера отдельно, потомучто сканером считывают два штрих-кода подряд...???
0
Почетный модератор
 Аватар для Lord_Voodoo
8784 / 2537 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
31.03.2008, 12:36
в смысле два штрих-кода подряд?
0
Администратор
 Аватар для mik-a-el
87300 / 52877 / 246
Регистрация: 10.04.2006
Сообщений: 13,649
31.03.2008, 12:38
Цитата Сообщение от WooDooMan666
семафоры используются для работы одного потока, т.е. у кого семафор включен - тот и работает, остальные в состоянии простоя
Семафор - глобальный объект синхронизации. Зачем его использовать для синхронизации потоков внутри одного процесса? Менее затратно использовать эвенты.
Цитата Сообщение от Pavlentiy
так может создать семафоры для каждого сканера отдельно, потомучто сканером считывают два штрих-кода подряд...???
Если подряд, что зачем многопоточность?
0
1 / 1 / 1
Регистрация: 28.03.2008
Сообщений: 40
31.03.2008, 12:40  [ТС]
считываются два подряд штрихкода, сначала технологический а потом заводской...
0
Администратор
 Аватар для mik-a-el
87300 / 52877 / 246
Регистрация: 10.04.2006
Сообщений: 13,649
31.03.2008, 12:42
Цитата Сообщение от Pavlentiy
считываются два подряд штрихкода, сначала технологический а потом заводской...
Ну так тем более, зачем городить огород из нескольких потоков? Поймите, многопоточность не всегда полезна и всегда несет свои накладные расходы на синхронизацию.
0
1 / 1 / 1
Регистрация: 28.03.2008
Сообщений: 40
31.03.2008, 12:44  [ТС]
так как сделать так чтобы различались пакеты???
0
1 / 1 / 1
Регистрация: 28.03.2008
Сообщений: 40
31.03.2008, 12:46  [ТС]
потому что когда я читываю первым сканером технолог. штрих код и потом вторым сканером другой технолог. штрих-код, то тогда на второй приходит сообщение что технолог. уже считан, а мне надо чтобы штрих-коды не пересекались...
0
Почетный модератор
 Аватар для Lord_Voodoo
8784 / 2537 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
31.03.2008, 13:07
слушай, а у тебя нет снифера ком-порта, типа lg-comspy, чтобы посылку эту здесь показать...
0
Администратор
 Аватар для mik-a-el
87300 / 52877 / 246
Регистрация: 10.04.2006
Сообщений: 13,649
31.03.2008, 13:09
Цитата Сообщение от Pavlentiy
а проверку пакета от какого сканера пришла инфа можно сделать???
Цитата Сообщение от Pavlentiy
так как сделать так чтобы различались пакеты???
Пакеты от разных сканеров должны иметь какой-то признак, обозначающий, откуда они пришли. Изучите протокол обмена.
Цитата Сообщение от Pavlentiy
потому что когда я читываю первым сканером технолог. штрих код и потом вторым сканером другой технолог. штрих-код
Так эти данные все равно идут через один порт
Цитата Сообщение от Pavlentiy
тогда на второй приходит сообщение что технолог. уже считан, а мне надо чтобы штрих-коды не пересекались...
Подробнее опишите, как эта бодяга взаимодействует с компом.
0
1 / 1 / 1
Регистрация: 28.03.2008
Сообщений: 40
31.03.2008, 13:44  [ТС]
Code Скопировано
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
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
UINT ThreadReadFromPort(LPVOID  tfParam);
 
extern CTab2* tab2;
extern CTab1* tab1;
 
extern CString SystemMess;
extern CString SkanerMess;
 
extern CString  sm_COM_PORT;
 
CWThrd232* pWThrd232;
 
CArray <int,int&> rez_vozvrat;//массив режимов
 
CZavnomManager* m_pZavManager;
CTehnomManager* m_pTehManager;
 
STR_CURRENT_WASHER    cur_washer;
STR_VOZVRAT_WASHER washer_voz;
 
extern CWPassportView* myForm;
/////////////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNCREATE(CWThrd232, CWinThread)
 
 
CWThrd232::CWThrd232()
{
    CString  strParity;
        
    m_pSerialPort = NULL;
 
        if (sm_COM_PORT=="COM2")
                m_nPortNumber = COM2;
        else
                m_nPortNumber = COM1;
    strParity = "N";
    m_chParity = strParity.GetAt(0);
    m_dwSpeed = 9600;
    m_nStopBits = 1;
    m_nWordLength = 8;
    m_dwTimeOut = 0;
 
    m_requestExit = false;
    m_thrdHdl = NULL;
 
    pWThrd232=this;
 
    cur_washer.bTehNomReady = FALSE;
    cur_washer.bZavNomReady = FALSE;
    cur_washer.bPereup = FALSE;
    cur_washer.bDovodka = FALSE;
    memset(&cur_washer.ctehnom_1_11,0,sizeof(cur_washer.ctehnom_1_11));
    memset(&cur_washer.ctehnom_12_22,0,sizeof(cur_washer.ctehnom_12_22));
    memset(&cur_washer.ctehnom,0,sizeof(cur_washer.ctehnom));
    memset(&cur_washer.czavnom,0,sizeof(cur_washer.czavnom));
    memset(&cur_washer.cmodcod,0,sizeof(cur_washer.cmodcod));
    memset(&cur_washer.cmodname,0,sizeof(cur_washer.cmodname));
    memset(&cur_washer.czaknar,0,sizeof(cur_washer.czaknar));
    memset(&cur_washer.ccountry,0,sizeof(cur_washer.ccountry));
    memset(&cur_washer.clastaddr,0,sizeof(cur_washer.clastaddr));
    memset(&cur_washer.ctestpro,0,sizeof(cur_washer.ctestpro));
}
////////////////////////////////////////////////////////////////////////////
CWThrd232::~CWThrd232()
{
 }
////////////////////////////////////////////////////////////////////////////
BOOL CWThrd232::InitInstance()
{
        m_thrdHdl = AfxBeginThread(ThreadReadFromPort,this);
 
        m_pZavManager = new CZavnomManager(this);    // Create Object Message Manager
        m_pTehManager = new CTehnomManager(this);    // Create Object Message Manager
       
        int w = 0;
        for (int i=0;i<SKAN_ALL+1;i++)// изночально обычный режим
        {
            rez_vozvrat.Add(w);
           
        }
//      pMsgMan->SetTimerMsgManager();
 
        return TRUE;
}
////////////////////////////////////////////////////////////////////////////
int CWThrd232::ExitInstance()
{
        return CWinThread::ExitInstance();
}
////////////////////////////////////////////////////////////////////////////
BEGIN_MESSAGE_MAP(CWThrd232, CWinThread)
        //{{AFX_MSG_MAP(CWThrd232)
                // NOTE - the ClassWizard will add and remove mapping macros here.
        //}}AFX_MSG_MAP
        ON_THREAD_MESSAGE(ID_START_THREAD,CWThrd232::OnStartThread)
        ON_THREAD_MESSAGE(ID_END_THREAD,CWThrd232::OnEndThread)
        ON_THREAD_MESSAGE(ID_ZAVNOM_FROM_SKANER,CWThrd232::OnZavnomFromSkaner)
        ON_THREAD_MESSAGE(ID_TEHNOM_FROM_SKANER,CWThrd232::OnTehnomFromSkaner)
        ON_THREAD_MESSAGE(ID_UNDEF_FROM_SKANER,CWThrd232::OnUndefFromSkaner)
        ON_THREAD_MESSAGE(ID_REPEAT_FROM_SKANER,CWThrd232::OnRepeatFromSkaner)
        ON_THREAD_MESSAGE(ID_BUTTON_FROM_SKANER,CWThrd232::OnButtonFromSkaner)
 
        ON_THREAD_MESSAGE(ID_MESS_TO_SKANER,CWThrd232::SendMessToScaner)
 END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
afx_msg LRESULT CWThrd232::OnStartThread(WPARAM wparam, LPARAM lparam)
{
        CWnd*           pWin = (CWnd*) wparam;
 
        m_pSerialPort = PortOpenMSWin32(m_nPortNumber,
                                            m_dwSpeed,
                                            m_chParity,
                                            m_nWordLength,
                                            m_nStopBits);
        if (m_pSerialPort != NULL)
    {
                bConnect = true;
                SystemMess = "Начало работы.Порт открыт";
                tab2->SendMessage(ID_MESSAGE_LIST,SYS_MESS, SYS_MESS);
 
                if (IsRXEmpty(m_pSerialPort) == FALSE)
                        ClearRXBuffer(m_pSerialPort);
        }
        else
        {
                SystemMess = "Начало работы. Невозможно открыть порт.";
                tab2->SendMessage(ID_MESSAGE_LIST,SYS_MESS, SYS_MESS);
        }
 
         char cMessToScan[NUM_BYTE_TX]="";
        memset(&cMessToScan,0,NUM_BYTE_RX);
        strcat(cMessToScan,"Programma^zarabotala !");
        Sleep(300);
        pWThrd232->SendMessToScaner("003",cMessToScan);
        pWThrd232->SendGoodBeepLight("003");
        Sleep(300);
        pWThrd232->SendMessToScaner("002",cMessToScan);
        pWThrd232->SendGoodBeepLight("002");
        Sleep(300);
 
        pWThrd232->SendMessToScaner("001",cMessToScan);
        pWThrd232->SendGoodBeepLight("001");
        Sleep(300);
 
        pWThrd232->SendMessToScaner("000",cMessToScan);
        pWThrd232->SendGoodBeepLight("000");
        Sleep(300);
 
        pWin->PostMessage(ID_START_THREAD,lparam,0);
        return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
afx_msg LRESULT CWThrd232::OnEndThread(WPARAM wparam, LPARAM lparam)
{
        CWnd* pWin = (CWnd*) wparam;
        int repeat = 0;
 
        bConnect = false;
 
        delete (m_pZavManager); 
        delete (m_pTehManager);
 
        m_requestExitOk = false;
        m_requestExit = true;
        if (m_requestExitOk == false)
        {
                while ((m_requestExitOk == false)&&(repeat < 20))
                {
                        Sleep(100);
                        repeat++;
                }
        }
        
        if(m_pSerialPort != NULL)
            PortClose(m_pSerialPort);
 
        m_pSerialPort = NULL;
        SystemMess = "ЗАВЕРШЕНИЕ РАБОТЫ. Порт закрыт.";
        tab2->SendMessage(ID_MESSAGE_LIST,SYS_MESS, SYS_MESS);
        
        pWin->PostMessage(ID_END_THREAD,lparam,0);
        ::PostQuitMessage(0);
        return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
afx_msg LRESULT CWThrd232::OnUndefFromSkaner(WPARAM wparam, LPARAM lparam)
{
        if (FALSE)
        {
                Sleep(WAIT_BEFORE_SUSPEND);
                ResThrReadBuf();
                return 0;
        }
        bAskMess_D=FALSE;
 
        BYTE*   pBuff = (BYTE*)wparam;
        
        char cMessToScan[NUM_BYTE_TX]="";
        memset(&cMessToScan,0,NUM_BYTE_RX);
 
        char mess[NUM_BYTE_RX];
        memset(&mess,0,NUM_BYTE_RX);
 
        memcpy(&mess, pBuff, NUM_BYTE_RX);
//=============================
        SKANER_MSG_ERR  msg_err;
 
        char    addr[ADDR_LEN+1];
        memset(&addr,0,sizeof(addr));
 
        memset(&msg_err,0,sizeof(SKANER_MSG_ERR));
        memcpy(&msg_err, pBuff, sizeof(SKANER_MSG_ERR));
        
        memcpy(addr, msg_err.addr, ADDR_LEN);
        
        if (strcmp(addr,cur_washer.clastaddr))
        {
                strcpy(addr, cur_washer.clastaddr);
 
                if (strcmp(addr,"003")|| strcmp(addr,"002")||strcmp(addr,"001")||strcmp(addr,"000"))
                {
                    int p=0;
                }
                else
                {
                        strcpy(addr, "003");
                }
                }
//=============================
       
        SkanerMess.Format(" Неверный формат данных: %s", mess);
        tab2->SendMessage(ID_MESSAGE_LIST,SKANER_PC, SKANER_PC);
//===
        strncat(cMessToScan,"Ne verno pro-   ^chitalsya kod,  ^perechitaite ego",NUM_BYTE_TX);
        pWThrd232->SendMessToScaner(addr,cMessToScan);
//===
 
        pWThrd232->SendBadBeepLight(addr);
 
 
        Sleep(700);
        ResThrReadBuf();
        return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// wparam - (UINT) buff_rx
afx_msg LRESULT CWThrd232::OnRepeatFromSkaner(WPARAM wparam, LPARAM lparam)
{
        BYTE*   pBuff = (BYTE*)wparam;
 
        char mess[NUM_BYTE_RX];
        memset(&mess,0,NUM_BYTE_RX);
 
        memcpy(&mess, pBuff, NUM_BYTE_RX);
        
        SkanerMess.Format(" Повтор предыдущего сообщения: %s", mess);
        tab2->SendMessage(ID_MESSAGE_LIST,SKANER_PC, SKANER_PC);
               
        Sleep(700);
        ResThrReadBuf();
        return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
afx_msg LRESULT CWThrd232::OnZavnomFromSkaner(WPARAM wparam, LPARAM lparam)
{
        if (bAskMess_DYN==TRUE)
        {
                Sleep(WAIT_BEFORE_SUSPEND);
                ResThrReadBuf();
                return 0;
        }
        BOOL mode_skan;
        BYTE*   pBuff = (BYTE*)wparam;
 
        char    addr[ADDR_LEN+1];
        memset(&addr,0,sizeof(addr));
 
        char    zavnom[ZAVNOM_LEN+1];
        memset(&zavnom,0,sizeof(zavnom));
 
        SKANER_MSG_ZAVNOM  msg_zavnom;
        memset(&msg_zavnom,0,sizeof(SKANER_MSG_ZAVNOM));
 
        memcpy(&msg_zavnom, pBuff, sizeof(SKANER_MSG_ZAVNOM));
        
        memcpy(addr, msg_zavnom.addr, ADDR_LEN);
        memcpy(zavnom, msg_zavnom.zavnom, ZAVNOM_LEN);
        SkanerMess.Format(" Сканер: %s. Считан заводской номер: %s", addr, zavnom);
        tab2->SendMessage(ID_MESSAGE_LIST,SKANER_PC, SKANER_PC);
        mode_skan = GetSkanMode(addr);
        if (mode_skan)// обработка возврата да
        {
            m_pZavManager->SendMessage(ID_ZAVNOM_VOZVRAT,(UINT)_T(zavnom), (UINT)_T(addr));
            strcpy(washer_voz.vlastaddr,addr);
        }
        else
        {
           m_pZavManager->SendMessage(ID_ZAVNOM_FROM_SKANER,(UINT)_T(zavnom), (UINT)_T(addr));
            strcpy(cur_washer.clastaddr,addr);
        }
         Sleep(700);
        ResThrReadBuf();
        return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// wparam - (UINT) buff_rx
afx_msg LRESULT CWThrd232::OnTehnomFromSkaner(WPARAM wparam, LPARAM lparam)
{
        if ((bAskMess_DYN==TRUE) || (bAskMess_D==TRUE))
        {
            Sleep(WAIT_BEFORE_SUSPEND);
            ResThrReadBuf();
            return 0;
        }
 
        BYTE*   pBuff = (BYTE*)wparam;
        BOOL skan_mode;
        char    addr[ADDR_LEN+1];
        memset(&addr,0,sizeof(addr));
 
        char    tehnom[TEHNOM_LEN+1];
        memset(&tehnom,0,sizeof(tehnom));
        SKANER_MSG_TEHNOM  msg_tehnom;
        memset(&msg_tehnom,0,sizeof(SKANER_MSG_TEHNOM));
 
        memcpy(&msg_tehnom, pBuff, sizeof(SKANER_MSG_TEHNOM));
        memcpy(addr, msg_tehnom.addr, ADDR_LEN);
        memcpy(tehnom, msg_tehnom.tehnom, TEHNOM_LEN);
 
        skan_mode = GetSkanMode(addr);
 
        if (skan_mode)
        {
             char cMessToScan[NUM_BYTE_TX]="";
            memset(&cMessToScan,0,NUM_BYTE_RX);
            strncat(cMessToScan, "V rezime VOZVRAT^chitayut tolko^ZAVNOM!!!",NUM_BYTE_TX);
                                                       
                                SendMessToScaner(addr,cMessToScan);
                                SendBadBeepLight(addr);
 
 
        }
        else
        {
            m_pTehManager->SendMessage(ID_TEHNOM_FROM_SKANER,(UINT)_T(tehnom), (UINT)_T(addr));
 
            strcpy(cur_washer.clastaddr,addr);
        }
            SkanerMess.Format(" Сканер: %s. Считан технол-кий номер: %s", addr, tehnom);
            tab2->SendMessage(ID_MESSAGE_LIST,SKANER_PC, SKANER_PC);
     
        Sleep(700);
        ResThrReadBuf();
        return 0;
}
///////////////////////////////////////////////////////////////////
int CWThrd232::SendMessToScaner(char* pAddr, char* pMess)
{
        int nResult = -1;
        int countErr = 0;
        BYTE TxBuffer[NUM_BYTE_TX];
        memset(TxBuffer,0,sizeof(TxBuffer));
 
        BYTE TxLength = strlen(pMess);
 
        for (BYTE k=0; k < (ADDR_LEN); k++)
        {
                TxBuffer[k]=pAddr[k];
        }
 
        TxBuffer[k++]='-';      // addres delimiter
 
        TxBuffer[k++]=0x1b;     // cls display
        TxBuffer[k++]='[';
        TxBuffer[k++]='2';
        TxBuffer[k++]='J';
 
        BYTE k1=k;
        TxLength=TxLength+k1;
       
        for (k; k < TxLength; k++)
        {
                if (k>=(NUM_BYTE_TX-1))
                        break;
 
                if(pMess[k-k1]=='^')
                {
                        /////////////////////////////////
                        TxBuffer[k++]=0x1b;     // CR
                        k1++;
                        TxLength++;
                        
                         TxBuffer[k++]='E';
                        k1++;
                        TxLength++;
                        /////////////////////////////////
                        k--;
                        k1--;
                        continue;
                }
                TxBuffer[k]=pMess[k-k1];
        }
        TxBuffer[k]=0x0d;
        TxLength = ++k;
        nResult = WriteBuffer(m_pSerialPort,(char*) TxBuffer, TxLength);
        while ((nResult != ASSUCCESS) && (countErr < 3))
        {
                nResult = WriteBuffer(m_pSerialPort,(char*) TxBuffer, TxLength);
                countErr++;
        }
        return nResult;
}
///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
int CWThrd232::SendAskMess_Del_TEHNOM_ToScaner(char* pAddr, char* pMess)
{
                bAskMess_D=TRUE;
 
        int             nResult = -1;
        int             countErr = 0;
        BYTE    TxBuffer_tmp[NUM_BYTE_TX];
 
        BYTE    TxBuffer[NUM_BYTE_TX];
        memset(TxBuffer,0,sizeof(TxBuffer));
 
        BYTE    TxLength = strlen(pMess);
        BYTE    k=0;
        BYTE    len_esc=0;
//=====================
        TxBuffer_tmp[k++]=0x1b; // reverse mode
        TxBuffer_tmp[k++]='[';
        TxBuffer_tmp[k++]='7';
        TxBuffer_tmp[k++]='m';
 
        TxBuffer_tmp[k++]=0x1b; // move to 4,1, say Del
        TxBuffer_tmp[k++]='[';
        TxBuffer_tmp[k++]='4';
        TxBuffer_tmp[k++]=';';
        TxBuffer_tmp[k++]='1';
        TxBuffer_tmp[k++]='H';
        TxBuffer_tmp[k++]=' ';
        TxBuffer_tmp[k++]='d';
        TxBuffer_tmp[k++]='e';
        TxBuffer_tmp[k++]='l';
        TxBuffer_tmp[k++]=' ';
        TxBuffer_tmp[k++]='T';
        TxBuffer_tmp[k++]='E';
        TxBuffer_tmp[k++]='H';
        TxBuffer_tmp[k++]='N';
        TxBuffer_tmp[k++]='O';
        TxBuffer_tmp[k++]='M';
        TxBuffer_tmp[k++]=' ';
 
        TxBuffer_tmp[k++]=0x1b; // normal mode
        TxBuffer_tmp[k++]='[';
        TxBuffer_tmp[k++]='0';
        TxBuffer_tmp[k++]='m';
        len_esc=k;
//=====================
        for (k=0; k < (ADDR_LEN); k++)
        {
           TxBuffer[k]=pAddr[k];
        }
        TxBuffer[k++]='-';      // addres delimiter
        TxBuffer[k++]=0x1b;     // cls display
        TxBuffer[k++]='[';
        TxBuffer[k++]='2';
        TxBuffer[k++]='J';
 
        BYTE k1=k;
        TxLength=TxLength+k1;
         for (k; k < TxLength; k++)
        {
                if (k>=(NUM_BYTE_TX-len_esc-2))
                        break;
 
                if(pMess[k-k1]=='^')
                {
                       TxBuffer[k++]=0x1b;     // CR
                        k1++;
                        TxLength++;
                        
                        TxBuffer[k++]='E';
                        k1++;
                        TxLength++;
                        /////////////////////////////////
                        k--;
                        k1--;
                        continue;
                }
                TxBuffer[k]=pMess[k-k1];
        }
/////
        for (k1=0; k1 < len_esc; k1++,k++)
        {
            TxBuffer[k]=TxBuffer_tmp[k1];
        }
/////
        TxBuffer[k]=0x0d;
        TxLength = ++k;
         nResult = WriteBuffer(m_pSerialPort,(char*) TxBuffer, TxLength);
        while ((nResult != ASSUCCESS) && (countErr < 3))
        {
                nResult = WriteBuffer(m_pSerialPort,(char*) TxBuffer, TxLength);
                countErr++;
        }
        return nResult;
}
///////////////////////////////////////////////////////////////////
int CWThrd232::SendAskMess_Y_N_ToScaner(char* pAddr, char* pMess, int* bLocalVar)
{
                bAskMess_DYN=TRUE;              
        bVar=bLocalVar;
        int             nResult = -1;
        int             countErr = 0;
        BYTE    TxBuffer_tmp[NUM_BYTE_TX];
        BYTE    TxBuffer[NUM_BYTE_TX];
        memset(TxBuffer,0,sizeof(TxBuffer));
 
        BYTE    TxLength = strlen(pMess);
        BYTE    k=0;
        BYTE    len_esc=0;
//=====================
        TxBuffer_tmp[k++]=0x1b; // reverse mode
        TxBuffer_tmp[k++]='[';
        TxBuffer_tmp[k++]='7';
        TxBuffer_tmp[k++]='m';
 
        TxBuffer_tmp[k++]=0x1b; // move to 4,1, say Del
        TxBuffer_tmp[k++]='[';
        TxBuffer_tmp[k++]='4';
        TxBuffer_tmp[k++]=';';
        TxBuffer_tmp[k++]='1';
        TxBuffer_tmp[k++]='H';
        TxBuffer_tmp[k++]=' ';
        TxBuffer_tmp[k++]='d';
        TxBuffer_tmp[k++]='e';
        TxBuffer_tmp[k++]='l';
        TxBuffer_tmp[k++]=' ';
 
        TxBuffer_tmp[k++]=0x1b; // move to 4,7, say Yes
        TxBuffer_tmp[k++]='[';
        TxBuffer_tmp[k++]='4';
        TxBuffer_tmp[k++]=';';
        TxBuffer_tmp[k++]='7';
        TxBuffer_tmp[k++]='H';
        TxBuffer_tmp[k++]=' ';
        TxBuffer_tmp[k++]='y';
        TxBuffer_tmp[k++]='e';
        TxBuffer_tmp[k++]='s';
        TxBuffer_tmp[k++]=' ';
 
        TxBuffer_tmp[k++]=0x1b; // move to 4,13, say No
        TxBuffer_tmp[k++]='[';
        TxBuffer_tmp[k++]='4';
        TxBuffer_tmp[k++]=';';
        TxBuffer_tmp[k++]='1';
        TxBuffer_tmp[k++]='3';
        TxBuffer_tmp[k++]='H';
        TxBuffer_tmp[k++]=' ';
        TxBuffer_tmp[k++]='n';
        TxBuffer_tmp[k++]='o';
        TxBuffer_tmp[k++]=' ';
//---
        TxBuffer_tmp[k++]=0x1b; // normal mode
        TxBuffer_tmp[k++]='[';
        TxBuffer_tmp[k++]='0';
        TxBuffer_tmp[k++]='m';
        len_esc=k;
//=====================
        for (k=0; k < (ADDR_LEN); k++)
        {
                TxBuffer[k]=pAddr[k];
        }
        TxBuffer[k++]='-';      // addres delimiter
        TxBuffer[k++]=0x1b;     // cls display
        TxBuffer[k++]='[';
        TxBuffer[k++]='2';
        TxBuffer[k++]='J';
 
        BYTE k1=k;
        TxLength=TxLength+k1;
         for (k; k < TxLength; k++)
        {
                if (k>=(NUM_BYTE_TX-len_esc-2))
                        break;
                if(pMess[k-k1]=='^')
                {
                        TxBuffer[k++]=0x1b;     // CR
                        k1++;
                        TxLength++;
                        
                        TxBuffer[k++]='E';
                        k1++;
                        TxLength++;
                        /////////////////////////////////
                        k--;
                        k1--;
                        continue;
                }
                TxBuffer[k]=pMess[k-k1];
        }
        for (k1=0; k1 < len_esc; k1++,k++)
        {
                TxBuffer[k]=TxBuffer_tmp[k1];
        }
        TxBuffer[k]=0x0d;
        TxLength = ++k;
        nResult = WriteBuffer(m_pSerialPort,(char*) TxBuffer, TxLength);
        while ((nResult != ASSUCCESS) && (countErr < 3))
        {
                nResult = WriteBuffer(m_pSerialPort,(char*) TxBuffer, TxLength);
                countErr++;
        }
        return nResult;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
afx_msg LRESULT CWThrd232::OnButtonFromSkaner(WPARAM wparam, LPARAM lparam)
{
        BOOL mode_skan;
         BYTE*   pBuff = (BYTE*)wparam;
         BYTE eq = 0x3d;//ввод!!!
        
        char    addr[ADDR_LEN+1];
        memset(&addr,0,sizeof(addr));
     
        SKANER_MSG_BUTTON  msg_button;
        memset(&msg_button,0,sizeof(SKANER_MSG_BUTTON));
        memcpy(&msg_button, pBuff, sizeof(SKANER_MSG_BUTTON));
        memcpy(addr, msg_button.addr, ADDR_LEN);
        mode_skan = GetSkanMode(addr);// режим сканера
 
        char cMessToScan[NUM_BYTE_TX]="";
        memset(&cMessToScan,0,sizeof(cMessToScan));
 
        SkanerMess.Format(" Сканер: %s. Нажата клавиша: %c", addr, msg_button.button);
        tab2->SendMessage(ID_MESSAGE_LIST,SKANER_PC, SKANER_PC);
 
        if (bAskMess_DYN==FALSE)
        {
                if(bAskMess_D==TRUE)
                {
                }
                else
                {
                        if (msg_button.button==eq)
                       {
                            if (mode_skan)
                            {
                                SetMainMode(addr);
                                SkanerMess.Format(" Сканер: %s. Переход в обычный режим", addr);
                                tab2->SendMessage(ID_MESSAGE_LIST,SKANER_PC, SKANER_PC);
                                CWnd* pWnd = (CWnd*) myForm->GetDlgItem(IDC_STATIC_REZ);
                                pWnd->SetWindowText("ОБЫЧНЫЙ");
                                strncat(cMessToScan, "---Perehod v--- ^ ---OBYCHNYI--- ^ ----rezim---- ",NUM_BYTE_TX);            
                                SendMessToScaner(addr,cMessToScan);
                                SendGoodBeepLight(addr);
                        }
                            else
                            {    SetVozvratMode(addr);
                                  SkanerMess.Format(" Сканер: %s. Переход в режим приема возврата ", addr);
                                tab2->SendMessage(ID_MESSAGE_LIST,SKANER_PC, SKANER_PC);
                                CWnd* pWnd = (CWnd*) myForm->GetDlgItem(IDC_STATIC_REZ);
                                pWnd->SetWindowText("ВОЗВРАТ");
                                strncat(cMessToScan, "---Perehod v---^   --rezim--   ^ ---VOZVRAT---",NUM_BYTE_TX);
                                SendMessToScaner(addr,cMessToScan);
                                SendGoodBeepLight(addr);
                            }
                        }
                        Sleep(WAIT_BEFORE_SUSPEND);
                        ResThrReadBuf();
                        return 0;
                }
        }
        switch(msg_button.button)
        {
        case 0x3c:  // '<' // DEL
                m_pTehManager->PereupDovodka_YES_NO_DEL(addr,DEL_TEH);
                bAskMess_DYN=FALSE; 
                bAskMess_D=FALSE;
                /////
                break;
        case 0x3d:  // '=' // YES
                if(bAskMess_DYN==TRUE)
                {
                        *bVar=TRUE;
                        bAskMess_DYN=FALSE;
                        bAskMess_D=FALSE;
                        m_pTehManager->PereupDovodka_YES_NO_DEL(addr,TRUE);
                        SkanerMess.Format(" Сканер: %s. Переупаковка? Да.", addr);
                        tab2->SendMessage(ID_MESSAGE_LIST,SKANER_PC, SKANER_PC);
                }
                break;
        case 0x3e:  // '>' // NO
                if(bAskMess_DYN==TRUE)
                {
                        *bVar=FALSE;
                        bAskMess_DYN=FALSE;
                        bAskMess_D=FALSE;
                        m_pTehManager->PereupDovodka_YES_NO_DEL(addr,FALSE);
                }
                break;
        }
        Sleep(700);
        ResThrReadBuf();
        return 0;
}
///////////////////////////////////////////////////////////////////////////////////////////
int CWThrd232::SendGoodBeepLight(char* pAddr)
{
        int nResult = -1;
        int countErr = 0;
        BYTE TxBuffer[NUM_BYTE_TX];
        memset(TxBuffer,0,sizeof(TxBuffer));
 
        BYTE TxLength = 0;
        for (BYTE k=0; k < 3; k++)
        {
                TxBuffer[k]=pAddr[k];
        }
        TxBuffer[k++]='-';
 
        TxBuffer[k++]=0x1b;
        TxBuffer[k++]='[';
        TxBuffer[k++]='6';  // GREEN ON
        TxBuffer[k++]='q';
 
        TxBuffer[k++]=0x1b;
        TxBuffer[k++]='[';
        TxBuffer[k++]='5';  // WAIT 100 ms
        TxBuffer[k++]='q';
 
        TxBuffer[k++]=0x1b;
        TxBuffer[k++]='[';
        TxBuffer[k++]='3';  // GOOD BEEP
        TxBuffer[k++]='q';
 
        TxBuffer[k++]=0x1b;
        TxBuffer[k++]='[';
        TxBuffer[k++]='5';  // WAIT 100 ms
        TxBuffer[k++]='q';
 
        TxBuffer[k++]=0x1b;
        TxBuffer[k++]='[';
        TxBuffer[k++]='3';  // GOOD BEEP
        TxBuffer[k++]='q';
 
        TxBuffer[k++]=0x1b;
        TxBuffer[k++]='[';
        TxBuffer[k++]='7';  // GREEN OFF
        TxBuffer[k++]='q';
 
        TxBuffer[k++]=0x0d;
        TxLength=k;
        nResult = WriteBuffer(m_pSerialPort,(char*) TxBuffer, TxLength);
        while ((nResult != ASSUCCESS) && (countErr < 3))
        {
                nResult = WriteBuffer(m_pSerialPort,(char*) TxBuffer, TxLength);
                countErr++;
        }
        return nResult;
}
///////////////////////////////////////////////////////////////////////////////////////////
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.03.2008, 13:44
Помогаю со студенческими работами здесь

Где найти информацию про Pentium?
Ребят, может кто знает где найти информацию про Pentium? Курсовую надо писать, а информацию найти не могу. Pentium просто без всяких цифорок

Где найти информацию про Лексемы языка Асм?
У меня задание охарактеризовать лексемы языка Ассемблер. Подскажите может в какой книжке это можно вычитать или если кто знает сайт хороший?

Где найти подробную информацию про ссылочные и значимые типы, стек и управляемую кучу
Где найти подробную инфу про ссылочные и значимые типы, стек и управляемую кучу, что откуда летит и куда и т.д. подробно с...

Где в реестре можно найти разную информацию о ПК?
Привет всем, нужно найти информацию о местонахождении информации о видеокарте, ОЗУ в реестре ( если есть) Вот пример местонахождения...

Где можно найти учебную информацию по WordPress?
Добрый день! Подскажите, где можно найти учебную информацию по WP. Есть ли вообще какие-то самоучителя или что-то в этом роде?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Агрегаты и сущности в DDD микросервисах
Javaican 10.04.2025
Разработка современных программных систем часто приводит на распутье: монолит или микросервисы? Даже при выборе микросервисной архитектуры многие команды сталкиваются с проблемой правильного. . .
Многопоточность в C#: Task и параллельное программирование
UnmanagedCoder 10.04.2025
Современные процессоры уже давно перестали наращивать тактовую частоту в пользу увеличения количества ядер. Это создало интересную ситуацию: разработчики, привыкшие к последовательному. . .
Линейное решение нелинейной задачи будет применено как метод обработки данных из double buffering. Формулы от LM конечно с ошибками.
Hrethgir 10.04.2025
В продолжение Эта LM дала ответ похожий на нормальный. В комментриях мой комментарий - похоже она ошиблась с выведением итоговой формулы, но остальные проверю. Assistant qwen2. 5-14b-instruct . . . .
Переменные в Python
py-thonny 10.04.2025
Переменная в программировании — это символическое имя, связанное с областью памяти, в которой хранится значение. Она позволяет получать доступ к данным через понятные человеку идентификаторы, а не. . .
Многопоточность в C#: Task и асинхронные операции
UnmanagedCoder 10.04.2025
Многопоточность позволяет выполнять несколько операций одновременно, что важно для решения двух основных задач: повышения скорости выполнения вычислительно-сложных операций и сохранения отзывчивости. . .
Линейное решение не линейной задачи (емкость вычислений в сравнении с традиционными решениями пока не определена).
Hrethgir 10.04.2025
В рамках предстоящих вычислений пришлось (да, я тоже знаю про корень числа, и про степеня, и прочие теоремы, но. . . ) найти способ нахождения отношения двух углов. . . .
Запуск контейнеров Docker на ARM64
Mr. Docker 09.04.2025
Появление таких решений, как Apple M1/ M2, AWS Graviton, Ampere Altra и Raspberry Pi, сделало использование ARM-систем обыденностью для многих разработчиков и DevOps-инженеров. При этом Docker,. . .
Vue SFC компонент на PHP с Fusion
Jason-Webb 09.04.2025
PHP на сервере и JavaScript на клиенте — классическое сочетание, которое, несмотря на свою эффективность, создает определенный когнитивный диссонанс при разработке. В этом контексте появляются. . .
TypeScript vs JavaScript: Отличия и когда что использовать
Reangularity 09.04.2025
JavaScript появился в 1995 году как творение Брендана Эйха и быстро стал основой интерактивности в вебе. За свою историю он прошел путь от простого языка для манипуляций с DOM до полноценной. . .
Подключение Kafka к Elasticsearch
Codd 09.04.2025
Apache Kafka и Elasticsearch — две мощные технологии, которые при совместном использовании создают эффективную платформу для обработки и анализа данных в реальном времени. Kafka, выступая в роли. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер