ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
7 ноября
1475149 Топик полностью
IBAH (Вчера, 21:05, просмотров: 34) ответил boka17 на Как использовать у СОМ порта бит четности (9600 8О1) на приемной стороне приложения под Win?
Когда-то писал ком порт с контролем четности через WinAPI, не помню чтобы с таким заморачивался. Кажется так: Данные кладутся в буфер, но выставляется ошибка, на эту ошибку можно повесить исключение. 

https://ru.wikibooks.org/wiki/COM-%D0%BF%D0%BE%D1%80%D1%82_%D0%B2_Windows_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B 8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)


//
#include "Mserial.h"
HANDLE           handle;
COMMTIMEOUTS     CommTimeOuts;
DCB              dcb;
COMSTAT          ComState;
OVERLAPPED       Overlap;


// открытие порта
// возвращает TRUE если порт открылся нормально
boolean ComPortOpen(char* port, DWORD BaudRate, BYTE ByteSize,
                                                   BYTE Parity, BYTE StopBits)
  {
  //открываем порт
  handle = CreateFile
                    (
                     port,// имя файла
                     GENERIC_READ | GENERIC_WRITE, // режим доступа
                     0, // совместный доступ
                     NULL,  //SD (дескр. защиты)
                     OPEN_EXISTING, //как действовать
                     NULL,//FILE_FLAG_OVERLAPPED, // атрибуты файла
                     NULL //дескр.шаблона файла
                    );
  if(handle == INVALID_HANDLE_VALUE) {return FALSE; }
  //размер буфера обмена
  if(!SetupComm(handle, SizeBuffer, SizeBuffer)) {return FALSE; }
  //инициализируем структуру настроек порта
  if(!GetCommState(handle, &dcb)) {return FALSE; }
  //заполняем структуру настроек порта
  dcb.BaudRate           = BaudRate;
  dcb.fBinary            = TRUE;
  dcb.fOutxCtsFlow       = FALSE;
  dcb.fOutxDsrFlow       = FALSE;
  dcb.fDtrControl        = DTR_CONTROL_DISABLE;
  dcb.fDsrSensitivity    = FALSE;
  dcb.fNull              = FALSE;
  dcb.fRtsControl        = RTS_CONTROL_TOGGLE;
  dcb.fAbortOnError      = FALSE;
  dcb.ByteSize           = ByteSize;
  dcb.Parity	           = Parity;
  dcb.StopBits           = StopBits;
/*
Члены структуры

DCBlength
Длина структуры, в байтах.

BaudRate
Скорость передачи данных, в бодах, с которой работает коммуникационное устройство. Этот член структуры может быть фактическим значением скорости передачи данных в бодах, или одним из ниже перечисленных индексов:
CBR_110
CBR_19200
CBR_300
CBR_38400
CBR_600
CBR_56000
CBR_1200
CBR_57600
CBR_2400
CBR_115200
CBR_4800
CBR_128000
CBR_9600
CBR_256000
CBR_14400

fBinary
Если этот член структуры - ИСТИНА (TRUE), включается двоичный режим. Windows не поддерживает недвоичный режим передачи, так что этот член структуры должен быть ИСТИНА (TRUE).

fParity
Если этот член структуры - ИСТИНА (TRUE), выполняется проверка четности и сообщается об ошибках..
fOutxCtsFlow
Если этот член структуры - ИСТИНА (TRUE), то проверяется сигнал готовности к приему (CTS) для управления потоком вывода данных. Если этот член структуры - ИСТИНА (TRUE), а сигнал готовности к приему (CTS) выключен, вывод данных приостанавливается до тех пор, пока сигнал готовности к приему (CTS) не отправляется снова.

fOutxDsrFlow
Если этот член структуры - ИСТИНА (TRUE), то проверяется сигнал готовности модема (DSR) для управления потоком вывода данных. Если этот член структуры - ИСТИНА (TRUE), а сигнал готовности модема (DSR) отключается, вывод данных приостанавливается до тех пор, пока сигнал готовности модема (DSR) не отправляется снова.

fDtrControl
Сигнал  DTR (готовности терминала к передаче данных)  управления потоком данных. Этот член структуры может быть одним из следующих значений.
DTR_CONTROL_DISABLE	Отключает линию DTR, когда устройство открывается и оставляет ее заблокированной.
DTR_CONTROL_ENABLE	Включает линию DTR, когда устройство открывается и оставляет ее включенной.
DTR_CONTROL_HANDSHAKE	Включает  процедуру установления связи DTR. Если процедура установления связи включена, она является ошибкой для приложения, которое корректировать линию, используя функцию EscapeCommFunction.

fDsrSensitivity
Если этот член структуры - ИСТИНА (TRUE), коммуникационный драйвер чувствителен к состоянию сигнала готовности модема (DSR). Драйвер игнорирует любые принимаемые байты, если сигнал DSR модемной линии ввода данных  не высокий.

fTXContinueOnXoff
Если этот член структуры - ИСТИНА (TRUE), то передача продолжается и после того, как  байты заполнения буфера ввода данных достигают XoffLim, а драйвер передал символ члена XoffChar, чтобы остановить прием байтов. Если этот член структуры - ЛОЖЬ (FALSE), передача не продолжается до тех пор, пока выгружаемые байты буфера ввода данных не достигнут  XonLim, а драйвер не передаст символ члена структуры XonChar, чтобы возобновить прием.

fOutX
Указывает, используется ли XON/XOFF управление потоком данных в ходе передачи. Если этот член структуры - ИСТИНА (TRUE), передача останавливается, когда принимается символ члена структуры XoffChar и начинается снова, когда принят символ члена XonChar.

fInX
Указывает, используется ли XON/XOFF управление потоком данных в ходе приема. Если этот член структуры - ИСТИНА (TRUE), символ члена структуры XoffChar отправляется тогда, когда заполняемые байты буфера ввода данных достигают величины XoffLim, а символ члена XonChar отправляется тогда, когда выгружаемые байты буфера ввода данных находятся в пределах величины XonLim .

fErrorChar
Указывает, заменяются ли байты, принятые с ошибками четности символом, определенным членом структуры ErrorChar. Если этот член структуры - ИСТИНА (TRUE), и член структуры fParity - ИСТИНА (TRUE), замена происходит.

fNull
Если этот член структуры - ИСТИНА (TRUE), при приеме пустые байты сбрасываются.

fRtsControl
Сигнал RTS ( готовности к передаче) управления потоком данных. Этот член структуры может быть одним из следующих значений.
RTS_CONTROL_DISABLE	Отключает линию RTS, когда устройство открывается и оставляет ее отключенной.
RTS_CONTROL_ENABLE	Включает в работу линию RTS, когда устройство открывается и оставляет ее включенной.
RTS_CONTROL_HANDSHAKE	Включает  процедуру установления связи RTS. Драйвер поднимает линию RTS, когда  (входной) буфер "опережающего ввода с клавиатуры" заполнен меньше, чем на половину и понижает линию RTS, когда буфер заполнен больше, чем на три четверти. Если процедура установления связи разрешается, то это - ошибка для прикладной программы, которая корректирует линию, используя функцию EscapeCommFunction.
RTS_CONTROL_TOGGLE	Определяет, что линия RTS должна быть поднята, если байты доступны для передачи. После того, как все буферизированные байты отправлены, линия RTS должна быть опущена.
Windows Me/98/95:  Это значение не поддерживается.

fAbortOnError
Если этот член структуры - ИСТИНА (TRUE), драйвер завершает все операции чтения и записи с состоянием ошибки, если происходит ошибка. Драйвер не будет допускать любую дальнейшую коммуникационную операцию до тех пор, пока приложение не подтвердит ошибку при помощи вызова функции ClearCommError.

fDummy2
Зарезервированный; не используется.

wReserved
Зарезервированный; должен быть нуль.
XonLim
Минимальное число байтов, которое допустимо в буфере ввода данных перед активизацией управления потоком данных, когда их задерживает отправитель.

 Обратите внимание! на то, что то, что отправитель может передать символы после того, как  стал активным сигнал управления потоком данных, так что это значение никогда не должно равняться нулю. Это предполагает, что или XON/XOFF,  RTS, или DTR сигнал управления потоком данных устанавливается в членах структуры fInX, fRtsControl или fDtrControl.

XoffLim
Максимальное число байтов, допустимое в буфере ввода данных перед активизацией управления потоком данных, чтобы дать возможность осуществить передачу отправителю. Это предполагает, что или XON/XOFF, RTS, или DTR сигнал управления потоком данных устанавливаются в членах структуры fInX, fRtsControl или fDtrControl. Максимальное допустимое число байтов рассчитывается, путем вычитания этого значения из размера буфера ввода данных, в байтах.

ByteSize
Число переданных и принятых битов, в байтах.
Parity
Используемая схема четности. Этот член структуры может быть одним из следующих значений.
EVENPARITY	Проверка по четности
MARKPARITY	Проверка четности по метке
NOPARITY	Без проверки четности
ODDPARITY	Проверка по нечетности
SPACEPARITY	Проверка четности по паузе

StopBits
Число используемых стоповых битов. Этот член структуры может быть одним из следующих значений.
ONESTOPBIT	1 стоповый бит
ONE5STOPBITS	1.5 стоповых бита
TWOSTOPBITS	2 стоповых бита

XonChar
Значение символа XON и для передачи и для приема.

XoffChar
Величина символа XOFF и для передачи и для приема.

ErrorChar
Значение символа, используемого для замены байтов, принятых с ошибкой четности.

EofChar
Значение символа, используемого для сигнала о конце данных.

EvtChar
Значение символа, используемого, чтобы предупредить о событии.

wReserved1
Зарезервирован; не используется.

Замечания
Когда используется структура DCB, чтобы конфигурировать 8250,   применяют ниже перечисленные ограничения к значениям, указанным в членах ByteSize и StopBits:
Число битов данных должно быть от 5 до 8 битов. 
Использование 5 битов данных с 2 стоповыми битами - недопустимая комбинация, также как и 6, 7 или 8 битов данных с 1.5 стоповыми битами.
*/
  //настройка параметров порта
  if(!SetCommState(handle, &dcb)){return FALSE; }
  //инициализируем структуру таймаутов порта
  if(!GetCommTimeouts(handle, &CommTimeOuts)) {return FALSE; }
  //заполняем структуру таймаутов порта
  CommTimeOuts.ReadIntervalTimeout         = 0;
  CommTimeOuts.ReadTotalTimeoutMultiplier  = 0;
  CommTimeOuts.ReadTotalTimeoutConstant    = 0;
  CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
  CommTimeOuts.WriteTotalTimeoutConstant   = 0;
  //настройка таймаутов порта
  if(!SetCommTimeouts(handle, &CommTimeOuts)) {return FALSE; }
  //Очистка буфера приема
  ComPortResetRB();
  //очистка буфера передачи
  ComPortResetWB();

  //The End
  return TRUE;
  }

