Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
0 / 0 / 1
Регистрация: 09.04.2015
Сообщений: 21

Подключение к COM - порту

13.01.2017, 15:56. Показов 5330. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, делаю подключение платы к программе на c#, общение должно происходить по RS-485, по протоколу WAKE.
Плата работает правильно(проверял через программу WakeUp!, все команды понимает все нормально), авторы протокола WAKE дали в открытый доступ dll для работы с платой по их протоколу но она написана на С++, я делаю вот такой импорт функций из dll
C#
1
2
3
4
5
6
  
        [DllImport("wsp32.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern bool AccessCOM(char[] P);
 
        [DllImport("wsp32.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern bool OpenCOM(char[] P, int baud);
в с++ это выглядит вот так
C++
1
2
bool AccessCOM(char *P)
bool OpenCOM(char *P, DWORD baud)
собственно
bool AccessCOM(char *P) - функция проверяет доступность порта. В качестве параметра передается имя порта (например, "COM1"). Возвращает true в случае доступности порта.

bool OpenCOM(char *P, DWORD baud) - функция открывает порт. В качестве параметров передаются имя порта (например, "COM1") и скорость в бодах, которая может принимать одно из стандартных значений (например, 115200). Возвращает true в случае успешного выполнения. Функция устанавливает на линии DTR уровень -12В, а на линии RTS уровень +12В.

Пытаюсь проверить порт на доступность функцией AccessCOM и она возвращает True, то есть с портом все нормально и можно подключаться, но когда я выполняю функцию OpenCOM то мне возвращается False, помогите, не могу понять что делаю не так
C#
1
2
3
4
5
6
7
            char[] nameCom = new char[4] { 'C', 'O', 'M', '1' };
 
            bool chek = AccessCOM(nameCom);
            MessageBox.Show(chek.ToString());
 
            chek = OpenCOM(nameCom, 57600);
            MessageBox.Show(chek.ToString());
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.01.2017, 15:56
Ответы с готовыми решениями:

Подключение к порту с паролем
Как подключить к порту 5650? C# Для подключения требуется ввести DNS(ip) и пароль. Добавлено через 21 минуту TcpClient...

Автоматическое подключение к com порту
Не получается найти ошибку в проге(не передает com порт) Программа определяет все доступные com порта, далее принимает сигнал и проверяет...

Подключение кнопки к порту
Есть физический переключатель (1 положение - замкнуто 2 проводка, 2- разомкнуто). Подключаю один провод из этого переключателя к питанию...

22
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
13.01.2017, 16:16
IIiKoBiT, что делает их библиотека? Если спецификация протокола известна, может проще написать программу используя стандартный SerialPort?
0
0 / 0 / 1
Регистрация: 09.04.2015
Сообщений: 21
13.01.2017, 17:15  [ТС]
http://www.digit-el.com/files/open/wake/wake.html - вот спецификация протокола, я пытался сделать как вы говорите, подключение вроде проходит, а вот как отправить правильно пакет я не совсем понял
Вот одна из команд которые понимает плата
Плата автоматики.

Базовый адрес платы автоматики на шине RS-485 - 0x50.


Команда GET_STATUS (uint8_t)0x14 - отдается общий статус пружин - 32 байта, первые 16 байт(128 бит) - байты активности пружин(1 - включено, 0 - выключено), вторые 16 байт(128 бит) - биты ошибок в канале(1 - ошибка, 0 - нет ошибки)
Пример команды - C0 D0 14 CRC-8.

Пытался я отправить вот так
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
 
 private void button_Click(object sender, RoutedEventArgs e)
        {
            SerialPort _serialPort = new SerialPort("COM1",
                                        57600,
                                        Parity.None,
                                        8,
                                        StopBits.One);
            _serialPort.Handshake = Handshake.None;
            _serialPort.DtrEnable = true;
           
            _serialPort.DataReceived += _serialPort_DataReceived;
 
            _serialPort.Open();
            byte[] send = new byte[] { 0xC0, 0xD0,0x14};
            
            _serialPort.Write(send, 0, send.Length);
         
 
        }
 
        private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            MessageBox.Show("");
        }
Но обработчик ответа не срабатывает и я даже не знаю дошел пакет или нет.
Я в пакет не ложу CRC-8 по скольку еще не совсем понял как получить это, но в любом случае даже если пакет не правильный плата мне должна же вернуть ошибку, но этого не происходит.
Вот по этому я и решил воспользоваться их библиотекой.
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
13.01.2017, 17:19
IIiKoBiT,
C#
1
SerialPort _serialPort;
объявите вне функции.
0
0 / 0 / 1
Регистрация: 09.04.2015
Сообщений: 21
13.01.2017, 17:21  [ТС]
Ничего не изменилось.
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
13.01.2017, 17:22
IIiKoBiT, код?
0
0 / 0 / 1
Регистрация: 09.04.2015
Сообщений: 21
13.01.2017, 17: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
47
48
49
50
51
52
53
54
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
 
namespace WpfApplication4
{
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        SerialPort _serialPort;
        private void button_Click(object sender, RoutedEventArgs e)
        {
             _serialPort = new SerialPort("COM1",
                                        57600,
                                        Parity.None,
                                        8,
                                        StopBits.One);
            _serialPort.Handshake = Handshake.None;
            _serialPort.DtrEnable = true;
           
            _serialPort.DataReceived += _serialPort_DataReceived;
 
            _serialPort.Open();
            byte[] send = new byte[] { 0xC0, 0xD0,0x14};
            
            _serialPort.Write(send, 0, send.Length);
         
 
        }
 
        private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            MessageBox.Show("");
        }
    }
}
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
13.01.2017, 17:44
IIiKoBiT, настройки порта точно такие? dtr зачем включен?
В пакете отсутствует байт количества данных.
0
0 / 0 / 1
Регистрация: 09.04.2015
Сообщений: 21
13.01.2017, 17:53  [ТС]
Не помогает
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
13.01.2017, 17:54
IIiKoBiT, точку останова поставь в обработчике события и попробуй ещё раз
0
0 / 0 / 1
Регистрация: 09.04.2015
Сообщений: 21
13.01.2017, 17:59  [ТС]
После того как отправляется пакет(Ну если он отправляется, никаких ошибок и тд нету), в обработчик _serialPort_DataReceived оно не попадает
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
13.01.2017, 18:01
IIiKoBiT, ну значит железка ничего не отвечает. Скорость обмена точно 57600? По спецификации может быть любая от 300 до 115200.
0
0 / 0 / 1
Регистрация: 09.04.2015
Сообщений: 21
13.01.2017, 18:07  [ТС]
Надо именно 57600, так сказали люди которые делали железку и в проверочной программе WakeUp!, все работает на 57600
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
13.01.2017, 18:08
Цитата Сообщение от IIiKoBiT Посмотреть сообщение
в обработчик _serialPort_DataReceived оно не попадает
SerialPort штука тормозная. Я бы не читал в этом обработчике, а в том же методе, где идет отправка, покрутил небольшой цикл с задержкой, проверяя свойство BytesToRead порта, пока данные не появятся. Ну или через сколько-то итераций если не появятся, выбрасывать исключение о таймауте.
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
13.01.2017, 18:13
IIiKoBiT, если честно описание протокола по ссылке дурацкое, особенно тут:
Режим управление передачей с помощью линии RTS используется при работе с интерфейсом RS-485. Во время передачи данных компьютером на линии RTS устанавливается уровень около +12 В, по завершению передачи - около -12 В.
Интерфейс RS-485 не имеет управляющих линий RTS и DTR. Они присутствуют только в RS-232. Да и напряжение 12 В - в 232. В 485 - 5 В.

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

Добавлено через 1 минуту
insite2012, даже еслиб какой-то мусор прилетел - событие бы сработало. А т.к. в ответ тишина - надо разбираться в нюансах железеза.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
13.01.2017, 18:18
Цитата Сообщение от aquaMakc Посмотреть сообщение
даже еслиб какой-то мусор прилетел - событие бы сработало
Я бы не стал на это событие полагаться, поскольку оно еще и зависит от свойства ReceivedBytesThreshold. Мне его неопределенность не по душе, я потому и делаю именно так, как сказал выше.
0
0 / 0 / 1
Регистрация: 09.04.2015
Сообщений: 21
13.01.2017, 18:26  [ТС]
insite2012, ничего, 0
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
13.01.2017, 18:31
Цитата Сообщение от IIiKoBiT Посмотреть сообщение
ничего, 0
В смысле, данные не приходят?
А если их программой подключиться, то есть данные? Если есть, возьмите сканер для порта (например SerialPortMonitor), отсканируйте обмен с устройством через штатную программу и сравните с тем, что передаете вы.
0
0 / 0 / 1
Регистрация: 09.04.2015
Сообщений: 21
13.01.2017, 18:49  [ТС]
Ураа! Получил ответ!!
0xC0, 0xD0,0x14,0x00,0x81 вот такой пакет надо было кидать, через сканер узнал)
Остался последний вопрос, как мне блин получить CRC-8 из пакета? Вообще не могу понять что это
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
13.01.2017, 18:54
Цитата Сообщение от IIiKoBiT Посмотреть сообщение
вот такой пакет надо было кидать, через сканер узнал)
Это надо было сразу сделать.
Цитата Сообщение от IIiKoBiT Посмотреть сообщение
Вообще не могу понять что это
Вот.
Реализаций просчета на C# в сети масса.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.01.2017, 18:54
Помогаю со студенческими работами здесь

Подключение сокетом к com-порту
знаю можно сделать такой строкой CreateFile(comPort, GENERIC_WRITE | GENERIC_READ , FILE_SHARE_WRITE, NULL, OPEN_ALWAYS,...

Подключение светодиодов к COM-порту
Здравствуйте! Необходимо подключить несколько светодиодов к com. В инете по кусочкам нашел инфу что у com 3 выхода на которые можно подать...

Winsocks и подключение к занятому порту.
Люди кто нибудЬ знает как для винсокса по удп или тсп поключится к занятому порту и продолжатЬ работу не выдавая сообщение об ощибки и не...

Подключение к удаленному компьютеру по порту
Здравствуйте! Подскажите пожалуйста. Ситуация: у меня есть домашний компьютер, который подключен к инету через локалку. Мне...

Как перенаправить подключение к одному порту на другой?
Как в CentOS в терминале сделать так, что когда пытаешься подключиться к 88 порту, чтобы перебрасывало на 80-ый, а с 80-ого на сайт, к...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru