Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/25: Рейтинг темы: голосов - 25, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 19.06.2020
Сообщений: 78

Создание интерфейса для железнодорожной станции

19.06.2020, 06:49. Показов 5392. Ответов 64
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте...Задача состоит в том что надо сделать интерфейс для жд станции...при нажатие на кнопку должен загоратся соответствующий свет светафора и стрелочный перевод должен перевестись на другой путь...Пути станции будут начерчены схематически...Это мне надо для управления станцией...Программа будеть общаться с устройствами через com port (serial)-это я сделал но с интерфейсом у меня не получается
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.06.2020, 06:49
Ответы с готовыми решениями:

Создание ПО для снятие логов с телефонной станции
Здравствуйте, такая ситуация у меня есть станции 3 штуки LG LDK-100. Мне нужно ежедневно снимать логи с ней о поступающих исходящих...

Тренажёр ДСП железнодорожной станции в Anylogic
Тренажёры дежурных(ДСП) по жд станции можно считать одними из первых ИМ станции. В Сети есть несколько таких тренажеров(н-р Тренажер ДСП...

Составить программу учёта стоимости билета до определённой железнодорожной станции
Составить алгоритм и блок-схему с использованием символьной переменной по заданиям своего варианты:. 3) Составить программу учёта...

64
0 / 0 / 0
Регистрация: 19.06.2020
Сообщений: 78
08.08.2020, 22:33  [ТС]
Студворк — интернет-сервис помощи студентам
У меня ещё одна проблема которую я не понимаю... через ком порт приходят данные...С# записывает их в массив и в дальнейшем работает по массиву...Проблема в том что программа правильно читает данные с ком порта и нормально работает...но в следующем запуске программа не читает ком порт...а иногда даже при нормальной работе программы выходить ошибка : "Индекс находился вне границ массива." Вот код программы:

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
public void serialPort_Indication_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            if (serialPort_Indication.BytesToRead >= 54)
            {
                int length = serialPort_Indication.BytesToRead;
                char[] buffer = new char[length];
                serialPort_Indication.Read(buffer, 0, length);
 
                new Thread(() =>
                {
                    Invoke((MethodInvoker)(() =>
                    {
                    if (Convert.ToChar(buffer[0]) == '@' && (Convert.ToChar(buffer[1])) == '#' && (Convert.ToChar(buffer[54])) == '$')
                    {
 
                        switch ((Convert.ToChar(buffer[26])))
                            {
                                case '1': this.schp.ForeColor = System.Drawing.Color.Red; break;
                                case '0': this.schp.ForeColor = System.Drawing.Color.Black; break;
                            }
                            switch ((Convert.ToChar(buffer[27])))
                            {
                                case '1': this.schap.ForeColor = System.Drawing.Color.Red; break;
                                case '0': this.schap.ForeColor = System.Drawing.Color.Black; break;
                            }
                            switch ((Convert.ToChar(buffer[29])))
                            {
                                case '1': this.m6p.ForeColor = System.Drawing.Color.Red; break;
                                case '0': this.m6p.ForeColor = System.Drawing.Color.Black; break;
                            }
                            switch ((Convert.ToChar(buffer[31])))
                            {
                                case '1': this.p1.ForeColor = System.Drawing.Color.Red; break;
                                case '0': this.p1.ForeColor = System.Drawing.Color.Black; break;
                            }
 
                        }
 
                    }));
                }).Start();
            }
        }
Добавлено через 2 минуты
вот код ардуино который отправляет данные через ком порт:

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
unsigned char buf[55];
 
void setup()
{
 Serial.begin(9600);
 for (int i = 0; i < 52; ++i)
 {
  pinMode((i + 2),INPUT_PULLUP);
 } 
 
}
 
void loop()
{
 for (int i = 0; i < 52; ++i)
 {
  buf[i + 2] = digitalRead(i + 2) ? 48 : 49;
 }
 buf[0]='@';
 buf[1]='#';
 buf[54]='$'; 
 
 Serial.write(buf, sizeof(buf));
 
 delay(3000);
}
0
0 / 0 / 0
Регистрация: 19.06.2020
Сообщений: 78
13.08.2020, 20:15  [ТС]
У меня такое впечатление что второй поток который отвечает за приём и обработку данных не запускается иногда и вследствии чего программа после запуска то работает как надо...то не работает...Как я могу сделать так чтобы мои потоки паралельно работали как мне надо?
0
Эксперт .NET
 Аватар для Rius