//закрытие порта
void ComPortClose(void)
  {
  CloseHandle(handle);
  }

// очистка буфера приема
void ComPortResetRB(void)
  {
  PurgeComm(handle, PURGE_RXCLEAR);
  }

// очистка буфера передачи
void ComPortResetWB(void)
  {
  PurgeComm(handle, PURGE_TXCLEAR);
  }

// считать число принятых символов в буфере приема
// (еще не считанных функцией Read)
unsigned short ComPortGetWBSize(void)
  {
  unsigned long temp;
  ClearCommError(handle, &temp, &ComState);
  return (unsigned short)ComState.cbOutQue;
  }

// считать число еще не переданных символов в буфере передачи
unsigned short ComPortGetRBSize(void)
  {
  unsigned long temp;
  ClearCommError(handle, &temp, &ComState);
  return (unsigned short)ComState.cbInQue;
  }

//прочитать символ из порта без ожидания
unsigned char ComPortInKey(void)
  {
  unsigned char tmp;
  unsigned long tmp2;
  ClearCommError(handle, &tmp2, &ComState);
  if(ComPortGetRBSize()==0)return 0;
  ReadFile(handle,&tmp, 1, &tmp2, NULL);
  return tmp;
  }

//прочитать символ из порта без ожидания
unsigned short ComPortInKey16(void)
  {
  unsigned char tmp;
  unsigned long tmp2;
  ClearCommError(handle, &tmp2, &ComState);
  if(ComPortGetRBSize()==0)return 0;
  ReadFile(handle,&tmp, 1, &tmp2, NULL);
  return 0x0100|tmp;
  }

//записать символ в порт
void ComPortPut(unsigned char a)
  {
  unsigned long tmp2;
  ClearCommError(handle, &tmp2, &ComState);
  WriteFile(handle, &a, 1, &tmp2, NULL);
  }

//записать строку в порт
void ComPortPutStr(unsigned char* str)
  {
  for(int i=0;i<100;i++)
    {
    if(str[i]==0)return;
    ComPortPut(str[i]);
    }
  }


//