0 / 0 / 0
Регистрация: 02.02.2017
Сообщений: 6

Чтение информации с весов через COM порт

02.02.2017, 12:30. Показов 3476. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Недавно начал изучать C++ и стоит такая задача. У меня есть программка, которая должна считывать вес через COM порт и выводить его в поле по нажатию клавиши "Read". Но вместо этого при ее нажатии, программа просто зависает. Может кто подскажет, где ошибся? Заранее спасибо.

C++
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
#include "stdafx.h"
#include <iostream>
#define STYLBTN WS_CHILD|BS_DEFPUSHBUTTON|WS_VISIBLE
#define STYLEDT WS_CHILD|WS_VISIBLE|WS_BORDER|WS_TABSTOP 
 
HINSTANCE hInst;
LPCTSTR szTitle = "Оризон-Универсал";
LPCTSTR szWindowClass = "SimpleWinClass";
LPCTSTR CLSBUTN = "BUTTON";
LPCTSTR CPBUT1 = "Open port";
LPCTSTR CPBUT2 = "Close port";
LPCTSTR CPBUT3 = "Read port";
LPCTSTR CPBUT4 = "Write port";
LPCTSTR CLSEDIT = "EDIT";
LPCTSTR CPEDT1;
LPCTSTR CPEDT2;
HWND HWNDBTN1;
HWND HWNDBTN2;
HWND HWNDBTN3;
HWND HWNDBTN4;
HWND HWNDEDT1;
HWND HWNDEDT2;
HMENU ID_BTN1 = (HMENU)101;
HMENU ID_BTN2 = (HMENU)102;
HMENU ID_BTN3 = (HMENU)103;
HMENU ID_BTN4 = (HMENU)104;
 
LPCTSTR  lpCapApp = "App message";
char  lpApp1[40] = "Open port HANDLE:";
LPCTSTR  lpApp2 = "Close port";
LPCTSTR  lpApp3 = "Data read: Ok";
LPCTSTR  lpApp4 = "Data write: Ok";
 
LPCTSTR  lpCapERR = "Error Message";
char lpERR1[40] = { "Open port Error:" };
char lpERR2[40] = { "DCB Structure ERROR:" };
char lpERR3[40] = { "SetComm Function ERROR:" };
char lpERR4[40] = { "Read port ERROR:" };
char lpERR5[40] = { "Write port ERROR:" };
char lpERR6[40] = { "Close port ERROR:" };
DWORD Mem1;
LPCTSTR Par1 = "%lu";
 
HANDLE HWNDCOM;
LPCTSTR lpNumCOM = "COM1:";
LPCTSTR COMSETTING = "Com1: baud=9600 parity=N data=8 stop=1";
char Buf[255];
DWORD LenBuf;
DCB DCB1;
 
 
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
 
void PurgeBuf()
{
    int a;
    for (a = 0; a<255; a++)
    {
        Buf[a] = 0x20;
    }
    return;
}
 
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
 
    MSG msg;
    WNDCLASSEX wcex;
    HWND hWnd;
    hInst = hInstance;
 
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = (WNDPROC)WndProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wcex.hIconSm = 0;
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)(4);
    wcex.lpszMenuName = 0;
    wcex.lpszClassName = szWindowClass;
    RegisterClassEx(&wcex);
 
    hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, 20, 20, 350, 200, NULL, NULL, hInstance, NULL);
 
    if (!hWnd)
    {
        return FALSE;
    }
 
    ShowWindow(hWnd, SW_SHOWNORMAL);
    UpdateWindow(hWnd);
 
 
 
 
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
 
 
 
 
    return 0;
}
 
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
 
