Está en la página 1de 7

Programacin de los puertos Seriales sobre WIN32

Preparado por: J. Huircan Departamento de Ingeniera Elctrica Universidad de La Frontera Abril 2012

Introduccin
La programacin sobre Win32 es ms complicada de que MSDOS, debido a que el manejo de puertos no es directo Bayer (2008) plantea un ejemplo de uso de las funciones, stas fueron modificadas de tal forma de implementar un terminal bsico sobre Windows, sin embargo, la visualizacin sigue siendo sobre la ventana de comandos de Windows .

Implementacin sobre Windows


El siguiente cdigo une las funciones propuestas por Bayer, e incorpora algunos elementos de visualizacin para el control y uso de los datos. Este cdigo puede ser compilado sobre DevC++.
/*------------------------------------------------------------------------------Terminal bsico implementado por jhuircan- 2011-2012 basado en Ba er !200"# $olo en%ia ---------------------------------------------------------------------------------*/ &include 'windows(h' &include 'commctrl(h' &include 'stdio(h' &include 'conio(h' &include 'strin)(h' *+,-./ h$erial0 -1B dcb$erial0 -1B dcb$erial2arams0 int init3com!# 4 char *p5'1671'0 int status500 h$erial 5 1reate8ile!p9:/,/;I13;/+- < :/,/;I13W;IT/9 09 09 62/,3/=I$TI,:9 8I./3+TT;IB>T/3,6;7+.9 0#0 i?!h$erial55I,@+.I-3*+,-./3@+.>/# 4 i?!:et.ast/rror!#55/;;6;38I./3,6T386>,-# 4 print?!'2>/;T6 As ,6 /=I$T/ BB Cn'9 p#0 status5-10 D D else 4 dcb$erial(-1Blen)th5siEeo?!dcb$erial2arams#0 i? !B:et1omm$tate!h$erial9 Fdcb$erial2arams## 4 print?!'/rror )et $tatusBBCn'#0 status5-20 D dcb$erial2arams(Baud;ate51B;3GH000 dcb$erial2arams(B te$iEe5"0 dcb$erial2arams($topBits56,/$T62BIT0 dcb$erial2arams(2arit 5,62+;ITI0 status500 D return!status#0 D

Cdigo Fuente para Windows

Protocolos de Comunicacin 2012

// $eria una ?uncion de acuerdo a articulo de J1K char *rec3com1har!# 4 -W6;- dwB tes;ead51 0 char sEBu??J2K 5 4090D0 // debe almacenar los datos char n510 // 1antidad de datos rL char *pBu??5,>..0 // 2untero a un bu? para de%ol%er i?!B;ead8ile!h$erial9 sEBu??9 n9 FdwB tes;ead9 ,>..## 4 // /rror occurred( ;eport to user pBu??5,>..0 print?!'Ad '9:et.ast/rror!##0 D return !pBu??#0 D int en%3com!char *data# 4 -W6;- dwB tesWrite 5 00 char sEBu??J102MK9 n510 strcp !FsEBu??J0K9data#0 n5strlen!FsEBu??J0K#0 sEBu??J1K50L000 Write8ile!h$erial9 sEBu??9 n9 FdwB tesWrite9 ,>..#0 return 00 D int main!%oid# 4 char c9 *pbu??9bu??J20K0 print?!'-- TTI - B+$I16 1(0-jhuircan 2011--Cn'#0 print?!'-- InicialiEando 2uerto --Cn'#0 i?!Binit3com!## 4 print?!'-- 2uerto 1on?i)urado --Cn'#0 print?!'-- 2uerto +bierto --Cn'#0 while!1# 4 // pbu??5rec3com1har!#0 // .ectura deshabilidada N para rL i?!Obhit!## 4 c5)etch!#0 putchar!c#0 i?!c550L1b# breaO0 en%3com!Fc#0 c500 D D 1lose*andle!h$erial#0 print?!'2uerto 1erradoCn'#0 print?!'2resione 1ualPuier TeclaCn'#0 D )etch!#0 return 00 D

