Перейти к содержанию
    

Помогите разобраться с COM-port на C# при соединении с HC-05

Добрый день, помогите решить проблему.

Есть микроконтроллерное устройство с выходом UART подключаюсь к нему с компьютера через переходник USB или  HC-05 на скорости 230.4к.

В терминале соединение и обмен работают в обоих случаях подключения.

 

Написал програмку, которая сканирует COM порты в поисках железки, она с USB переходником работает, а через HC-05 выскакивает ошибка.

Quote

SerialPort sp = new SerialPort();

       sp.PortName = portname;
        sp.Parity = Parity.None;
        sp.BaudRate =230400;
        sp.ReadTimeout = 1000;

sp.Open();

Поскольку в терминале все работает, очевидно проблемма в библиотаках или драйверах для C#. Может есть какой то другой способ работы с COM-портами?

trmn230.jpg

scan230.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 часов назад, siargy сказал:

подключаюсь к нему с компьютера через переходник USB или  HC-05 на скорости 230.4к.

А вы уверены, что HC-05 должен работать на скорости 230400 без ошибок? Какие у него на этот счет паспортные данные?

P.S. У меня HC-06, и я с ним работаю на скорости 9600 baud :).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да, там скорости 9600 или 19200. На практике у меня работало на 115200, причем модули купленные неск лет назад работала без ошибок,  а новые периодически кусали посылки.

13 hours ago, siargy said:

Добрый день, помогите решить проблему.

Есть микроконтроллерное устройство с выходом UART подключаюсь к нему с компьютера через переходник USB или  HC-05 на скорости 230.4к.

В терминале соединение и обмен работают в обоих случаях подключения.

 

Написал програмку, которая сканирует COM порты в поисках железки, она с USB переходником работает, а через HC-05 выскакивает ошибка.

Поскольку в терминале все работает, очевидно проблемма в библиотаках или драйверах для C#. Может есть какой то другой способ работы с COM-портами?

trmn230.jpg

scan230.jpg

 я работаю используя Read File Write File в синхронном режиме.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 hours ago, Xenia said:

А вы уверены, что HC-05 должен работать на скорости 230400 без ошибок?

ну если правильно настроить адаптер и микроконтроллер, то все отлично работает, но в моем случае только в терминале.

сам модуль конфигурируеца почти до 4Мбит

baud_hc05.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 hours ago, x893 said:

используйте Windows API напрямую

это аппаратная привязка к оборудованию или как?

8 hours ago, firstvald said:

Read File Write File в синхронном режиме.

можете пример показать, я совсем далек от программирования приложений.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 часов назад, Xenia сказал:

А вы уверены, что HC-05 должен работать на скорости 230400 без ошибок? Какие у него на этот счет паспортные данные?

Он и на 921600 должен работать. И работает без проблем.

9 часов назад, Xenia сказал:

P.S. У меня HC-06, и я с ним работаю на скорости 9600 baud :).

Вы - весьма неспешны.  :wink2:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

так это пионэры гонят через HC видео ,  ветераны шлют телеграммы.

Есть статья Титова.  Она каноническая. В конце концов, все ссылки на нее приходят. Я сам по ней разбирался. Скачайте и начните разбираться. Там как раз на API пишется. Вам достаточно синхронного режима. У вас уйдет месяц ,  но вы сможете потом тащить свой код дальше повсюду.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 минут назад, firstvald сказал:

Вам достаточно синхронного режима. У вас уйдет месяц ,  но вы сможете потом тащить свой код дальше повсюду.

Месяц??? :shok:  Да ладно! Для реализации overlapped-обмена достаточно прочитать описание функций WinAPI: ReadFile(), WriteFile(), WaitCommEvent(), SetCommMask(), WaitForSingleObject(), WaitForMultipleObjects(), GetOverlappedResult() + ещё нескольких. И пару дней на реализацию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да да. тогда топик спокойно может вас попросить уделить ему два дня и написать его задачу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

17 hours ago, firstvald said:

Есть статья Титова.

в C# это не работает 🤐

найти пример где СОМ-порт открываеца как файл тоже сходу не удалось.

 

17 hours ago, jcxz said:

 WriteFile()

если не трудно накидайте пример, чтобы отправить запрос:

byte[] rqSearch = { 0x0F, 0x00, 0x00, 0x02, 0xff, 0x04 };

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, siargy said:

в C# это не работает

В С# всё работает. Ключевое слово P/Invoke.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, siargy сказал:

в C# это не работает 🤐

найти пример где СОМ-порт открываеца как файл тоже сходу не удалось.

 

если не трудно накидайте пример, чтобы отправить запрос:

byte[] rqSearch = { 0x0F, 0x00, 0x00, 0x02, 0xff, 0x04 };

 

Установите через NuGet пакет SerialPortStream, там все есть


https://www.nuget.org/packages/SerialPortStream/

https://github.com/jcurl/RJCP.DLL.SerialPortStream

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я не понял в чём проблема? поднять СОМ на С#?

Spoiler
private void buttonConnect_Click(object sender, EventArgs e)
        {
            //check comport parameters
            if (comboBoxPortName.SelectedIndex == -1 || comboBoxBaudRate.SelectedIndex == -1)
            {
                MessageBox.Show("Serial Port Parameters Missing!");
                return;
            }

            if (serial_port.IsOpen)
                serial_port.Close();

            try
            {
                if (!serial_port.IsOpen)
                {
                    serial_port.PortName = comboBoxPortName.SelectedItem.ToString();
                    serial_port.BaudRate = Convert.ToInt32(comboBoxBaudRate.SelectedItem.ToString());
                    serial_port.Open();
                }

                buttonConnect.Enabled = false;
                buttonDisconnect.Enabled = true;

                uart_rx_buff_size = (int)numericUpDownBuffSize.Value;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

private void buttonDisconnect_Click(object sender, EventArgs e)
        {
            if (serial_port.IsOpen)
            {
                serial_port.DiscardInBuffer();
                //serial_port.Dispose();
                serial_port.Close();
            }

            buttonConnect.Enabled = true;
            buttonDisconnect.Enabled = false;

            labelAlive.BackColor = Color.Red;
        }

private void comboBoxPortName_DropDown(object sender, EventArgs e)
        {
            ports = SerialPort.GetPortNames();
            comboBoxPortName.Items.Clear();
            comboBoxPortName.Items.AddRange(ports);
        }


private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {
            if (terminal_enable)
            {
                string str = serial_port.ReadExisting();
               
                BeginInvoke((MethodInvoker)delegate
                {
                    string_builder.Append(str);

                    if (string_builder.Length >= uart_rx_buff_size)
                    {
                        richTextBoxReceive.AppendText(string_builder.ToString());
                        string_builder.Clear();
                    }
                });
            }
        }

//OR POLLING WAY
private string ReadComPort(int timeout, int delay)
        {
            char chr;
            string str = "";
            int ticks = 0;

            while (comport.BytesToRead == 0)
            {
                Thread.Sleep(1);
                ticks++;
                if (ticks > timeout)
                {
                    return "NO_RESP\r";
                }
            }

            while (comport.BytesToRead > 0)
            {
                chr = (char)comport.ReadChar();
                str += chr;
                Thread.Sleep(delay);
            }

            return str;
        }

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 minutes ago, jenya7 said:

 в чём проблема?

возникает исключение в определенных ситуациях (скрин в первом сообщении), при этом оборудование работает с точно такимижэ настройками в терминале

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...