{
    int wmId, wmEvent;
    int Retval;
    switch (message)
 
    {
    case WM_COMMAND:
        wmId = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        switch (wmId)
        {
        case 101:
            HWNDCOM = CreateFile(lpNumCOM, GENERIC_READ | GENERIC_WRITE, NULL, NULL, OPEN_EXISTING, NULL, NULL);
 
            if (HWNDCOM == INVALID_HANDLE_VALUE)
            {
                Mem1 = GetLastError();
                wsprintf(&lpERR1[16], Par1, Mem1);
                MessageBox(0, lpERR1, lpCapERR, 0);
            }
            else
            {
                wsprintf(&lpApp1[17], Par1, HWNDCOM);
                MessageBoxA(0, lpApp1, lpCapApp, 0);
                Retval = BuildCommDCB(COMSETTING, &DCB1);
                if (Retval == 0)
                {
                    Mem1 = GetLastError();
                    wsprintf(&lpERR2[20], Par1, Mem1);
                    MessageBox(0, lpERR2, lpCapERR, 0);
                }
                Retval = SetCommState(HWNDCOM, &DCB1);
                if (Retval == 0)
                {
                    Mem1 = GetLastError();
                    wsprintf(&lpERR3[23], Par1, Mem1);
                    MessageBox(0, lpERR3, lpCapERR, 0);
                }
 
 
            }
            break;
 
        case 102:
            Retval = CloseHandle(HWNDCOM);
            if (Retval == 0)
            {
                Mem1 = GetLastError();
                wsprintf(&lpERR6[17], Par1, Mem1);
                MessageBox(0, lpERR6, lpCapERR, 0);
            }
            else
            {
                MessageBox(0, lpApp2, lpCapApp, 0);
            }
            break;
 
        case 103:
            PurgeBuf();
            Retval = ReadFile(HWNDCOM, &Buf, 255, &LenBuf, NULL);
            if (Retval == 0) 
            {
                Mem1 = GetLastError();
                wsprintf(&lpERR4[16], Par1, Mem1);
                MessageBox(0, lpERR4, lpCapERR, 0);
            }
            else
            {
                SendMessageA(HWNDEDT1, WM_SETTEXT, sizeof Buf, (LPARAM)Buf);
                MessageBox(0, lpApp3, lpCapApp, 0);
            }
 
            break;
        case 104:
            PurgeBuf();
            SendMessage(HWNDEDT2, WM_GETTEXT, sizeof Buf, (LPARAM)Buf);
            Retval = WriteFile(HWNDCOM, &Buf, sizeof Buf, &LenBuf, NULL);
            if (Retval == 0)
            {
                Mem1 = GetLastError();
                wsprintf(&lpERR5[17], Par1, Mem1);
                MessageBox(0, lpERR5, lpCapERR, 0);
            }
            else
            {
                MessageBox(0, lpApp4, lpCapApp, 0);
            }
            break;
        default:
        {
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        }
        break;
    case WM_CREATE:
        HWNDBTN1 = CreateWindowEx(0, CLSBUTN, CPBUT1, STYLBTN, 10, 10, 100, 20, hWnd, ID_BTN1, hInst, 0);
        HWNDBTN2 = CreateWindowEx(0, CLSBUTN, CPBUT2, STYLBTN, 225, 10, 100, 20, hWnd, ID_BTN2, hInst, 0);
        HWNDBTN3 = CreateWindowEx(0, CLSBUTN, CPBUT3, STYLBTN, 115, 40, 100, 20, hWnd, ID_BTN3, hInst, 0);
        HWNDBTN4 = CreateWindowEx(0, CLSBUTN, CPBUT4, STYLBTN, 115, 100, 100, 20, hWnd, ID_BTN4, hInst, 0);
        HWNDEDT1 = CreateWindowEx(0, CLSEDIT, CPEDT1, STYLEDT, 55, 70, 220, 20, hWnd, 0, hInst, 0);
        HWNDEDT2 = CreateWindowEx(0, CLSEDIT, CPEDT2, STYLEDT, 55, 130, 220, 20, hWnd, 0, hInst, 0);
 
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.02.2017, 12:30
Ответы с готовыми решениями:

Получение данных с весов, подключенных к ПЛК PSA-04.12.0220.00.00 через COM-порт over радиоканал
Помогите новичку. Появилась необходимость поправить программку, написанную на Дельфи. Исходников нет - насколько смогла, декомпилировала,...

Чтение данных через COM порт
Имеется устройство, панель кнопок, связанная с компом через RS-232 т.е. COM порт. Хочу сделать прогу, которая отображала бы нажатие...

Пересылка информации между компьютерами через com-порт
Кто-нибудь работал с com-портами на perl? Я соединил два com порта у компьютера и пытаюсь переслать из одного в другой данные. Текст...

10
Модератор
 Аватар для vxg
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,429
02.02.2017, 12:59
PachenKo34
1) не нужно ставить : в имени порта используемого в функции CreateFile
2) если зависание идет на ReadFile то наверное оно ждет данных - тайм-ауты не инициализированы, не помню чему они там будут равняться, может бесконечности
1
0 / 0 / 0
Регистрация: 02.02.2017
Сообщений: 6
02.02.2017, 15:13  [ТС]
Для инициализации тайм-аутов, как понимаю, это команды:
C++
1
2
3
ReadTotalTimeoutConstant
ReadTotalTimeoutMultiplier
ReadTotalTimeoutConstant
Так? Если да, то их нужно вставить в "case 103", где сама функция чтения?
Извините если вопрос глупый)