13827 / 7899 / 1707
Регистрация: 25.05.2015
Сообщений: 23,977
Записей в блоге: 14
13.08.2020, 20:33
В буфере может находиться меньше данных, чем вы ожидали.
Данные могут быть повреждены.
char не нужны, подойдут и байты. Не стоит тратить целый байт на 1 пин, когда в нём можно уместить аж 8.
Вы можете сбиться с начала посылки и принять, например, конец одной и начало другой.
Вместо Thread + Invoke можно использовать BeginInvoke. Результат почти тот же, а писать меньше.
Читать можно и без события DataReceived.
Нужно вам знания подтягивать...
0
0 / 0 / 0
Регистрация: 19.06.2020
Сообщений: 78
13.08.2020, 22:50  [ТС]
Для того чтобы знать начало и конец пакета я использую массив типа char и записываю на первый индекс cимаол @ а на последный индекс #... Так на стороне c# стоить условие if massiv[1] == '@' && massiv[50] == '#'...Ну с# знает взаранее из скольки байтов состоит пакет и смотрет начало пакета,его конец и сумму пакета ... И получается массив типо @00011000100101# ...Пока это всё до чего я смог додуматься...вроде как работает)
0
Эксперт .NET
 Аватар для Rius
13827 / 7899 / 1707
Регистрация: 25.05.2015
Сообщений: 23,977
Записей в блоге: 14
13.08.2020, 22:53
Судя по 41 посту, не очень-то и работает...
0
0 / 0 / 0
Регистрация: 19.06.2020
Сообщений: 78
13.08.2020, 23:03  [ТС]
Это так...соединение с ком портом есть...ошибку про неверный диапазон массива я исправил тем что поставил фиксированный размер данных
C#
1
if (serialPort_Indication.BytesToRead ==55)
И в итоге у меня программа если при запуске работает то и дальше нормально работает...а если нет то нет.Но при этом соединение с ком портом всё время есть...Значить я думаю что у меня или поток не запускается и не обрабатывает данные или же пакет не проходить проверки на целостность данных
0
0 / 0 / 0
Регистрация: 19.06.2020
Сообщений: 78
14.08.2020, 20:32  [ТС]
Я сейчас попробовал максимально упростить код и вот что у меня получилось :

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
using System;
using System.Windows.Forms;
 
namespace WindowsFormsApp2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                serialPort_Indication.Open();
            }
            catch
            {
                MessageBox.Show("Нет приёма от станции");
 
            }
        }
 
        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            if (serialPort_Indication.BytesToRead == 55)
            {
                int length = serialPort_Indication.BytesToRead;
                char[] buffer = new char[length];
                serialPort_Indication.Read(buffer, 0, length);
 
 
                if (Convert.ToChar(buffer[0]) == '@' && (Convert.ToChar(buffer[1])) == '#' && (Convert.ToChar(buffer[54])) == '$')
                {
                    switch ((Convert.ToChar(buffer[2])))
                    {
                        case '1': this.line1.ForeColor = System.Drawing.Color.Red; break;
                        case '0': this.line1.ForeColor = System.Drawing.Color.Black; break;
                    }
                }
            }
        }
    }
}
Тут всего один поток...вся функция программы состоит в том чтобы при получении данных элемент менял свой свет...И в этом эксперименте я узнал что программа точно также глючить как и раньше...То есть если после запуска программы элемент меняет свой свет то и дальше он будеть менять и работать как надо до следующего закрытия и запуска программы

Добавлено через 1 минуту
значить тут у меня проблемы не с потоками а именно с обработчиком порта? Так получается?
0
Эксперт .NET
 Аватар для Rius
13827 / 7899 / 1707
Регистрация: 25.05.2015
Сообщений: 23,977
Записей в блоге: 14
15.08.2020, 09:58
Из DataReceived нельзя обращаться к GUI напрямую, т.к. это другой поток.
Вы всё продолжаете делать по своему, так что ничего более подсказать не могу.
0
0 / 0 / 0
Регистрация: 19.06.2020
Сообщений: 78
15.08.2020, 10:02  [ТС]
Ну а как надо ? Можно как нибудь по другому?
0
Эксперт .NET
 Аватар для Rius
13827 / 7899 / 1707
Регистрация: 25.05.2015
Сообщений: 23,977
Записей в блоге: 14
15.08.2020, 20:01
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
byte buf[10];
 
void setup()
{
  Serial.begin(9600);
  for (int i = 0; i < 52; ++i) {
    pinMode((i + 2),INPUT_PULLUP);
  } 
}
 
void loop()
{
  for (int i = 0; i < 52; ++i) {
    byte mask = 1 << (i % 8);
    
    if (digitalRead(i + 2) == HIGH) {
      buf[2 + (i / 8)] |= mask;
    } else {
      buf[2 + (i / 8)] &= ~mask;
    }
  }
 
  buf[0]='@';
  buf[1]='#';
  buf[9]='$'; 
 
  Serial.write(buf, sizeof(buf));
 
  delay(3000);
}
Декодирование сами попробуйте.
Для доступа к GUI из DataReceived надо Invoke или BeginInvoke.
Ардуина должна быть одна.
0
0 / 0 / 0
Регистрация: 19.06.2020
Сообщений: 78
17.08.2020, 15:39  [ТС]
У меня вопрос по WPF... В панеле элементов нету Serial port...я попытался открыт порт программно использовав команду using
C#
1
System.IO.Ports;
но так нельзя оказывается...КАК тогда открыть порт??
Я начертил линии и назвал их...На С# выходят их название но поменять их света у меня не получается
C#
1
line1.Stroke = "Blue";
Как можно управлять элементами через С# ? Подскажите пожалуйста.
0
Эксперт .NET
 Аватар для Rius
