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

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

7 minutes ago, firstvald said:

стараюсь снизить вероятность этого проверяя наличия порта непосредственно перед передачей.

Закрывшийся из-за вытаскивания USB компорт вернет ошибку на попытку выполнить системный вызов с ним.
Я говорил про то что не установить параметры порта программе...

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


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

3 часа назад, GenaSPB сказал:

Если по компорту до его открытия из устройства идет поток данных и это вызывает frame error (например из-за того что не вовремя начал принимать, дефолтная скорость мало значит в этом случае) - то функция установки скорости WinAPI будет возвращать ошибку. Сбрасываем её и опять пытаемся установить скорость... И так навсегда.

Странно, но как-то вроде ни разу не сталкивался с таким.

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


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

Quote

System.ArgumentOutOfRangeException перехвачено
  HResult=-2146233086
  Message=Максимальная скорость для этого устройства: 115200.
Имя параметра: baudRate
  Source=System
  ParamName=baudRate
  StackTrace:
       в System.IO.Ports.SerialStream..ctor(String portName, Int32 baudRate, Parity parity, Int32 dataBits, StopBits stopBits, Int32 readTimeout, Int32 writeTimeout, Handshake handshake, Boolean dtrEnable, Boolean rtsEnable, Boolean discardNull, Byte parityReplace)
       в System.IO.Ports.SerialPort.Open()
      

а в каком месте это определяеца? может както исправить можно?

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


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

1 hour ago, jcxz said:

Странно, но как-то вроде ни разу не сталкивался с таким.

Я сталкивался и любой может протестировать, условия я сказал.

В windows программа может применить функции перенастройки к открытому порту, если он не словил ошибку. Если в ошибке, сбросить ее и применить. Это разные операции.

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


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

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

Я сталкивался и любой может протестировать, условия я сказал.

В windows программа может применить функции перенастройки к открытому порту, если он не словил ошибку. Если в ошибке, сбросить ее и применить. Это разные операции.

При открытии порта вызываю WinAPI в следующем порядке:

CreateFile()
SetupComm()
GetCommState()
SetCommState()  //установка скорости среди прочего

Ни разу сбоит. Специально никакие ошибки не сбрасываю. Естественно - с COM-портами работаю постоянно, каждый день. Под разными win.

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


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

2 hours ago, siargy said:

а в каком месте это определяеца? может както исправить можно?

Работайте на 115200

Вам же уже несколько раз объяснили, вот одно из объяснений

6 hours ago, jcxz said:
6 hours ago, siargy said:

2. BT-свисток <-./магия в компьютере/.-> программа

Здесь скорость COM-порта не важна. Между ней и скоростью в канале нет никакой связи. Как и между скоростью UART из п.1 и скоростью радиоканала.

 

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


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

4 hours ago, jcxz said:

Естественно - с COM-портами работаю постоянно, каждый день. Под разными win.

Счастливый человек... а логически то понимаете причины? Коды ошибок проверяете после установки формата и скорости?

Изменено пользователем GenaSPB

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


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

2 часа назад, GenaSPB сказал:

Коды ошибок проверяете после установки формата и скорости?

вроде да:

void TCommDevice::CommEvent()
{
  DWORD j;
  cevt = GetTickCount();
  if (ClearCommError(zero.hComm, &j, NULL)) if (zero.ntf.evStatus) {
    uint e = 0, e1;
    if (~cevo & cev & EV_TXEMPTY) e = TCommStatus_EMPTY;
    cevo = cev;
    if (j & CE_FRAME) e |= TCommStatus_FRAME;
    if (j & (CE_OVERRUN | CE_RXOVER)) e |= TCommStatus_OVER;
    if (j & CE_RXPARITY) e |= TCommStatus_PARITY;
    if (j & CE_BREAK) e |= TCommStatus_BREAK;
    e |= (e1 = GetModemStatus()) ^ modemStatus;
    modemStatus = e1;
    if (e) {
      e |= e1 << 8;
      EvStatus *ped = new EvStatus;
      ped->dev = this;
      ped->status = e;
      SyncPost((NotifyEvent)HandleEvStatus, ped);
    }
  }
}

...
  
        modemStatus = GetModemStatus();
        while (!(zero.terminate | (uint)zero.wanted)) {
          if (!zero.waitCE) {
            if (WaitCommEvent(zero.hComm, &cev, &zero.ovr)) {
              CommEvent();
              SetCommMask(zero.hComm, evMask);
            } else {
              VERIFY(GetLastError() == ERROR_IO_PENDING);
              zero.waitCE = 1;
            }
          }

...
  
          if (!hev[HEV_TX] || !hev[HEV_RX] || !zero.waitCE) continue;
          switch (j = WaitForMultipleObjects(ncell(hev), hev, false, CEV_PERIOD)) {
            case WAIT_TIMEOUT:
              CommEvent();
              continue;
            case WAIT_OBJECT_0 + HEV_MAIN:
              ResetEvent(hev[HEV_MAIN]);
              continue;
          }
          VERIFY(j < (u32)(WAIT_OBJECT_0 + HEV_n));
...
и т.д.

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


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

Убедитесь, что вы правильно передаёте имя порта в функцию CreateFile. Имя порта должно быть вида "\\.\COM44" (вместо COM44 ваш номер порта)

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


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

On 9/1/2023 at 12:31 AM, gerber said:

Убедитесь, что вы правильно передаёте имя порта в функцию CreateFile. Имя порта должно быть вида "\\.\COM44" (вместо COM44 ваш номер порта)

image.thumb.png.2cca7af6b31006ea305e8d91cced53f4.png

сделал по примеру https://learn.microsoft.com/en-us/dotnet/api/system.io.file.create?view=net-7.0

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


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

Остановился на варианте - если порт не открылся, пробую открыть на 115.2к

Из отловленных багов - при добавлении блютуз устройства в систему, необходимо удалять входящий порт.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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