Код: Выделить всё
////////////////////////////////////////////////////////////////////////////////
//
// UARTbase.h
//
////////////////////////////////////////////////////////////////////////////////
#pragma once
#ifndef __UART_BASE_H__
#define __UART_BASE_H__
////////////////////////////////////////////////////////////////////////////////
#include "targetver.h"
#include "MyTypes.h"
#include "AbsTrans.h"
#include "VirtWr.h"
#ifdef _WIN32_
#include "StdAfx.h"
#include <windows.h>
#pragma comment(lib, "kernel32.lib")
#endif
#ifdef _MINIOS7_
#include "I-7188XA.h"
#endif
#ifdef __STM32__
#ifdef __STM32F411__
#include "system_stm32f4xx.h"
#include "stm32f411xe.h"
#endif
#ifdef __STM32F446__
#include "system_stm32f4xx.h"
#include "stm32f446xx.h"
#endif
#ifdef __STM32F745__
#include "system_stm32f7xx.h"
#include "stm32f745xx.h"
#endif
#ifdef __STM32F767__
#include "system_stm32f7xx.h"
#include "stm32f767xx.h"
#endif
#include <stdlib.h>
#include "OS.h"
#include "kTask.h" // Собирается только под FreeRTOS!
#include "IRQ.h"
#endif
//------------------------------------------------------------------------------
#ifdef __MINIOS7__
#define MAX_SERIAL_PORTS 4 // Количество последовательных портов.
enum ComPort
{
COMPORT1 = 1,
COMPORT2 = 2,
COMPORT3 = 3,
COMPORT4 = 4,
UNKNOWNPORT = -1
};
#endif
//------------------------------------------------------------------------------
#ifdef __WIN32__
#define MAX_SERIAL_PORTS 32 // Количество последовательных портов.
enum ComPort
{
COMPORT0 = 0,
COMPORT1 = 1,
COMPORT2 = 2,
COMPORT3 = 3,
COMPORT4 = 4,
COMPORT5 = 5,
COMPORT6 = 6,
COMPORT7 = 7,
COMPORT8 = 8,
COMPORT9 = 9,
COMPORT10 = 10,
COMPORT11 = 11,
COMPORT12 = 12,
COMPORT13 = 13,
COMPORT14 = 14,
COMPORT15 = 15,
COMPORT16 = 16,
COMPORT17 = 17,
COMPORT18 = 18,
COMPORT19 = 19,
COMPORT20 = 20,
COMPORT21 = 21,
COMPORT22 = 22,
COMPORT23 = 23,
COMPORT24 = 24,
COMPORT25 = 25,
COMPORT26 = 26,
COMPORT27 = 27,
COMPORT28 = 28,
COMPORT29 = 29,
COMPORT30 = 30,
COMPORT31 = 31,
UNKNOWNPORT = -1
};
#endif
//------------------------------------------------------------------------------
#ifdef __STM32__
typedef struct
{
GPIO_TypeDef* port;
uint8 aBit;
}
AnPin;
typedef struct
{
AnPin Tx, Rx, dirControl;
}
UARTpin;
#endif
#ifdef __STM32F411__
// Количество аппаратных последовательных портов.
#define MAX_SERIAL_PORTS 5
#define MAX_VCP 1 // Количество виртуальнх портов
enum ComPort
{
COMPORT1 = 1,
COMPORT2 = 2,
COMPORT6 = 6,
COMPORT100 = 100, // Virtual COM-port over USB
COMPORT200 = 200, // Virtual COM-port over Ethernet
UNKNOWNPORT = -1
};
#endif
#ifdef __STM32F446__
#define MAX_SERIAL_PORTS 10 // Количество последовательных портов (UART)
#define MAX_VCP 1 // Количество виртуальнх портов
enum ComPort
{
COMPORT1 = 1,
COMPORT2 = 2,
COMPORT3 = 3,
COMPORT4 = 4,
COMPORT5 = 5,
COMPORT6 = 6,
COMPORT7 = 7,
COMPORT8 = 8,
COMPORT100 = 100, // Virtual COM-port over USB
COMPORT200 = 200, // Virtual COM-port over Ethernet
UNKNOWNPORT = -1
};
#endif
#ifdef __STM32F745__
#define MAX_SERIAL_PORTS 10 // Количество последовательных портов (UART)
#define MAX_VCP 1 // Количество виртуальнх портов
enum ComPort
{
COMPORT1 = 1,
COMPORT2 = 2,
COMPORT3 = 3,
COMPORT4 = 4,
COMPORT5 = 5,
COMPORT6 = 6,
COMPORT7 = 7,
COMPORT8 = 8,
COMPORT100 = 100, // Virtual COM-port over USB
COMPORT200 = 200, // Virtual COM-port over Ethernet
UNKNOWNPORT = -1
};
#endif
#ifdef __STM32F767__
#define MAX_SERIAL_PORTS 10 // Количество последовательных портов (UART)
#define MAX_VCP 1 // Количество виртуальнх портов
enum ComPort
{
COMPORT1 = 1,
COMPORT2 = 2,
COMPORT3 = 3,
COMPORT4 = 4,
COMPORT5 = 5,
COMPORT6 = 6,
COMPORT7 = 7,
COMPORT8 = 8,
COMPORT100 = 100, // Virtual COM-port over USB
COMPORT200 = 200, // Virtual COM-port over Ethernet
UNKNOWNPORT = -1
};
#endif
//----------------------------------------------------------------------
enum StopBits
{
ONE_STOP_BIT,
ONE_AND_HALF_STOP_BIT,
TWO_STOP_BITS
};
//------------------------------------------------------------------------------
enum Parity
{
NO_PARITY = 0,
ODD, // Нечётность
PARITY // Чётность
};
//------------------------------------------------------------------------------
enum UART_USE_AS
{
SIMPLE = 0,
MODBUS = 1
};
////////////////////////////////////////////////////////////////////////////////
class UART_base : public AbstractTransport, protected IRQ
{
public:
enum UART_ERROR
{
OK = 0,
INVALID_PORT = 1,
INVALID_BAUDRATE = 2,
UNSUPPORTED_DATA_BITS_VALUE = 3,
UNSUPPORTED_STOP_BITS_VALUE = 4,
MAPPING_NOT_SUPPORTED = 5,
ZERO_POINTER = 6,
INVALID_SIZE = 7,
IRQ_HANDLER_NOT_INSTALLED = 8,
DEVICE_IS_BUSY = 9,
// Ошибка операции ввода-вывода
IO_FAULT = 10,
// Превышено время ожидания окончания операции
TIMEOUT = 11
};
//----------------------------------------------------------------------
// Связывает объект SerialPort с физическим портом port,
// устанавливая для порта параметры приёма-передачи.
// Возвращает номер порта. Зачение UNKNOWNPORT указывает на ошибку.
virtual ComPort
open
(
ComPort port,
uint32 baudRate,
uint8 dataBits,
Parity parity,
StopBits stopBits
);
//----------------------------------------------------------------------
// Отвязывает физический порт от объекта SerialPort.
// Возвращает номер отвязанного порта. Значение UNKNOWNPORT
// указывает на ошибку.
virtual ComPort close( void );
//----------------------------------------------------------------------
// Возвращает номер физического порта, к которому выполнена
// привязка. Если привязка не выполнена или завершилась неудачей,
// то вернёт UNKNOWNPORT.
ComPort getPort( void );
//----------------------------------------------------------------------
// Возвращает код ошибки последнего вызова метода класса.
// 0 - нет ошибки, любое другое значение указывает на ошибку, код
// которой зависит от платформы.
virtual int32 getLastError( void );
//----------------------------------------------------------------------
// Принудительная очистка буферов. Количество байт для приёма-
// передачи обнуляется! Оставшиеся в передатчике байты не передаются!
virtual void purgeRxBuff( void ) = 0;
virtual void purgeTxBuff( void ) = 0;
//----------------------------------------------------------------------
// Читает в буфер buff размером buffSize байты из буфера приёмника.
// Работает в неблокирующем режиме!
// Возвращает количество прочитанных байт или ноль в случае
// отсутствия доступных для чтения данных.
virtual int16
receive
(
void* buff,
int16 buffSize,
MODE mode = NON_BLOCK
)
= 0;
//----------------------------------------------------------------------
// Записывает buffSize байт из буфера buff в буфера передатчика.
// Работает в неблокирующем режиме!
// Возвращает количество записанных байт или ноль в случае
// невозможности записи. lastError указывает на ошибку.
// Перед вызовом send(..) во избежании склеивания отправляемых
// посылок, необходимо вызывать getAvailableTxBytes(..) для проверки
// того, что буфер передатчика пуст.
virtual int16
send
(
void* buff,
int16 buffSize,
MODE mode = NON_BLOCK
)
= 0;
//----------------------------------------------------------------------
// Возвращает количество байт, находящихся в буфере передатчика.
virtual int16 getAvailableTxBytes( void ) = 0;
virtual int16 getAvailableRxBytes( void ) = 0;
//----------------------------------------------------------------------
// Сервисные функции для мониторинга и диагностики.
virtual ostream& print( ostream& os );
protected:
//----------------------------------------------------------------------
// Создаёт объект, через который будет осуществляться работа
// с последовательным портом. Может создаваться различная
// обвязка для удобства работы: очереди, семафоры и т.п.
UART_base
(
const char* name
);
//----------------------------------------------------------------------
// Уничтожает объект с высвобождением всех занятых ресурсов.
virtual ~UART_base( void );
//----------------------------------------------------------------------
ComPort port; // Привязаный порт.
int lastError; // Код ошибки последнего вызова.
uint32 baudRate;
uint8 dataBits;
Parity parity;
StopBits stopBits;
#ifdef __STM32__
uint32 APB_divider;
uint8 APB_n;
USART_TypeDef* usart;
IRQn_Type usart_IRQn;
//------------------------------------------------------------------
// Устанавливает события, по которым будет формироваться прерывания.
// Не забудь установить UE и определись с RE и TE!
virtual void setEvents( void ) = 0;
#endif
private:
// Закрываем конструктор копирования и оператор присваивания.
UART_base( const UART_base& );
UART_base& operator= ( UART_base& );
#ifdef _WIN32_
HANDLE m_hFile;
uint32 numOfBytesToWrite, // Количество байт для отправки.
bytesWrittens; // Количество отправленных байт.
#endif
};
extern UART_base *serialPort[ MAX_SERIAL_PORTS ];
////////////////////////////////////////////////////////////////////////////////
#endif // __UART_H__
////////////////////////////////////////////////////////////////////////////////