13827 / 7899 / 1707
Регистрация: 25.05.2015
Сообщений: 23,977
Записей в блоге: 14
17.08.2020, 15:46
Цитата Сообщение от Umidjon Посмотреть сообщение
но так нельзя оказывается...
У вас .Net Framework или .Net Core?

Цитата Сообщение от Umidjon Посмотреть сообщение
Как можно управлять элементами через С# ?
Shape.Stroke Property:
C#
1
public System.Windows.Media.Brush Stroke { get; set; }
Тип свойства не Color или String, а Brush.
У вас уже есть пример. См. 28 пост, TrafficLights2.xaml.cs
0
Эксперт .NET
 Аватар для Usaga
14815 / 9589 / 1368
Регистрация: 21.01.2016
Сообщений: 36,117
17.08.2020, 15:47
Цитата Сообщение от Umidjon Посмотреть сообщение
У меня вопрос по WPF... В панеле элементов нету Serial port...
А с чего ему там оказаться? Вы с дельфи не перепутали? Класс доступа к последовательному порту не относится ни к какому UI-фреймворку и доступен хоть из консоли, хоть из веб-приложения.
0
0 / 0 / 0
Регистрация: 19.06.2020
Сообщений: 78
17.08.2020, 16:57  [ТС]
У меня net.core wpf

Добавлено через 1 минуту
Хорошо в панеле нет порта...в с# с командой не получается открыт порт...что тогда делать? Как подключить?

Добавлено через 16 секунд
Хорошо в панеле нет порта...в с# с командой не получается открыт порт...что тогда делать? Как подключить?
0
Эксперт .NET
 Аватар для Rius
13827 / 7899 / 1707
Регистрация: 25.05.2015
Сообщений: 23,977
Записей в блоге: 14
17.08.2020, 16:58
Попробуйте установить System.IO.Ports через NuGet.
0
0 / 0 / 0
Регистрация: 19.06.2020
Сообщений: 78
17.08.2020, 16:59  [ТС]
А как это?
0
Эксперт .NET
 Аватар для Rius
13827 / 7899 / 1707
Регистрация: 25.05.2015
Сообщений: 23,977
Записей в блоге: 14
17.08.2020, 17:05
Nuget package как скачивать файлы?
0
0 / 0 / 0
Регистрация: 19.06.2020
Сообщений: 78
01.09.2020, 11:35  [ТС]
Я подумал не лучше ли управлять ардуиной не через ком порт а через ethernet? Сделать на С# программу работающая через Ethernet.Наверное это существенно повысить возможности и пременения такой системы.Ведь такая система сможет работать на больших расстояниях,через интернет и с базами данных...

Добавлено через 4 минуты
на ютубе смотрел такие ролики но мне не понравилось то что управление было через браузер и при обновление браузера интерфейс "подглючиваль"... С# ведь не будеть подмигивать при обновлении
0
Эксперт .NET
 Аватар для Rius
13827 / 7899 / 1707
Регистрация: 25.05.2015
Сообщений: 23,977
Записей в блоге: 14
01.09.2020, 11:38
Лучше, да. Но вы не потянете. С COM-портом намного проще.
Таким стоило бы заморачиваться, если бы вы разрабатывали что-то по нормальному ТЗ (где такое требование указано), с собственной электроникой. Ардуина - не тот уровень.
1
0 / 0 / 0
Регистрация: 19.06.2020
Сообщений: 78
01.09.2020, 21:51  [ТС]
Не смотря на ваши примеры к сожелению я до сих пор ещё не смог разобраться в изменение свойств контролов(изменение света линий, размеров и т.п.) в WPF...Тупо применять готовый код не хочу...Хочу понять как всё это работает...Не могли бы обьяснить или же подсказать какую нибудь литературу...а то нормального обьяснения я не смог найти погуглив.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.09.2020, 21:51

Создание интерфейса для программы
Здравствуйте, помогите, пожалуйста, создать интерфейс программы

Аналог take() для железнодорожной библиотеки Anylogic 7
Добрый вечер! Я создаю заявки с помощью функции, к примеру: Barge newBarge = main.add_barges(); newBarge.shipment =...

Создание интерфейса для консольной программы
Имеется следующий код: using System; using System.Collections.Generic; using System.Linq; using System.Text; using...

Создание графического интерфейса для программы
Есть программа const n=6; var mas: array of integer; i,j: byte; chislo: integer; usl: boolean; begin randomize; ...

Eclipse: расширение для создание интерфейса
Привет, подскажите какой то плагин для eclips, желательно бесплатный для создание Пользовательского интерфейса,


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
После закрытия оутлука продолжает висеть процесс в диспетчере задач
Maks 27.10.2026
С недавнего времени в продакшене возникла проблема: при закрытии оутлука в диспетчере задач продолжал висеть процесс outlook. exe. Проблема возникла после установки MS Office 2021 LTSC на машинах, под. . .
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него. https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952 Инструкция внутри. https:/ / youtu. be/ VpfFZSUDGnQ. . .
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru