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

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

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

Добавлено через 1 час 15 минут
Добавил тайм-ауты, то же самое, программа просто подвисает при нажатии "Read file". Может проблема в чем-то другом?
0
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,421
03.02.2017, 06:35 4
PachenKo34, например - данные не приходят - вы уверены что работаете по нужному протоколу?
0
0 / 0 / 0
Регистрация: 02.02.2017
Сообщений: 6
03.02.2017, 09:17  [ТС] 5
Возможно в этом и причина... Собственно протокол:9600 скорость, без парности, 1 стоповый бит, 8 бит данных. Передача осуществляется таким способом: передается знак "=", дальше все группы данных начиная с младшего. Например: вес 15.25, передают =52.51000.
Подскажите пожалуйста, как мне сделать тогда именно такую передачу?
0
0 / 0 / 0
Регистрация: 02.02.2017
Сообщений: 6
03.02.2017, 09:18  [ТС] 6
Ну и сам протокол полностью.
Миниатюры
Чтение информации с весов через COM порт  
0
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,421
03.02.2017, 13:13 7
PachenKo34
к сожалению не получил из снимка информации дополнительной к сказанной по причине слабого знакомства с используемым языком. имелось ввиду прежде всего следующее - если заложиться на то что задание не врет и устройство реально использует те настройки которые указаны то лично для меня остается вопросом - шлет ли устройство данные по факту взвешивания или по запросу?
0
0 / 0 / 0
Регистрация: 02.02.2017
Сообщений: 6
03.02.2017, 14:19  [ТС] 8
Как раз само устройство шлет данные по факту взвешивания, а мне нужно сделать что бы на ПК данные передавались только по запросу, а не постоянно.
0
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,421
03.02.2017, 15:45 9
PachenKo34
если по факту то просто либо в отдельном потоке ждите вечность пока придут либо задайте тайм-ауты и спрашивайте по таймеру к примеру
1
0 / 0 / 0
Регистрация: 02.02.2017
Сообщений: 6
06.02.2017, 09:25  [ТС] 10
Хорошо, спасибо, буду пробовать.
0
Заблокирован
13.04.2017, 08:19 11
Я вот так считываю данные из сом порта под досом, правда у меня задача немного шире, надо и текстовый файл считывать и данные передавать обратно в сом порт, но для приема данных вот этого куска кода думаю будет достаточно, программа отлажена и стабильно работает, данные передаются по прерыванию компорта, когда они готовы к передаче и буфер для передачи заполнен, если что то непонятно то спрашивайте
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
13.04.2017, 08:19
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.04.2017, 08:19
Помогаю со студенческими работами здесь

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

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

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

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


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

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

Новые блоги и статьи
Как проводить научные вычисления на Python
InfoMaster 15.01.2025
Python стал одним из наиболее востребованных языков программирования в области научных вычислений благодаря своей простоте, гибкости и обширной экосистеме специализированных библиотек. Научные. . .
Создание игры типа Minecraft на PyGame/Python: пошаговое руководство
InfoMaster 15.01.2025
В данном руководстве мы рассмотрим процесс создания игры в стиле Minecraft с использованием библиотеки PyGame на языке программирования Python. Этот проект идеально подходит как для начинающих. . .
Как создать свою первую игру в стиле Doom на Unreal Engine
InfoMaster 15.01.2025
Разработка шутера от первого лица в стиле классического Doom представляет собой увлекательное путешествие в мир игрового программирования, где сочетаются творческий подход и технические навыки. . . .
Параллельное программировани­е: основные технологии и принципы
InfoMaster 15.01.2025
Введение в параллельное программирование Параллельное программирование представляет собой фундаментальный подход к разработке программного обеспечения, который позволяет одновременно выполнять. . .
Как написать микросервис на C# с Kafka, MediatR, Redis и GitLab CI/CD
InfoMaster 15.01.2025
В современной разработке программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот подход позволяет разделить сложную систему. . .
Что такое CQRS и как это реализовать на C# с MediatR
InfoMaster 15.01.2025
Концепция CQRS и её роль в современной разработке В современном мире разработки программного обеспечения архитектурные паттерны играют ключевую роль в создании масштабируемых и поддерживаемых. . .
Как настроить CI/CD с Azure DevOps
InfoMaster 15.01.2025
CI/ CD, или непрерывная интеграция и непрерывное развертывание, представляет собой современный подход к разработке программного обеспечения, который позволяет автоматизировать и оптимизировать процесс. . .
Как настроить CI/CD с помощью Jenkins
InfoMaster 15.01.2025
Введение в CI/ CD и Jenkins В современной разработке программного обеспечения непрерывная интеграция (CI) и непрерывная доставка (CD) стали неотъемлемыми элементами процесса создания качественных. . .
Как написать микросервис на Go/Golang с Kafka, REST и GitHub CI/CD
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C# с RabbitMQ, CQRS, Swagger и CI/CD
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru