Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
1 / 1 / 0
Регистрация: 11.12.2016
Сообщений: 123
1

STM32F428

15.07.2020, 18:18. Просмотров 312. Ответов 7
Метки stm (Все метки)

Добрый день, помогите, пожалуйста, запрограммировать STM32
Никак не могу разобраться
Пишу на c#

Открываю порт
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
public static void send_cmd(string cmd, SerialPort SP)
        {
            var bytes = Encoding.ASCII.GetBytes(cmd);
            SP.Write(bytes, 0, bytes.Length);
 
            //var a = cmd.Select(i => Convert.ToString(i, 2));
            //foreach (var ch in a) SP.Write(ch);
        }
 
            Object selectedItem = textBox1.Text;
            SerialPort MainPort = new SerialPort(selectedItem.ToString(), 460800, Parity.None, 8, StopBits.One);
            try
            {
                if (!(MainPort.IsOpen))
                MainPort.Open();
                label2.Text = "Start device initialization!";
 
                // Тут должны быть инструкции для передачи по протоколу ModBus RTU
 
                label2.Text = "Device initialization done!";
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error opening/writing to serial port :: " + ex.Message, "Error!");
            }
            MainPort.Close();
Адрес устройства Доступ к объекту Начальный адрес Количество строк CRC
Команда Область Ст.байт-Мл.байт Ст.байт Мл.байт Ст.байт Мл.байт
50 1С 20 00 00 00 00 00 C8 D7 FE

В качестве команды доступны следующие операции:
 1Ch – чтение кольцевого буфера данных АЦП;
 20h – смена режима красного светодиода, для инициализации отображения ошибки в
программе драйвера;
 2Fh – установка усиления на каскаде PGA;
 3Fh – передача тестового массива данных;
 4Fh – передача массива состояний внутреннего автомата;
 33h – перезагрузка устройства;
 2Сh – чтение БПФ по данным содержащимся в буфере.

Суть в том, что не могу подключиться к плате, не могу сделать корректно строку чтобы обратиться к плате
Может быть кто нибудь сталкивался с этим и сможет помочь

P.S Переписываю код с Python под C# VS 2019 - Возможно поможет кусок питоновского кода
Python
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
def send_cmd(cmd):
    ser.write(cmd.encode())
    time.sleep(0.5)
    
    print ("Start device initialization!")
    send_cmd("/put/memory?address=39&value=214&\r")
    send_cmd("/put/memory?address=40&value=194&\r")
    send_cmd("/put/memory?address=41&value=96&\r")
    send_cmd("/put/memory?address=42&value=0&\r")
    send_cmd("/put/memory?address=43&value=0&\r")
    send_cmd("/put/memory?address=44&value=0&\r")
    send_cmd("/put/memory?address=45&value=0&\r")
    send_cmd("/put/memory?address=46&value=0&\r")
    send_cmd("/put/memory?address=47&value=0&\r")
    send_cmd("/put/memory?address=48&value=112&\r")
    send_cmd("/put/memory?address=49&value=0&\r")
    send_cmd("/put/memory?address=50&value=0&\r")
    send_cmd("/put/memory?address=51&value=0&\r")
    send_cmd("/put/memory?address=87&value=0x76543210&\r")
    send_cmd("/put/memory?address=88&value=0x40&\r")
    send_cmd("/put/memory?address=89&value=0x40&\r")
    send_cmd("/put/memory?address=90&value=0x40&\r")
    send_cmd("/put/memory?address=91&value=0x40&\r")
    send_cmd("/put/memory?address=92&value=0x40&\r")
    send_cmd("/put/memory?address=93&value=0x40&\r")
    send_cmd("/put/memory?address=94&value=0x40&\r")
    send_cmd("/put/memory?address=95&value=0x40&\r")
    send_cmd("/put/memory?address=39&value=214&\r")
    send_cmd("/put/memory?address=40&value=194&\r")
    send_cmd("/put/memory?address=41&value=96&\r")
    send_cmd("/put/memory?address=42&value=0&\r")
    send_cmd("/put/memory?address=43&value=0&\r")
    send_cmd("/put/memory?address=44&value=0&\r")
    send_cmd("/put/memory?address=45&value=0&\r")
    send_cmd("/put/memory?address=46&value=0&\r")
    send_cmd("/put/memory?address=47&value=0&\r")
    send_cmd("/put/memory?address=48&value=112&\r")
    send_cmd("/put/memory?address=49&value=0&\r")
    send_cmd("/put/memory?address=50&value=0&\r")
    send_cmd("/put/memory?address=51&value=0&\r")
    send_cmd("/put/memory?address=87&value=0x76543210&\r")
    send_cmd("/put/memory?address=88&value=0x40&\r")
    send_cmd("/put/memory?address=89&value=0x40&\r")
    send_cmd("/put/memory?address=90&value=0x40&\r")
    send_cmd("/put/memory?address=91&value=0x40&\r")
    send_cmd("/put/memory?address=92&value=0x40&\r")
    send_cmd("/put/memory?address=93&value=0x40&\r")
    send_cmd("/put/memory?address=94&value=0x40&\r")
    send_cmd("/put/memory?address=95&value=0x40&\r")
    send_cmd("/put/memory?address=52&value=1&\r")
    print ("Device initialization done! Wait for 3 sec!")
