• Lunes 16 de Diciembre de 2024, 01:00

Autor Tema:  Problema con SerialPort.h  (Leído 2752 veces)

Zakro

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Problema con SerialPort.h
« en: Viernes 18 de Febrero de 2011, 14:00 »
0
Hola, estoy haciendo un pequeño programa para comunicarme a través del puerto serie en Ubuntu. El problema es que aunque hago un include de SerialPort.h parece que el compilador no lo encuentra.

Ejecuto: g++ PruebaPuerto.cpp y la salida del compilador es:

/tmp/cc8wej22.o: In function `main':
PruebaPuerto.cpp:(.text+0x7b): undefined reference to `SerialPort::SerialPort(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
PruebaPuerto.cpp:(.text+0xdf): undefined reference to `SerialPort::Open(SerialPort::BaudRate, SerialPort::CharacterSize, SerialPort::Parity, SerialPort::StopBits, SerialPort::FlowControl)'
PruebaPuerto.cpp:(.text+0xf3): undefined reference to `SerialPort::~SerialPort()'
PruebaPuerto.cpp:(.text+0x209): undefined reference to `SerialPort::Write(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
PruebaPuerto.cpp:(.text+0x241): undefined reference to `SerialPort::Read(std::vector<unsigned char, std::allocator<unsigned char> >&, unsigned int, unsigned int)'
PruebaPuerto.cpp:(.text+0x348): undefined reference to `SerialPort::Close()'
PruebaPuerto.cpp:(.text+0x395): undefined reference to `SerialPort::~SerialPort()'
PruebaPuerto.cpp:(.text+0x3ab): undefined reference to `SerialPort::~SerialPort()'
collect2: ld returned 1 exit status

El código del programa es:

Código: C++
  1. #include <iostream>
  2. #include <SerialPort.h>
  3.  
  4. using namespace std;
  5.  
  6. string entrada = "";
  7.  
  8. int main(int argc, char **argv)
  9. {
  10.     if (argc<2) {
  11.             cerr << "Falta el puerto serie a abrir" << endl;
  12.             return 1;
  13.     }
  14.     SerialPort puerto(argv[1]);
  15.     try {
  16.         puerto.Open(SerialPort::BAUD_115200,
  17.                 SerialPort::CHAR_SIZE_8,
  18.                 SerialPort::PARITY_NONE,
  19.                 SerialPort::STOP_BITS_1,
  20.                 SerialPort::FLOW_CONTROL_NONE);
  21.     }
  22.     catch (SerialPort::OpenFailed E) {
  23.         cerr << "Error abriendo el puerto" << endl;
  24.         return 1;
  25.     }
  26.     cout << "Escribe lo que quieres enviar" << endl;
  27.     getline(cin,entrada);
  28.     puerto.Write(entrada);
  29.     SerialPort::DataBuffer buf;
  30.     try {
  31.             puerto.Read(buf,entrada.size(),500);
  32.     }
  33.     catch (SerialPort::ReadTimeout E) {
  34.         cout << "TIMEOUT!";
  35.         return 1;
  36.     }
  37.     for(int i=0; i < buf.size(); i++){
  38.         cout << buf[i];
  39.     }
  40.     cout << endl;
  41.     puerto.Close();
  42. }
  43.  

¿Alguna idea de qué puede ser?
« última modificación: Viernes 18 de Febrero de 2011, 14:47 por Zakro »

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Problema con SerialPort.h
« Respuesta #1 en: Viernes 18 de Febrero de 2011, 14:17 »
0
¿Código de SerialPort.h y SerialPort.cpp? Y por favor usa las etiquetas de código, que no hay quien quiera leer el código así...  ^_^

Zakro

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Problema con SerialPort.h
« Respuesta #2 en: Viernes 18 de Febrero de 2011, 14:51 »
0
Ya está  ^_^

SerialPort.h es una cabecera incluída en la biblioteca "libserial"; aquí está el código de la cabecera:

Código: C++
  1. 00001 /***************************************************************************
  2. 00002  *   Copyright (C) 2004 by Manish Pagey                                    *
  3. 00003  *   crayzeewulf@users.sourceforge.net
  4. 00004  *                                                                         *
  5. 00005  *   This program is free software; you can redistribute it and/or modify  *
  6. 00006  *   it under the terms of the GNU General Public License as published by  *
  7. 00007  *   the Free Software Foundation; either version 2 of the License, or     *
  8. 00008  *   (at your option) any later version.                                   *
  9. 00009  *                                                                         *
  10. 00010  *   This program is distributed in the hope that it will be useful,       *
  11. 00011  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
  12. 00012  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
  13. 00013  *   GNU General Public License for more details.                          *
  14. 00014  *                                                                         *
  15. 00015  *   You should have received a copy of the GNU General Public License     *
  16. 00016  *   along with this program; if not, write to the                         *
  17. 00017  *   Free Software Foundation, Inc.,                                       *
  18. 00018  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
  19. 00019  ***************************************************************************/
  20. 00020 #ifndef _SerialPort_h_
  21. 00021 #define _SerialPort_h_
  22. 00022
  23. 00023
  24. 00024 #include <string>
  25. 00025 #include <vector>
  26. 00026 #include <stdexcept>
  27. 00027 #include <termios.h>
  28. 00028
  29. 00029
  30. 00043 class SerialPort
  31. 00044 {
  32. 00045 public:
  33. 00049     enum BaudRate {
  34. 00050         BAUD_50      = B50,
  35. 00051         BAUD_75      = B75,
  36. 00052         BAUD_110     = B110,
  37. 00053         BAUD_134     = B134,
  38. 00054         BAUD_150     = B150,
  39. 00055         BAUD_200     = B200,
  40. 00056         BAUD_300     = B300,
  41. 00057         BAUD_600     = B600,
  42. 00058         BAUD_1200    = B1200,
  43. 00059         BAUD_1800    = B1800,
  44. 00060         BAUD_2400    = B2400,
  45. 00061         BAUD_4800    = B4800,
  46. 00062         BAUD_9600    = B9600,
  47. 00063         BAUD_19200   = B19200,
  48. 00064         BAUD_38400   = B38400,
  49. 00065         BAUD_57600   = B57600,
  50. 00066         BAUD_115200  = B115200,
  51. 00067         BAUD_230400  = B230400,
  52. 00068         BAUD_460800  = B460800,
  53. 00069         BAUD_DEFAULT = BAUD_57600
  54. 00070     } ;
  55. 00071
  56. 00072     enum CharacterSize {
  57. 00073         CHAR_SIZE_5  = CS5,
  58. 00074         CHAR_SIZE_6  = CS6,
  59. 00075         CHAR_SIZE_7  = CS7,
  60. 00076         CHAR_SIZE_8  = CS8,
  61. 00077         CHAR_SIZE_DEFAULT = CHAR_SIZE_8
  62. 00078     } ;
  63. 00079
  64. 00080     enum StopBits {
  65. 00081         STOP_BITS_1,  
  66. 00082         STOP_BITS_2,  
  67. 00083         STOP_BITS_DEFAULT = STOP_BITS_1
  68. 00084     } ;
  69. 00085
  70. 00086     enum Parity {
  71. 00087         PARITY_EVEN,    
  72. 00088         PARITY_ODD,      
  73. 00089         PARITY_NONE,    
  74. 00090         PARITY_DEFAULT = PARITY_NONE
  75. 00091     } ;
  76. 00092
  77. 00093     enum FlowControl {
  78. 00094         FLOW_CONTROL_HARD,
  79. 00095         // FLOW_CONTROL_SOFT,
  80. 00096         FLOW_CONTROL_NONE,
  81. 00097         FLOW_CONTROL_DEFAULT = FLOW_CONTROL_NONE
  82. 00098     } ;
  83. 00099
  84. 00100     class NotOpen : public std::logic_error
  85. 00101     {
  86. 00102     public:
  87. 00103         NotOpen(const std::string& whatArg) :
  88. 00104             logic_error(whatArg) { }
  89. 00105     } ;
  90. 00106
  91. 00107     class OpenFailed : public std::runtime_error
  92. 00108     {
  93. 00109     public:
  94. 00110         OpenFailed(const std::string& whatArg) :
  95. 00111             runtime_error(whatArg) { }
  96. 00112     } ;
  97. 00113
  98. 00114     class AlreadyOpen : public std::logic_error
  99. 00115     {
  100. 00116     public:
  101. 00117         AlreadyOpen( const std::string& whatArg ) :
  102. 00118             logic_error(whatArg) { }
  103. 00119     } ;
  104. 00120
  105. 00121     class UnsupportedBaudRate : public std::runtime_error
  106. 00122     {
  107. 00123     public:
  108. 00124         UnsupportedBaudRate( const std::string& whatArg ) :
  109. 00125             runtime_error(whatArg) { }
  110. 00126     } ;
  111. 00127
  112. 00128     class ReadTimeout : public std::runtime_error
  113. 00129     {
  114. 00130     public:
  115. 00131         ReadTimeout() : runtime_error( "Read timeout" ) { }
  116. 00132     } ;
  117. 00133
  118. 00137     explicit SerialPort( const std::string& serialPortName ) ;
  119. 00138
  120. 00142     ~SerialPort() throw() ;
  121. 00143
  122. 00157     void
  123. 00158     Open( const BaudRate      baudRate    = BAUD_DEFAULT,
  124. 00159           const CharacterSize charSize    = CHAR_SIZE_DEFAULT,
  125. 00160           const Parity        parityType  = PARITY_DEFAULT,
  126. 00161           const StopBits      stopBits    = STOP_BITS_DEFAULT,
  127. 00162           const FlowControl   flowControl = FLOW_CONTROL_DEFAULT )
  128. 00163         throw( AlreadyOpen,
  129. 00164                OpenFailed,
  130. 00165                UnsupportedBaudRate,
  131. 00166                std::invalid_argument ) ;
  132. 00167
  133. 00171     bool
  134. 00172     IsOpen() const ;
  135. 00173
  136. 00182     void
  137. 00183     Close()
  138. 00184         throw(NotOpen) ;
  139. 00185
  140. 00196     void
  141. 00197     SetBaudRate( const BaudRate baudRate )
  142. 00198         throw( UnsupportedBaudRate,
  143. 00199                NotOpen,
  144. 00200                std::invalid_argument ) ;
  145. 00201
  146. 00208     BaudRate
  147. 00209     GetBaudRate() const
  148. 00210         throw( NotOpen,
  149. 00211                std::runtime_error ) ;
  150. 00212
  151. 00222     void
  152. 00223     SetCharSize( const CharacterSize charSize )
  153. 00224         throw( NotOpen,
  154. 00225                std::invalid_argument ) ;
  155. 00233     CharacterSize
  156. 00234     GetCharSize() const
  157. 00235         throw(NotOpen) ;
  158. 00236
  159. 00246     void
  160. 00247     SetParity( const Parity parityType )
  161. 00248         throw( NotOpen,
  162. 00249                std::invalid_argument ) ;
  163. 00250
  164. 00258     Parity
  165. 00259     GetParity() const
  166. 00260         throw(NotOpen) ;
  167. 00261
  168. 00271     void
  169. 00272     SetNumOfStopBits( const StopBits numOfStopBits )
  170. 00273         throw( NotOpen,
  171. 00274                std::invalid_argument ) ;
  172. 00275
  173. 00284     StopBits
  174. 00285     GetNumOfStopBits() const
  175. 00286         throw(NotOpen) ;
  176. 00287
  177. 00297     void
  178. 00298     SetFlowControl( const FlowControl   flowControl )
  179. 00299         throw( NotOpen,
  180. 00300                std::invalid_argument ) ;
  181. 00301
  182. 00309     FlowControl
  183. 00310     GetFlowControl() const
  184. 00311         throw( NotOpen ) ;
  185. 00312
  186. 00320     bool
  187. 00321     IsDataAvailable() const
  188. 00322         throw(NotOpen) ;
  189. 00323
  190. 00330     unsigned char
  191. 00331     ReadByte( const unsigned int msTimeout = 0 )
  192. 00332         throw( NotOpen,
  193. 00333                ReadTimeout,
  194. 00334                std::runtime_error ) ;
  195. 00335
  196. 00346     typedef std::vector<unsigned char> DataBuffer ;
  197. 00347     void
  198. 00348     Read( DataBuffer&        dataBuffer,
  199. 00349           const unsigned int numOfBytes = 0,
  200. 00350           const unsigned int msTimeout  = 0 )
  201. 00351         throw( NotOpen,
  202. 00352                ReadTimeout,
  203. 00353                std::runtime_error ) ;
  204. 00354
  205. 00355
  206. 00359     const std::string
  207. 00360     ReadLine( const unsigned int msTimeout = 0,
  208. 00361               const char         lineTerminator = 'n' )
  209. 00362         throw( NotOpen,
  210. 00363                ReadTimeout,
  211. 00364                std::runtime_error ) ;
  212. 00365
  213. 00372     void
  214. 00373     WriteByte(const unsigned char dataByte)
  215. 00374         throw( NotOpen,
  216. 00375                std::runtime_error ) ;
  217. 00376
  218. 00380     void
  219. 00381     Write(const DataBuffer& dataBuffer)
  220. 00382         throw( NotOpen,
  221. 00383                std::runtime_error ) ;
  222. 00384
  223. 00388     void
  224. 00389     Write(const std::string& dataString)
  225. 00390         throw( NotOpen,
  226. 00391                std::runtime_error ) ;
  227. 00392 private:
  228. 00393     SerialPort( const SerialPort& otherSerialPort ) ;
  229. 00394     SerialPort& operator=(const SerialPort& otherSerialPort ) ;
  230. 00395     class SerialPortImpl ;
  231. 00396     SerialPortImpl* mSerialPortImpl ;
  232. 00397 } ;
  233. 00398
  234. 00399 #endif // #ifndef _SerialPort_h_
  235. 00400
  236.  
  237.  

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Problema con SerialPort.h
« Respuesta #3 en: Viernes 18 de Febrero de 2011, 16:11 »
0
Ah ok, perdona, había leído mal los errores. Te falta mandarle al compilador enlazar la librería:

Código: Text
  1. g++ -llibserial -o PruebaPuerto PruebaPuerto.cpp
  2.  

Ya me dices. Saludos.

PD: en entornos UNIX se suelen nombrar los ficheros todo en minusculas para no tener que andar escribiendo mayúsculas  :D

Zakro

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Problema con SerialPort.h
« Respuesta #4 en: Viernes 18 de Febrero de 2011, 18:01 »
0
No era exactamente así pero estabas en lo cierto  ^_^

La sentencia correcta por si a alguien le pasa tambien sería:
Código: C++
  1. g++ -lserial -o PruebaPuerto PruebaPuerto.cpp
  2.  

Lo de poner las mayúsculas en el nombre es porque sigo la notación que nos mandan en la universidad, y ya que esto es para un trabajo de allí... mejor no llevarles la contraria  ;)

Gracias de nuevo!

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Problema con SerialPort.h
« Respuesta #5 en: Viernes 18 de Febrero de 2011, 22:59 »
0
Cita de: "Zakro"
g++ -lserial -o PruebaPuerto PruebaPuerto.cpp
Cierto, siempre se omite el lib  :no: