Настройки C # SerialPort - PullRequest
2 голосов
/ 16 мая 2011

У меня проблемы с настройкой COM-порта с использованием класса SerialPort.Есть ряд параметров, которые устанавливаются не так, как мне нужно, когда я вызываю конструктор SerialPort.Используя приложение для мониторинга портов, я заметил следующее:

  1. ReadIntervalTimeout = -1 (должно быть 0)
  2. ReadTotalTimeoutMultiplier = -1 (должно быть 0)
  3. ReadTotalTimeoutConstant = 1000 (должно быть 0)
  4. WriteTotalTimeoutMultiplier = 0 (ОК)
  5. WriteTotalTimeoutConstant = 0 (ОК)
  6. EoFChar = 26 (должно быть 0)
  7. ErrorChar = 63 (должно быть 0)
  8. Break char = 63 (должно быть 0)
  9. XOn Limit = 1024 (должно быть 2048)
  10. XOff Limit = 1024(должно быть 512)
  11. FlowReplace = 0x87 (должно быть 0)

Как изменить эти настройки (я использую C #)?

Ответы [ 3 ]

1 голос
/ 16 мая 2011

Эти значения нельзя установить с помощью класса-обертки SerialPort.Это неполная обертка.Вы можете посмотреть здесь для примера изменения символов XON и XOFF.В остальном вы должны обратиться к документации DCB .

Обновлено

Значения флага DCB - это битовые поля в структуре DCB.

DWORD fBinary  :1;            // Bit 0
DWORD fParity  :1;            // Bit 1
DWORD fOutxCtsFlow  :1;       // Bit 2
DWORD fOutxDsrFlow  :1;       // Bit 3
DWORD fDtrControl  :2;        // Bit 4 - 5
DWORD fDsrSensitivity  :1;    // Bit 6
DWORD fTXContinueOnXoff  :1;  // Bit 7
DWORD fOutX  :1;              // Bit 8
DWORD fInX  :1;               // Bit 9
DWORD fErrorChar  :1;         // Bit 10
DWORD fNull  :1;              // Bit 11
DWORD fRtsControl  :2;        // Bit 12 - 13
DWORD fAbortOnError  :1;      // Bit 14
DWORD fDummy2  :17;           // Bit 15 - 31

И если вам было интересно, как SetDcbFlag выясняет, какими битами вы манипулируете, вот оно (любезно предоставлено Reflector):

internal void SetDcbFlag(int whichFlag, int setting)
{
    uint mask;
    if ((whichFlag == 4) || (whichFlag == 12))
        mask = 3;
    else if (whichFlag == 15)
        mask = 0x1ffff;
    else
        mask = 1;
    this.dcb.Flags &= ~(mask << whichFlag);
    this.dcb.Flags |= ((uint)setting << whichFlag);
}

Это можно увидетьБит № 4 или № 12 использует 2-битную маску, для Бита № 15 - 17-битную маску, а для остальных - 1-битную маску.

1 голос
/ 16 мая 2011

Документация MSDN в классе SerialPort содержит подробные сведения о настройке порта. Я рекомендую вам прочитать эту информацию.

Однако, чтобы начать, вот как вы изменили бы тайм-аут чтения:

port.ReadTimeout = 0;

Тем не менее, не все характеристики, о которых вы говорите, могут быть настроены через .NET без некоторого (да, много) загрязнения с помощью PInvoke и взаимодействия с портом с помощью Win32 API ( Communications Functions) вместо SerialPort. Однако вы можете решить, является ли .NET подходящей платформой, если вам нужно изменить характеристики, не включенные в класс SerialPort.

0 голосов
/ 18 мая 2011

Большое спасибо за ваши ответы, они, безусловно, поставили меня на правильный путь. К сожалению, использование C # или другого языка не является моим решением, поэтому мне пришлось как-то сделать это на C #.

Используя взлом отражения, который Tergiver предоставил здесь Мне удалось установить большинство свойств, найденных в структуре DCB. Я обнаружил, что ErrorChar и BreakChar можно легко установить, назначив необходимое значение SerialPort.ParityReplace, хотя, на мой взгляд, это совсем не очевидно.

Установка тайм-аутов была простой задачей, используя тот же хак, структуру COMMTIMEOUTS и p / Invoking SetCommTimeouts.

Для управления потоком было немного сложно, потому что это делается внутри SetCommState путем вызова DeviceIoControl. Моя проблема заключалась в том, что я не мог установить связь между флагами DCB, ControlHandShake и FlowReplace. Я не смог найти документацию о порядке флагов в 32-битной структуре DCB, поэтому я установил для свойства Flags все значение 0. В итоге ControlHandShake и FlowReplace равны 0.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...