0
Модератор
8195 / 6067 / 809
Регистрация: 14.02.2011
Сообщений: 21,034
15.07.2020, 19:41 2
Цитата Сообщение от W0rtX Посмотреть сообщение
Добрый день, помогите, пожалуйста, запрограммировать STM32
Никак не могу разобраться
Пишу на c#
для стмки на шарпе
0
31 / 20 / 12
Регистрация: 23.01.2019
Сообщений: 59
15.07.2020, 22:01 3
Уточняющий вопрос.
Вы пишете программу для PC, которая по последовательному порту шлет команды устройству на Stm32?
0
1 / 1 / 0
Регистрация: 11.12.2016
Сообщений: 123
15.07.2020, 22:04  [ТС] 4
yatrim, Да, программа для пк которая отправляет команды и принимает пакеты данных от stm32 по протоколу modbus RTU
0
31 / 20 / 12
Регистрация: 23.01.2019
Сообщений: 59
15.07.2020, 22:39 5
Тогда, возможно, вам лучше задать этот вопрос в разделе про С#. Думаю там найдется больше людей, которые знают этот язык.
От себя могу только сказать, что зря вы в функции send_cmd открываете и закрываете порт. Лучше один раз его открыть, настроить, а в функции send_cmd только передавать команды. Ну и по завершении работы порт закрыть.
0
1 / 1 / 0
Регистрация: 11.12.2016
Сообщений: 123
16.07.2020, 18:01  [ТС] 6
ValeryS, А на чем лучше, может сможете подсказать? Просто шарп более менее знаком
stm32f428 + asd1299
0
2573 / 1165 / 152
Регистрация: 28.10.2011
Сообщений: 4,113
Записей в блоге: 6
16.07.2020, 19:02 7
Цитата Сообщение от W0rtX Посмотреть сообщение
Суть в том, что не могу подключиться к плате, не могу сделать корректно строку чтобы обратиться к плате
Почему строку если нужно передавать бинарные данные?

Вообще код странный. Функции передаете объект порта и отправляете данные. Потом зачем-то создаете другой объект порта.
0
1 / 1 / 0
Регистрация: 16.07.2020
Сообщений: 2
17.07.2020, 08:53 8
Работа с ModbusRTU имеет особенности. Между передаваемыми байтами не должно быть паузы больше чем 1.5 символа (0,750 ms при скорости больше 19200), а между пакетами (запрос->ответ) не должно быть паузы больше чем 3.5 символа (1,750 ms при скорости больше 19200). Иначе это все воспринимается как прекращение приема-передачи и Modbus-состояние сбрасывается в режим ожидания и не принимает ничего в течении 3.5 символа (при грамотной реализации). Следовательно передавать посимвольно данные нельзя. Отправлять необходимо сразу пакетом например в 5 байт, и принимать пока не превысит время между байтами. Тогда пакет считается законченным. Потом уже всякие проверки адреса и CRC и пр.
Сейчас довольно много библиотек имеется по Modbus. Может взять готовую и использовать? А на C# писать уже не логику работы Modbus-протокола, а логику программы.
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.