El cdigo est hecho para enviar datos por el puerto. Para recibir se debe deshabilitar el comentario indicado. Sin embargo, el programa quedara trabado para enviar debido a que la funcin de recepcin queda en espera. De acuerdo a lo indicado por Bayer, debiera utilizarse un mecanismo para realizar un timeout.

Cdigo Fuente para Windows

Protocolos de Comunicacin 2012

$e)unda %ersin de cdi)o


Este cdigo fue desarrollado por J. Rodrguez, se divide en 4 archivos bsicos, el primero es el serie(cpp, el cual contiene las funciones bsicas, serie(h el archivo de cabecera respectivo y dos cdigos bsicos uno pare enviar (en%iar(cpp) y el otro para recibir (recibir(cpp). El cdigo permite enviar un carcter pulsado, pero usa la consola de Windows. El cdigo fue realizado para ser compilado por MinGW Developer Studio, Studio en modo proyecto.
/*------------------------------------------------------------------*/ /* >216 I1+I - -epartamento de /lectrnica +utomtica */ /*------------------------------------------------------------------*/ /* serie(cppQ 7anejo comunicaciones serie */ /* */ /* +utorQ RosS +ntonio ;odrT)ueE 7ondSjar */ /* 8echaQ 12/11/0M */ /* @ersinQ 1(0 */ /*------------------------------------------------------------------*/ &include 'serie(h' *+,-./ 6pen$erial2ort! char *ps2ort9 -W6;- dwBaud;ate9 BIT/ bB te$iEe9 BIT/ b2arit 9 BIT/ b$topBits9 -W6;- Timeout // // // // // // '1671'9'1672' 1B;3GH009 1B;31G200( 1B;3UH000 V9" ,62+;ITI9 /@/,2+;ITI9 6--2+;ITI 6,/$T62BIT9 6,/U$T62BIT$9 TW6$T62BIT$ Timeout

# 4 *+,-./ h2ort0 -1B dcb2ort0 1677TI7/6>T$ commTimeouts0 -W6;- dw/rror0 // 6pen $erial 2ort h2ort51reate8ile! ps2ort9 :/,/;I13;/+- < 09 ,>..9 62/,3/=I$TI,:9 09 ,>..#0 // // // // port handler 2ort con?i)uration 2ort Timeouts /rror code

// pointer to name o? the ?ile :/,/;I13W;IT/9 // access !read-write# mode // share modeQ 0 the object cannot be share // pointer to securit attributesQ ,>.. the handle cannot be inherited // how to createQ 1omL eList // ?ile/port attributes // handle to ?ile/port with attributes to cop

// I? the ?unction ?ails9 the return %alue is I,@+.I-3*+,-./3@+.>/ i? ! h2ort 55 I,@+.I-3*+,-./3@+.>/ # 4 dw/rror 5 :et.ast/rror !#0 return h2ort0 D // $et 2ort 1on?i)uration 8ill7emor !Fdcb2ort9 siEeo?!dcb2ort#9 0#0 // -elete -1B con?i)uration dcb2ort(-1Blen)th 5 siEeo?!dcb2ort#0 // 1urrent -1B in use ?or the communications port :et1omm$tate !h2ort9 Fdcb2ort#0 // >pdate -1B with new parameters dcb2ort(Baud;ate 5 dwBaud;ate0 dcb2ort(B te$iEe 5 bB te$iEe0 dcb2ort(2arit 5 b2arit 0 dcb2ort($topBits 5 b$topBits0 // 8iLed parameters !-isable =6,-=688 and modem handshaOe# dcb2ort(?Binar 5 T;>/0 // Binar mode0 no /68 checO dcb2ort(?2arit 5 T;>/0 // /nable parit checOin) dcb2ort(?6utL1ts8low 5 8+.$/0 // ,o 1T$ output ?low control dcb2ort(?6utL-sr8low 5 8+.$/0 // ,o -$; output ?low control dcb2ort(?-tr1ontrol 5 -T;316,T;6.3/,+B./0 // -T; ?low control t pe // 8lush error code

Cdigo Fuente para Windows

Protocolos de Comunicacin 2012

dcb2ort(?-sr$ensiti%it 5 8+.$/0 dcb2ort(?T=1ontinue6n=o?? 5 T;>/0 dcb2ort(?6ut= 5 8+.$/0 dcb2ort(?In= 5 8+.$/0 dcb2ort(?/rror1har 5 8+.$/0 dcb2ort(?,ull 5 8+.$/0 dcb2ort(?;ts1ontrol 5 ;T$316,T;6.3/,+B./0 dcb2ort(?+bort6n/rror 5 8+.$/0 // $et new con?i)uration i? !B$et1omm$tate !h2ort9 Fdcb2ort## 4 dw/rror 5 :et.ast/rror !#0 1lose$erial2ort!h2ort#0 h2ort 5 I,@+.I-3*+,-./3@+.>/0 return h2ort0 D

// // // // // // // // // //

;aises the -T; line when the de%ice is opened -$; sensiti%it =688 continues TL ,o =6,/=688 out ?low control ,o =6,/=688 in ?low control -isable error replacement -isable null strippin) ;T$ ?low control ;aises the ;T$ line when the de%ice is opened -o not abort reads/writes on error

// 8lush error code

// $et 2ort Timeouts // Timeouts preparation 76;/ I,86;7+TI6, I, WI,W2 +2IQ 1677TI7/6>T$ commTimeouts(;eadInter%alTimeout 5 00 // $peci?ies the maLimum time9 in milliseconds9 allowed to elapse // between the arri%al o? two characters on the communications line // + %alue o? Eero indicates that inter%al time-outs are not used( commTimeouts(;eadTotalTimeout7ultiplier 5 U00 // $peci?ies the multiplier9 in milliseconds9 used to // calculate the total time-out period ?or read operations the rePuested number o? b tes to be read(

// 8or each read operation9 this %alue is multiplied b

commTimeouts(;eadTotalTimeout1onstant 5Timeout0 // $peci?ies the constant9 in milliseconds9 used to // calculate the total time-out period ?or read operations commTimeouts(WriteTotalTimeout7ultiplier 5 100 // $peci?ies the multiplier9 in milliseconds9 used to // calculate the total time-out period ?or write operation // 8or each write operation9 this %alue is multiplied b the number o? b tes to be written(

commTimeouts(WriteTotalTimeout1onstant 5 10000 // $peci?ies the constant9 in milliseconds9 used to // calculate the total time-out period ?or write operations // $ee de winW2 api ?or more in?ormation $et Timeouts // 8lush error code

i? !B$et1ommTimeouts !h2ort9 FcommTimeouts## 4 dw/rror 5 :et.ast/rror !#0 1lose$erial2ort!h2ort#0 h2ort 5 I,@+.I-3*+,-./3@+.>/0 return h2ort0 D return h2ort0 D

B66. $erial$endB te!*+,-./ h2ort9 BIT/ b te# 4 B66. b;es0 -W6;- dw/rror9 dw,umB tesWritten500 b;es5Write8ile! h2ort9 Fb te9 19 Fdw,umB tesWritten9 ,>.. #0 i? !!Bb;es#<<!dw,umB tesWrittenB51##4 dw/rror 5 :et.ast/rror !#0 D return b;es0 D // // // // // handle to ?ile or serial port to write to pointer to data to write to ?ile number o? b tes to write pointer to number o? b tes written ,>.. // 8lush error code

Cdigo Fuente para Windows

Protocolos de Comunicacin 2012

B66. $erial;ecei%eB te!*+,-./ h2ort9 BIT/ *pb te9 B66. *pTimeout# 4 B66. b;es0 -W6;- dw/rror9 lp,umber6?B tes;ead500 *pTimeout58+.$/0 b;es5;ead8ile! h2ort9 // handle o? ?ile or serial port to read pb te9 // address o? bu??er that recei%es data 19 // number o? b tes to read Flp,umber6?B tes;ead9 // address o? number o? b tes read ,>.. // ,>.. #0 i? !Bb;es# 4 dw/rror 5 :et.ast/rror !#0 D i? !!b;es#FF!lp,umber6?B tes;ead550##4 *pTimeout 5 T;>/0 D return b;es0 D // 8lush error code

B66. 1lose$erial2ort!*+,-./ h2ort#4 B66. b;es0 -W6;- dw/rror0 b;es51lose*andle!h2ort#0 i? !Bb;es# 4 dw/rror 5 :et.ast/rror !#0 D return b;es0 D

// 8lush error code

Se lista el cdigo fuente para enviar correspondiente a un archivo en%iar(cpp( Este programa llama a la funcin 6pen$erial2ort y configura de una vez el puerto. A travs de )etchar lee el teclado y enva el cdigo de la tecla usando la funcin $erial$endB te.
&include 'serie(h' &include 'windows(h' &include 'stdio(h' int main!#4 *+,-./ h2ort0 B66. b;es0 char c0 h2ort56pen$erial2ort!'1671'91B;3GH009"9,62+;ITI9TW6$T62BIT$9U000#0 i? !h2ort55I,@+.I-3*+,-./3@+.>/# 4 print?!'/rror abriendo puerto com1'#0 return 10 D while !1# 4 c5)etchar!#0 b;es5$erial$endB te!h2ort9c#0 i? !Bb;es# 4 print?!'/rror escribiendo en puerto com1'#0 return 10 D i? !c55XLX# 4 breaO0 D D 1lose$erial2ort!h2ort#0 D

Cdigo Fuente para Windows

Protocolos de Comunicacin 2012

Se lista el cdigo para recibir, en este caso se inicializa el puerto serie, a travs de un loop se ejecuta la funcin $erial;ecei%eB te, la cual espera el dato un tiempo y luego sale(
&include 'serie(h' &include 'windows(h' &include 'stdio(h' int main!#4 *+,-./ h2ort0 B66. b;es0 BIT/ b te0 B66. timeout0 h2ort56pen$erial2ort!'167M'91B;3GH009"9,62+;ITI9TW6$T62BIT$9U000#0 i? !h2ort55I,@+.I-3*+,-./3@+.>/# 4 print?!'/rror abriendo puerto comM'#0 return 10 D while!1#4 b;es5$erial;ecei%eB te!h2ort9Fb te9Ftimeout#0 i? !Bb;es# 4 breaO0 D i? !timeout#4 print?!'Cn---YtimeoutCn'#0 D else 4 putchar!b te#0 D D i? !Bb;es# 4 print?!'/rror le endo de puerto comM'#0 return 10 D 1lose$erial2ort!h2ort#0 return 00 D

$imilitudes

di?erencias en los cdi)os .istados

Ambos cdigos listados usan las mismas funciones (solo hay cambio de nombre). En el caso de la segunda aplicacin, se encapsula el manejo de las funciones del puerto en el archivo serie(cpp. Se incorporan funciones para el manejo del timeout. Bayer (2008) hace referencia a este aspecto pero no lo revisa extensamente. Esto es importante ya que permite no dejar la funcin de lectura en permanente ejecucin. El cdigo realizado por jhuircan puede ser modificado incorporando el timeout, esto ser realiza agregando el siguiente cdigo en la funcin de inicializacin init3com!#.
commTimeouts(;eadInter%alTimeout 5 10 commTimeouts(;eadTotalTimeout7ultiplier 5 100 commTimeouts(;eadTotalTimeout1onstant 5 1000 commTimeouts(WriteTotalTimeout7ultiplier 5 100 commTimeouts(WriteTotalTimeout1onstant 5 10000 $et1ommTimeouts !h$erial9 FcommTimeouts#0

;e?erencias
[1] Robertson Bayer, Windows Serial Port Programming, March 30, 2008

[2] Allen Denver, Serial Communications in Win32, Microsoft Windows Developer Support, December 11, 1995.

Cdigo Fuente para Windows

Protocolos de Comunicacin 2012

Cdigo Fuente para Windows

Protocolos de Comunicacin 2012

También podría gustarte