1------------------------------------------------------------------------------ 2-- -- 3-- GNAT COMPILER COMPONENTS -- 4-- -- 5-- G N A T . S E R I A L _ C O M M U N I C A T I O N S -- 6-- -- 7-- S p e c -- 8-- -- 9-- Copyright (C) 2007-2015, AdaCore -- 10-- -- 11-- GNAT is free software; you can redistribute it and/or modify it under -- 12-- terms of the GNU General Public License as published by the Free Soft- -- 13-- ware Foundation; either version 3, or (at your option) any later ver- -- 14-- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- 15-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- 16-- or FITNESS FOR A PARTICULAR PURPOSE. -- 17-- -- 18-- As a special exception under Section 7 of GPL version 3, you are granted -- 19-- additional permissions described in the GCC Runtime Library Exception, -- 20-- version 3.1, as published by the Free Software Foundation. -- 21-- -- 22-- You should have received a copy of the GNU General Public License and -- 23-- a copy of the GCC Runtime Library Exception along with this program; -- 24-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- 25-- <http://www.gnu.org/licenses/>. -- 26-- -- 27-- GNAT was originally developed by the GNAT team at New York University. -- 28-- Extensive contributions were provided by Ada Core Technologies Inc. -- 29-- -- 30------------------------------------------------------------------------------ 31 32-- Serial communications package, implemented on Windows and GNU/Linux 33 34with Ada.Streams; 35with Interfaces.C; 36 37package GNAT.Serial_Communications is 38 39 Serial_Error : exception; 40 -- Raised when a communication problem occurs 41 42 type Port_Name is new String; 43 -- A serial com port name 44 45 function Name (Number : Positive) return Port_Name; 46 -- Returns a possible port name for the given legacy PC architecture serial 47 -- port number (COM<number>: on Windows, ttyS<number-1> on Linux). 48 -- Note that this function does not support other kinds of serial ports 49 -- nor operating systems other than Windows and Linux. For all other 50 -- cases, an explicit port name can be passed directly to Open. 51 52 type Data_Rate is 53 (B75, B110, B150, B300, B600, B1200, B2400, B4800, B9600, 54 B19200, B38400, B57600, B115200); 55 -- Speed of the communication 56 57 type Data_Bits is (CS8, CS7); 58 -- Communication bits 59 60 type Stop_Bits_Number is (One, Two); 61 -- One or two stop bits 62 63 type Parity_Check is (None, Even, Odd); 64 -- Either no parity check or an even or odd parity 65 66 type Flow_Control is (None, RTS_CTS, Xon_Xoff); 67 -- No flow control, hardware flow control, software flow control 68 69 type Serial_Port is new Ada.Streams.Root_Stream_Type with private; 70 71 procedure Open 72 (Port : out Serial_Port; 73 Name : Port_Name); 74 -- Open the given port name. Raises Serial_Error if the port cannot be 75 -- opened. 76 77 procedure Set 78 (Port : Serial_Port; 79 Rate : Data_Rate := B9600; 80 Bits : Data_Bits := CS8; 81 Stop_Bits : Stop_Bits_Number := One; 82 Parity : Parity_Check := None; 83 Block : Boolean := True; 84 Local : Boolean := True; 85 Flow : Flow_Control := None; 86 Timeout : Duration := 10.0); 87 -- The communication port settings. If Block is set then a read call 88 -- will wait for the whole buffer to be filed. If Block is not set then 89 -- the given Timeout (in seconds) is used. If Local is set then modem 90 -- control lines (in particular DCD) are ignored (not supported on 91 -- Windows). Flow indicates the flow control type as defined above. 92 93 -- Note: the timeout precision may be limited on some implementation 94 -- (e.g. on GNU/Linux the maximum precision is a tenth of seconds). 95 96 -- Note: calling this procedure may reinitialize the serial port hardware 97 -- and thus cause loss of some buffered data if used during communication. 98 99 overriding procedure Read 100 (Port : in out Serial_Port; 101 Buffer : out Ada.Streams.Stream_Element_Array; 102 Last : out Ada.Streams.Stream_Element_Offset); 103 -- Read a set of bytes, put result into Buffer and set Last accordingly. 104 -- Last is set to Buffer'First - 1 if no byte has been read, unless 105 -- Buffer'First = Stream_Element_Offset'First, in which case the exception 106 -- Constraint_Error is raised instead. 107 108 overriding procedure Write 109 (Port : in out Serial_Port; 110 Buffer : Ada.Streams.Stream_Element_Array); 111 -- Write buffer into the port 112 113 procedure Close (Port : in out Serial_Port); 114 -- Close port 115 116private 117 118 type Port_Data; 119 type Port_Data_Access is access Port_Data; 120 121 type Serial_Port is new Ada.Streams.Root_Stream_Type with record 122 H : Port_Data_Access; 123 end record; 124 125 Data_Rate_Value : constant array (Data_Rate) of Interfaces.C.unsigned := 126 (B75 => 75, 127 B110 => 110, 128 B150 => 150, 129 B300 => 300, 130 B600 => 600, 131 B1200 => 1_200, 132 B2400 => 2_400, 133 B4800 => 4_800, 134 B9600 => 9_600, 135 B19200 => 19_200, 136 B38400 => 38_400, 137 B57600 => 57_600, 138 B115200 => 115_200); 139 140end GNAT.Serial_Communications; 141