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-2012, 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 (B1200, B2400, B4800, B9600, B19200, B38400, B57600, B115200); 54 -- Speed of the communication 55 56 type Data_Bits is (CS8, CS7); 57 -- Communication bits 58 59 type Stop_Bits_Number is (One, Two); 60 -- One or two stop bits 61 62 type Parity_Check is (None, Even, Odd); 63 -- Either no parity check or an even or odd parity 64 65 type Flow_Control is (None, RTS_CTS, Xon_Xoff); 66 -- No flow control, hardware flow control, software flow control 67 68 type Serial_Port is new Ada.Streams.Root_Stream_Type with private; 69 70 procedure Open 71 (Port : out Serial_Port; 72 Name : Port_Name); 73 -- Open the given port name. Raises Serial_Error if the port cannot be 74 -- opened. 75 76 procedure Set 77 (Port : Serial_Port; 78 Rate : Data_Rate := B9600; 79 Bits : Data_Bits := CS8; 80 Stop_Bits : Stop_Bits_Number := One; 81 Parity : Parity_Check := None; 82 Block : Boolean := True; 83 Local : Boolean := True; 84 Flow : Flow_Control := None; 85 Timeout : Duration := 10.0); 86 -- The communication port settings. If Block is set then a read call 87 -- will wait for the whole buffer to be filed. If Block is not set then 88 -- the given Timeout (in seconds) is used. If Local is set then modem 89 -- control lines (in particular DCD) are ignored (not supported on 90 -- Windows). Flow indicates the flow control type as defined above. 91 -- 92 -- Note that the timeout precision may be limited on some implementation 93 -- (e.g. on GNU/Linux the maximum precision is a tenth of seconds). 94 95 overriding procedure Read 96 (Port : in out Serial_Port; 97 Buffer : out Ada.Streams.Stream_Element_Array; 98 Last : out Ada.Streams.Stream_Element_Offset); 99 -- Read a set of bytes, put result into Buffer and set Last accordingly. 100 -- Last is set to Buffer'First - 1 if no byte has been read, unless 101 -- Buffer'First = Stream_Element_Offset'First, in which case the exception 102 -- Constraint_Error is raised instead. 103 104 overriding procedure Write 105 (Port : in out Serial_Port; 106 Buffer : Ada.Streams.Stream_Element_Array); 107 -- Write buffer into the port 108 109 procedure Close (Port : in out Serial_Port); 110 -- Close port 111 112private 113 114 type Port_Data; 115 type Port_Data_Access is access Port_Data; 116 117 type Serial_Port is new Ada.Streams.Root_Stream_Type with record 118 H : Port_Data_Access; 119 end record; 120 121 Data_Rate_Value : constant array (Data_Rate) of Interfaces.C.unsigned := 122 (B1200 => 1_200, 123 B2400 => 2_400, 124 B4800 => 4_800, 125 B9600 => 9_600, 126 B19200 => 19_200, 127 B38400 => 38_400, 128 B57600 => 57_600, 129 B115200 => 115_200); 130 131end GNAT.Serial_Communications; 132