Добавлено через 1 час 15 минут
Добавил тайм-ауты, то же самое, программа просто подвисает при нажатии "Read file". Может проблема в чем-то другом?
0
Модератор
 Аватар для vxg
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,429
03.02.2017, 06:35
PachenKo34, например - данные не приходят - вы уверены что работаете по нужному протоколу?
0
0 / 0 / 0
Регистрация: 02.02.2017
Сообщений: 6
03.02.2017, 09:17  [ТС]
Возможно в этом и причина... Собственно протокол:9600 скорость, без парности, 1 стоповый бит, 8 бит данных. Передача осуществляется таким способом: передается знак "=", дальше все группы данных начиная с младшего. Например: вес 15.25, передают =52.51000.
Подскажите пожалуйста, как мне сделать тогда именно такую передачу?
0
0 / 0 / 0
Регистрация: 02.02.2017
Сообщений: 6
03.02.2017, 09:18  [ТС]
Ну и сам протокол полностью.
Миниатюры
Чтение информации с весов через COM порт  
0
Модератор
 Аватар для vxg
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,429
03.02.2017, 13:13
PachenKo34
к сожалению не получил из снимка информации дополнительной к сказанной по причине слабого знакомства с используемым языком. имелось ввиду прежде всего следующее - если заложиться на то что задание не врет и устройство реально использует те настройки которые указаны то лично для меня остается вопросом - шлет ли устройство данные по факту взвешивания или по запросу?
0
0 / 0 / 0
Регистрация: 02.02.2017
Сообщений: 6
03.02.2017, 14:19  [ТС]
Как раз само устройство шлет данные по факту взвешивания, а мне нужно сделать что бы на ПК данные передавались только по запросу, а не постоянно.
0
Модератор
 Аватар для vxg
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,429
03.02.2017, 15:45
PachenKo34
если по факту то просто либо в отдельном потоке ждите вечность пока придут либо задайте тайм-ауты и спрашивайте по таймеру к примеру
1
0 / 0 / 0
Регистрация: 02.02.2017
Сообщений: 6
06.02.2017, 09:25  [ТС]
Хорошо, спасибо, буду пробовать.
0
Заблокирован
13.04.2017, 08:19
Я вот так считываю данные из сом порта под досом, правда у меня задача немного шире, надо и текстовый файл считывать и данные передавать обратно в сом порт, но для приема данных вот этого куска кода думаю будет достаточно, программа отлажена и стабильно работает, данные передаются по прерыванию компорта, когда они готовы к передаче и буфер для передачи заполнен, если что то непонятно то спрашивайте
C++
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
#include <stdio.h>
#include <dos.h>
#include <conio.h>
#include <ctype.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
 
    
 
        int comand(void)
    {
    if (system (NULL))
   {
   printf ("Командный процессор доступен\n");
    system ("mem.exe");
 
   }
  else exit(1);
 
    }
 
        int main(void)
{
   unsigned char result;
   int port = 0x3F8;   int i=0;
   int anc=0;
   int flag=0;
   int flag1=0;
   int flag2=0; /*flag2=1 при ошибке синтаксиса*/
   int flag3=100; /*flag3<5 кол букв от 1й до 4х*/
 
   FILE *mf;  /*текстовый файл*/
 
 
   long int time1;
   long int time2;
 
   char strk[100];  /*строка команд через порт*/
   char mtxt[20];   /*текущая строка из текст файла*/
   char estr='';
   char *istr;   /*отдельная команда*/
   char net='';
   char merr[256];
   int ierr=0; /*индекс записи ошибки*/
   int terr=0; /*индекс чтения ошибки*/
  char midn[20]="01234567890123456789";
  char err2[9]=",NO ERROR";
 
 
                outportb(port+3,0x80); /*set dlab on*/
        outportb(port+1,0x00); /*starschiy bait scorosti*/
        outportb(port+0,0x01); /*0C scorosti mlads bait 9600*/
        outportb(port+3,0x03);/* set dlab off,8bit,no perity,1 stop bit */
        outportb(port+1,0x01);  /*preryvanie na priem*/
           inportb(port+3); /*zadergka ignorirovan*/
        outportb(port+2,0xC7); /*FIFO registr C7*/
        outportb(port+4,0x0b);  /*DTR,RTS,OUT2*/
        inportb(port);  /*obnulenie bufera*/
 
  
 
  
 
  for (i=0;i<256;i++) merr[i]='0';
   while (flag1==0)
 {
 anc=0;
   result='';
   time1=NULL;
   istr=NULL;
   for (i=0;i<100;i++) strk[i]='';
   
   while (flag==0)
 {
   
   if (inportb(port+2) & 0x04)
   {
     result=inportb(port);
...
и да я еще в определенный момент запускаю внешнюю программу, вы уберите то что вам не нужно и останется чистый прием данных.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.04.2017, 08:19
Помогаю со студенческими работами здесь

Ошибка в отправке информации через последовательный порт
Доброго времени суток! Снова прошу помощи. Код работал нормально, я решил немного все упорядочить и переписать ее с помощью классов: ...

Чтение/передача данных через USB порт
Задача такова: есть внешний микроконтроллер (Arduino) который связан с ПК ч/з USB (некоторый COM-порт) и вот нужно принимать инфу или её...

Чтение данных из файла и их передача через порт компьютера
Добрый день. Есть задача: в текстовый файл в реальном времени пишется поток данных (углы наклона прибора в градусах). Необходимо...

Что чтение данных через COM-порт делает с 2байтными значениями?
Я принимаю через СОМ-порт 8-байтные слова с определенного устройства. Делается это при помощи драйвера этого устройства, который пишет эти...

Подключение/чтение/отправка данных на сторонние устройства через usb COM порт
сабж: как подключить к андроид устройству сторонние девайсы по COM порту и впоследствии отправлять/читать данные с них. Желательно...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

Новые блоги и статьи
Компиляция C++ с Clang API
NullReferenced 24.03.2025
Компиляторы обычно воспринимаются как черные ящики, которые превращают исходный код в исполняемые файлы. Мы запускаем компилятор командой в терминале, и вуаля — получаем бинарник. Но что если нужно. . .
Многопоточное программировани­е в C#: Класс Thread
UnmanagedCoder 24.03.2025
Когда запускается приложение на компьютере, операционная система создаёт для него процесс - виртуальное адресное пространство. В C# этот процесс изначально получает один поток выполнения — главный. . .
SwiftUI Data Flow: Передача данных между представлениями
mobDevWorks 23.03.2025
При первом знакомстве со SwiftUI кажется, что фреймворк предлагает избыточное количество механизмов для передачи данных: @State, @Binding, @StateObject, @ObservedObject, @EnvironmentObject и другие. . . .
Моки в Java: Сравниваем Mockito, EasyMock, JMockit
Javaican 23.03.2025
Как протестировать класс, который зависит от других сложных компонентов, таких как базы данных, веб-сервисы или другие классы, с которыми и так непросто работать в тестовом окружении? Для этого и. . .
Архитектурные паттерны микросервисов: ТОП-10 шаблонов
ArchitectMsa 22.03.2025
Популярность микросервисной архитектуры объясняется множеством важных преимуществ. К примеру, она позволяет командам разработчиков работать независимо друг от друга, используя различные технологии и. . .
Оптимизация рендеринга в Unity: Сортировка миллиона спрайтов
GameUnited 22.03.2025
Помните, когда наличие сотни спрайтов в игре приводило к существенному падению производительности? Время таких ограничений уходит в прошлое. Сегодня геймдев сталкивается с задачами совершенно иного. . .
Образование и практика
Igor3D 21.03.2025
Добрый день А вот каково качество/ эффективность ВУЗовского образования? Аналитическая геометрия изучается в первом семестре и считается довольно легким курсом, что вполне справедливо. Ну хорошо,. . .
Lazarus. Таблица с объединением ячеек.
Massaraksh7 21.03.2025
Понадобилась представление на экране таблицы с объединёнными ячейками. И не одной, а штук триста, и все разные. На Delphi я использовал для этих целей TStringGrid, и то, кривовато получалось. А в. . .
Async/await в Swift: Асинхронное программировани­е в iOS
mobDevWorks 20.03.2025
Асинхронное программирование долго было одной из самых сложных задач для разработчиков iOS. В течение многих лет мы сражались с замыканиями, диспетчеризацией очередей и обратными вызовами, чтобы. . .
Колмогоровская сложность: Приёмы упрощения кода
ArchitectMsa 20.03.2025
Наверное, каждый программист хотя бы раз сталкивался с кодом, который напоминает запутанный лабиринт — чем дальше в него погружаешься, тем сложнее найти выход. И когда мы говорим о сложности кода, мы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru