Как программно найти весь доступный Baudrates в C# (класс последовательного порта)

Можно использовать системные представления информационной схемы для обнаружения в значительной степени чего-либо о таблицах, которыми Вы интересуетесь:

SELECT *
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE TABLE_NAME = 'yourTableName'
 ORDER BY ORDINAL_POSITION

можно также опросить представления, хранимые процедуры и в значительной степени что-либо о базе данных с помощью представлений Information_schema.

15
задан Cœur 4 January 2019 в 03:46
поделиться

2 ответа

Я нашел несколько способов сделать это. Следующие два документа послужили отправной точкой

Подсказка содержится в следующем абзаце из первого документа

. Самый простой способ определить, какие скорости передачи доступны для конкретного последовательного порта, - это вызвать интерфейс прикладного программирования (API) GetCommProperties () и проверьте битовую маску COMMPROP.dwSettableBaud, чтобы определить, какие скорости передачи поддерживаются на этом последовательном порту.

На этом этапе есть два варианта сделать это в C #:

1.0 Использовать взаимодействие (P / Invoke) следующим образом:

Определить следующую структуру данных

[StructLayout(LayoutKind.Sequential)]
struct COMMPROP
{
    short wPacketLength;
    short wPacketVersion;
    int dwServiceMask;
    int dwReserved1;
    int dwMaxTxQueue;
    int dwMaxRxQueue;
    int dwMaxBaud;
    int dwProvSubType;
    int dwProvCapabilities;
    int dwSettableParams;
    int dwSettableBaud;
    short wSettableData;
    short wSettableStopParity;
    int dwCurrentTxQueue;
    int dwCurrentRxQueue;
    int dwProvSpec1;
    int dwProvSpec2;
    string wcProvChar;
}

Затем определить следующие подписи

[DllImport("kernel32.dll")]
static extern bool GetCommProperties(IntPtr hFile, ref COMMPROP lpCommProp);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern IntPtr CreateFile(string lpFileName, int dwDesiredAccess,
           int dwShareMode, IntPtr securityAttrs, int dwCreationDisposition, 
           int dwFlagsAndAttributes, IntPtr hTemplateFile);

Теперь выполните следующие вызовы (см. http://msdn.microsoft.com/en-us/library/aa363858 (VS.85) .aspx )

   COMMPROP _commProp = new COMMPROP();
   IntPtr hFile = CreateFile(@"\\.\" + portName, 0, 0, IntPtr.Zero, 3, 0x80, IntPtr.Zero);
   GetCommProperties(hFile, ref commProp);

Где portName - что-то вроде COM ?? (COM1, COM2 и т. Д.). commProp.dwSettableBaud теперь должен содержать желаемую информацию.

2.0 Используйте отражение C #

Отражение можно использовать для доступа к SerialPort BaseStream и, следовательно, к необходимым данным следующим образом:

   _port = new SerialPort(portName);
   _port.Open();
   object p = _port.BaseStream.GetType().GetField("commProp", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(_port.BaseStream);
   Int32 bv = (Int32)p.GetType().GetField("dwSettableBaud", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public).GetValue(p);

Обратите внимание, что в обоих методах, указанных выше, порт (порты) необходимо открыть хотя бы один раз, чтобы получить эти данные.


13
ответ дан 1 December 2019 в 04:34
поделиться

Я не думаю, что вы сможете.

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

MSDN просто заявляет: «Скорость передачи скорость должна поддерживаться последовательным драйвером пользователя ».

0
ответ дан 1 December 2019 в 04:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: