dbfdg 3 M]W(@slddlZddlZddlZddlZddlZy ddlZWnek rRddljZYnXy ddl Z Wnek r|ddl Z YnXddl Z ddl m Z mZmZmZmZejejejejdZdZdZdZdZdZd Zd Zd Zd Zd Z dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3dZ4d Z5d!Z6d"Z7d#Z8d$Z9d%Z:d&Z;d'Zd*Z?d+Z@d,ZAd-ZBd.ZCe,e8e-e9e.e:e/e;e0ee3e?e4e@e5eAe6eBe7eCi ZDdZEdZFdZGdZHdZIdZJdZKdZLdZMdZNd ZOd!ZPd"ZQd/ZRd0ZSd1ZTd2ZUd3ZVd4ZWd5ZXd6ZYd7ZZd8Z[d9Z\d:Z]d;Z^de jod;e jpd?iZqerd@dAeqjsDZte jud=e jvd>e jwdsrKccs|]\}}||fVqdS)NrF)rGrHrIrFrFrJrKs REQUESTEDACTIVEINACTIVEREALLY_INACTIVEc@s*eZdZdZd ddZddZddZdS) TelnetOptionz@Manage a single telnet option, keeps track of DO/DONT WILL/WONT.Nc Cs@||_||_||_||_||_||_||_||_d|_| |_ dS)a; Initialize option. :param connection: connection used to transmit answers :param name: a readable name for debug outputs :param send_yes: what to send when option is to be enabled. :param send_no: what to send when option is to be disabled. :param ack_yes: what to expect when remote agrees on option. :param ack_no: what to expect when remote disagrees on option. :param initial_state: options initialized with REQUESTED are tried to be enabled on startup. use INACTIVE for all others. FN) connectionnameoptionsend_yessend_noack_yesack_nostateactiveactivation_callback) selfrQrRrSrTrUrVrWZ initial_staterZrFrFrJ__init__s zTelnetOption.__init__cCs dj|dS)zString for debug outputsz{o.name}:{o.active}({o.state}))o)format)r[rFrFrJ__repr__szTelnetOption.__repr__cCs&||jkr|jtkr4t|_d|_|jdk r|jnt|jtkr@nh|jtkr|t|_|jj|j |j d|_|jdk r|jn,|jt kr|jj|j |j nt dj|nx||jkr"|jtkrt|_d|_nT|jtkrt|_|jj|j |j d|_n*|jtkrn|jt krnt dj|dS)zo A DO/DONT/WILL/WONT was received for this option, update state and answer when needed. TNzoption in illegal state {!r}F)rVrXrLrMrYrZrNrQtelnet_send_optionrTrSrOrU ValueErrorr^rW)r[commandrFrFrJprocess_incoming s<              zTelnetOption.process_incoming)N)__name__ __module__ __qualname____doc__r\r_rcrFrFrFrJrPs rPc@sLeZdZdZdddZddZddZd d ZeeZ dd d Z ddZ dS)TelnetSubnegotiationz A object to handle subnegotiation of options. In this case actually sub-sub options for RFC 2217. It is used to track com port options. NcCs4|dkr |}||_||_||_d|_||_t|_dS)N)rQrRrSvalue ack_optionrNrX)r[rQrRrSrjrFrFrJr\6szTelnetSubnegotiation.__init__cCs dj|dS)zString for debug outputs.z{sn.name}:{sn.state})Zsn)r^)r[rFrFrJr_@szTelnetSubnegotiation.__repr__cCsD||_t|_|jj|j|j|jjr@|jjjdj|j |jdS)z Request a change of the value. a request is sent to the server. if the client needs to know if the change is performed he has to check the state of this object. zSB Requesting {} -> {!r}N) rirLrXrQrfc2217_send_subnegotiationrSloggerrr^rR)r[rirFrFrJsetDs zTelnetSubnegotiation.setcCs$|jtkrtdj|j|jtkS)z{ Check if answer from server has been received. when server rejects the change, raise a ValueError. z%remote rejected value for option {!r})rXrOrar^rRrM)r[rFrFrJis_readyPs zTelnetSubnegotiation.is_readyrDcCsFtj|}x4tj|kr0tjd|jrPqWtdj|jdS)z Wait until the subnegotiation has been acknowledged or timeout. It can also throw a value error when the answer from the server does not match the value sent. g?z%timeout while waiting for option {!r}N)timesleeprnrr^rR)r[timeout timeout_timerFrFrJwait[s   zTelnetSubnegotiation.waitcCsN|j|dt|jkr t|_nt|_|jjrJ|jjjdj|j ||jdS)z Check an incoming subnegotiation block. The parameter already has cut off the header like sub option number and com port option value. NzSB Answer {} -> {!r} -> {}) rilenrMrXrOrQrlrr^rR)r[ suboptionrFrFrJ check_answeris z!TelnetSubnegotiation.check_answer)N)rD) rdrerfrgr\r_rmrnpropertyrYrsrvrFrFrFrJrh0s    rhcseZdZdZdMZfddZddZddZddZddZ e ddZ dNd d!Z d"d#Z d$d%Zd&d'Zd(d)Zd*d+Zd,d-Ze d.d/Ze d0d1Ze d2d3Ze d4d5Zd6d7Zd8d9Zd:d;Zdd?Zd@dAZdOdCdDZdEdFZdGdHZdIdJZ dKdLZ!Z"S)PSerialz|j?qWt@j@|j}xTt@j@|krt@jAdtBdd|DtBd d|DkrPPqPWtd!j||jr|jjCd"j|j!|jD|jEs|jF|jGs|jH|jI|jJWn|jKYnXdS)#zx Open port with current settings. This may throw a SerialException if the port cannot be opened. NFrDz.Port must be configured before it can be used.zPort is already open.rE)rqrCzCould not open port {}: {}z we-BINARYz we-RFC2217ECHOzwe-SGAzthey-SGAz they-BINARYz they-RFC2217baudratedatasizeparitystopsize)rrrrpurgecontrol)rrrT)targetz&pySerial RFC 2217 reader thread for {}g?css|] }|jVqdS)N)rY)rGr]rFrFrJrKszSerial.open..css|]}|jtkVqdS)N)rXrN)rGr]rFrFrJrKsz;Remote does not seem to support RFC2217 or BINARY mode {!r}zNegotiated options: {})LrlrrrZ_portris_opensocketZcreate_connectionfrom_urlZportstrrZ setsockoptZ IPPROTO_TCPZ TCP_NODELAY Exceptionr^Queuer threadingZLockrrPBINARYWILLWONTDODONTrNCOM_PORT_OPTIONrLrSGArrh SET_BAUDRATESERVER_SET_BAUDRATE SET_DATASIZESERVER_SET_DATASIZE SET_PARITYSERVER_SET_PARITY SET_STOPSIZESERVER_SET_STOPSIZEr PURGE_DATASERVER_PURGE_DATA SET_CONTROLSERVER_SET_CONTROLrupdaterrrrZThread_telnet_read_looprZ setDaemonZsetNamestartrXr`rTrSrorpsumr_reconfigure_portZ_dsrdtr_update_dtr_state_rtscts_update_rts_statereset_input_bufferreset_output_bufferclose)r[msgZmandadory_optionsrSrrrFrFrJopens~ $           &  z Serial.opencCs|jdkrtd|jdk r$tdd|jko8dknsNtdj|j|jdjt j d |j|jd jt j d |j |jd jt j d t |j |jd jt j d t|j|jj}|jr|jjdj|tj|j}xFtj|kr&tjdtdd|Dt|krPqWtdj||jrP|jjdj||jrj|jrjtdn2|jr~|jtn|jr|jtn |jtdS)z,Set communication parameters on opened port.NzCan only operate on open portsz(write_timeout is currently not supportedrrBr>zinvalid baudrate: {!r}rs!Irs!BrrzNegotiating settings: {}g?css|] }|jVqdS)N)rY)rGr]rFrFrJrK sz+Serial._reconfigure_port..z7Remote does not accept parameter change (RFC2217): {!r}zNegotiated settings: {}z-xonxoff and rtscts together are not supportedl)rrZ_write_timeoutNotImplementedErrorZ _baudraterar^rrmstructpackZ _bytesizeRFC2217_PARITY_MAPZ_parityRFC2217_STOPBIT_MAPZ _stopbitsvaluesrlrrorrprrtrrZ_xonxoffrfc2217_set_controlSET_CONTROL_USE_HW_FLOW_CONTROLSET_CONTROL_USE_SW_FLOW_CONTROLSET_CONTROL_USE_NO_FLOW_CONTROL)r[itemsrrrFrFrJrs8       zSerial._reconfigure_portc Csbd|_|jr6y|jjtj|jjWn YnX|jrX|jjdd|_tj dd|_dS)z Close portFNg333333?) rrZshutdownrZ SHUT_RDWRrrjoinrorp)r[rFrFrJrs  z Serial.closecCs.tj|}|jdkr$tdj|jyxtj|jdjD]\}}|dkrtj tj d|_ |j j t |d|j jdq:|dkrd|_q:|d krd|_q:|d krt|d|_q:td j|q:Wd|jkod knstd Wn2tk r }ztdj|WYdd}~XnX|j|jfS)zu extract host and port from an URL string, other settings are extracted an stored in instance Zrfc2217zqexpected a string in the form "rfc2217://:[?option[&option...]]": not starting with rfc2217:// ({!r})TloggingzpySerial.rfc2217rzenabled loggingZign_set_controlZ poll_modemrqzunknown option: {!r}izport not in range 0...65535zPexpected a string in the form "rfc2217://:[?option[&option...]]": {}N)urlparseZurlsplitschemerr^Zparse_qsZqueryrrZ basicConfigZ getLoggerrlZsetLevel LOGGER_LEVELSrrrfloatrraZportZhostname)r[ZurlpartsrSrerFrFrJr-s4     zSerial.from_urlcCs|js t|jjS)z9Return the number of bytes currently in the input buffer.)rrrqsize)r[rFrFrJ in_waitingRszSerial.in_waitingrCc Csl|js tt}y|jtn |jtdS)z[ Set break: Controls TXD. When active, to transmitting is possible. zset BREAK to {}rYinactiveN) rrrlrr^Z _break_staterSET_CONTROL_BREAK_ONSET_CONTROL_BREAK_OFF)r[rFrFrJ_update_break_states zSerial._update_break_statecCsL|js t|jr,|jjdj|jr$dnd|jr>|jtn |jtdS)z*Set terminal status line: Request To Send.z set RTS to {}rYrN) rrrlrr^Z _rts_staterSET_CONTROL_RTS_ONSET_CONTROL_RTS_OFF)r[rFrFrJrs zSerial._update_rts_statecCsL|js t|jr,|jjdj|jr$dnd|jr>|jtn |jtdS)z.Set terminal status line: Data Terminal Ready.z set DTR to {}rYrN) rrrlrr^Z _dtr_staterSET_CONTROL_DTR_ONSET_CONTROL_DTR_OFF)r[rFrFrJrs zSerial._update_dtr_statecCs|js tt|jt@S)z)Read terminal status line: Clear To Send.)rrboolget_modem_stateMODEMSTATE_MASK_CTS)r[rFrFrJctssz Serial.ctscCs|js tt|jt@S)z*Read terminal status line: Data Set Ready.)rrrrMODEMSTATE_MASK_DSR)r[rFrFrJdsrsz Serial.dsrcCs|js tt|jt@S)z*Read terminal status line: Ring Indicator.)rrrrMODEMSTATE_MASK_RI)r[rFrFrJrisz Serial.ricCs|js tt|jt@S)z*Read terminal status line: Carrier Detect.)rrrrMODEMSTATE_MASK_CD)r[rFrFrJcdsz Serial.cdcCst}d}z|xt|jry|jjd}WnTtjk r@wYn>tjk r|}z |jrj|jjdj |PWYdd}~XnX|sPxt |D]}|tkr|t krt }n|dk r||7}n |j j|q|t krd|t kr|dk r|t 7}n |j jt t}nb|tkrt}t}nL|tkr8|jt|d}t}n*|ttttfkrT|}t}n|j|t}q|tkr|j||t}qWqWWdd|_|jr|jjdXdS)zRead loop for the socket.Niz!socket error in reader thread: {}zread thread terminated)M_NORMALrrZrecvrrqr rlrr^rr M_IAC_SEENrZputSBrSE_telnet_process_subnegotiationrrrrr M_NEGOTIATE_telnet_process_command_telnet_negotiate_optionr)r[moderurrbytetelnet_commandrFrFrJrsZ          zSerial._telnet_read_loopcCs|jr|jjdj|dS)z1Process commands other than DO, DONT, WILL, WONT.zignoring Telnet command: {!r}N)rlr r^)r[rbrFrFrJrszSerial._telnet_process_commandcCstd}x&|jD]}|j|kr |j|d}q W|sp|tks@|tkrp|j|tkrPtnt||jrp|jj dj |dS)z&Process incoming DO, DONT, WILL, WONT.FTzrejected Telnet option: {!r}N) rrSrcrrr`rrrlr r^)r[rbrSknownitemrFrFrJrs   zSerial._telnet_negotiate_optioncCs\|ddtkr>|ddtkr\t|dkr\t|dd|_|jrZ|jjdj|jn|ddtkrt|dkrt|dd|_ |jr|jjdj|j t j d|_ n|ddt krd|_ np|ddtkrd |_ nXxr|jjD].}|j|ddkr|jt|dd PqW|jrX|jjd j|n|jrX|jjd j|d S) z;Process subnegotiation, the data between IAC SB and IAC SE.rrCrBrDzNOTIFY_LINESTATE: {}zNOTIFY_MODEMSTATE: {}g333333?TFNzignoring COM_PORT_OPTION: {!r}zignoring subnegotiation: {!r})rSERVER_NOTIFY_LINESTATErtordrrlrr^SERVER_NOTIFY_MODEMSTATErrorFLOWCONTROL_SUSPENDrFLOWCONTROL_RESUMErrrjrvrr )r[rur rFrFrJr-s,z%Serial._telnet_process_subnegotiationc Cs"|j|jj|WdQRXdS)zGinternal socket write with no data escaping. used to send telnet stuff.N)rrr)r[rrFrFrJ_internal_raw_writeMszSerial._internal_raw_writecCs|jtt||gdS)zSend DO, DONT, WILL, WONT.N)rrr)r[actionrSrFrFrJr`RszSerial.telnet_send_optioncCs6|jtt}|jtttt|gt|ttgdS)z%Subnegotiation of RFC2217 parameters.N) rrrrrrrlistr)r[rSrirFrFrJrkVs z"Serial.rfc2217_send_subnegotiationcCs$|jd}|j||j|jdS)z~ Send purge request to the remote. (PURGE_RECEIVE_BUFFER / PURGE_TRANSMIT_BUFFER / PURGE_BOTH_BUFFERS) rN)rrmrsr)r[rir rFrFrJr[s  zSerial.rfc2217_send_purgecCs6|jd}|j||jr&tjdn |j|jdS)z)transmit change of control line to remoterg?N)rrmrrorprsr)r[rir rFrFrJrds    zSerial.rfc2217_set_controlcCsdS)z` check if server is ready to receive data. block for some time when not. NrF)r[rFrFrJrfc2217_flow_server_readypsz Serial.rfc2217_flow_server_readycCs|jr||jtjkr||jr&|jjd|jttj|j}x a,%         C    rxc@sfeZdZdZdddZddZddZdd d Zdd dZddZ ddZ ddZ ddZ ddZ dS) PortManagerz This class manages the state of Telnet and RFC 2217. It needs a serial instance and a connection to work with. Connection is expected to implement a (thread safe) write function, that writes the string to the network. NcCs||_||_||_d|_t|_d|_d|_d|_d|_ d|_ t |dt t ttttt |dtt ttttt |dtttt ttt |dtt ttttt |dtttt ttt |d tt tttt|j t |d tttt tt|j g|_|jr|jjd x(|jD]}|jtkr|j|j|jqWdS) NFrrzwe-SGAzthey-SGAz we-BINARYz they-BINARYz we-RFC2217z they-RFC2217z*requesting initial Telnet/RFC 2217 options)serialrQrl_client_is_rfc2217rrrur modemstate_masklast_modemstate linstate_maskrPrrrrrrLrrNrr _client_okrrrXr`rTrS)r[Z serial_portrQrlrSrFrFrJr\s,   zPortManager.__init__cCs(d|_|jr|jjd|jdddS)a callback of telnet option. It gets called when option is activated. This one here is used to detect when the client agrees on RFC 2217. A flag is set so that other functions like check_modem_lines know if the client is OK. Tzclient accepts RFC 2217)force_notificationN)rrlrcheck_modem_lines)r[rFrFrJr s  zPortManager._client_okcCs|jjtt||gdS)zSend DO, DONT, WILL, WONT.N)rQrrr)r[rrSrFrFrJr`szPortManager.telnet_send_optionrcCs8|jtt}|jjtttt|gt|tt gdS)z&Subnegotiation of RFC 2217 parameters.N) rrrrQrrrrrr)r[rSrirFrFrJrks z'PortManager.rfc2217_send_subnegotiationFcCs|jjo t|jjotB|jjo&tB|jjo4tB}||j pBdA}|t@rV|t O}|t@rf|t O}|t@rv|t O}|t@r|t O}||j ks|r|jr||j@s|r|jtt||j@g|jr|jjdj||d@|_ dS)z read control lines from serial port and compare the last value sent to remote. send updates on changes. rzNOTIFY_MODEMSTATE: {}N)rZgetCTSrZgetDSRrZgetRIrZgetCDrrMODEMSTATE_MASK_CTS_CHANGEMODEMSTATE_MASK_DSR_CHANGEMODEMSTATE_MASK_RI_CHANGEMODEMSTATE_MASK_CD_CHANGErrrkrrrlrr^)r[r!Z modemstateZdeltasrFrFrJr"s&(zPortManager.check_modem_linesccs2x,t|D] }|tkr$tVtVq |Vq WdS)z This generator function is for the user. All outgoing data has to be properly escaped, so that no IAC character in the data stream messes up the Telnet state machine in the server. socket.sendall(escape(data)) N)rr)r[rr rFrFrJescape s zPortManager.escapeccsxt|D]}|jtkrN|tkr,t|_n |jdk rF|j|7_n|Vq |jtkr|tkr|jdk rz|j|7_n|Vt|_nl|tkrt|_t|_nT|tkr|j t |jd|_t|_n.|t t t tfkr||_t|_n|j|t|_q |jtkr |j|j|t|_q WdS)a Handle a bunch of incoming bytes. This is a generator. It will yield all characters not of interest for Telnet/RFC 2217. The idea is that the reader thread pushes data from the socket through this filter: for byte in filter(socket.recv(1024)): # do things like CR/LF conversion/whatever # and write data to the serial port serial.write(byte) (socket error handling code left as exercise for the reader) N)rrrrrrurrrrrrrrrr rrr)r[rr rFrFrJfilters8      zPortManager.filtercCs|jr|jjdj|dS)z1Process commands other than DO, DONT, WILL, WONT.zignoring Telnet command: {!r}N)rlr r^)r[rbrFrFrJrYsz#PortManager._telnet_process_commandcCstd}x&|jD]}|j|kr |j|d}q W|sp|tks@|tkrp|j|tkrPtnt||jrp|jj dj |dS)z&Process incoming DO, DONT, WILL, WONT.FTzrejected Telnet option: {!r}N) rrSrcrrr`rrrlr r^)r[rbrSr r rFrFrJr_s   z$PortManager._telnet_negotiate_optioncCs4 |ddtk r|jr*|jjdj||ddtkr|jj}y*tjd|dd\}|dkrj||j_WnBt k r}z&|jr|jj dj|||j_WYdd}~Xn(X|jr|jj d j|rd nd |jj|j t tjd|jj q0|ddtkr|jj}y,tjd |dd \}|dkr6||j_WnFt k r~}z(|jrf|jj dj|||j_WYdd}~Xn,X|jr|jj dj|rd nd |jj|j ttjd |jj q0|ddtkr|jj}y2tjd |dd d}|dkrt||j_WnFt k rX}z(|jr@|jj dj|||j_WYdd}~Xn,X|jr|jj dj|rvd nd |jj|j ttjd t|jj q0|ddtkr|jj}y2tjd |dd d}|dkrt||j_WnFt k r6}z(|jr|jj dj|||j_WYdd}~Xn,X|jrb|jj dj|rTd nd |jj|j ttjd t|jj q0|ddtkr|dd tkr|jjr|j tt n$|jj!r|j tt"n |j tt# q|dd t#kr,d|j_d|j_!|jr|jj d|j tt# q|dd t krjd|j_|jrZ|jj d|j tt  q|dd t"krd|j_!|jr|jj d|j tt" q|dd t$kr|jr|jj%d q|dd t&kr|jj'd|jr|jj d|j tt& q|dd t(krV|jj'd|jrF|jj d|j tt( q|dd t)kr|jr|jj%d q|dd t*kr|jj+d|jr|jj d|j tt*n|dd t,kr|jj+d|jr|jj d|j tt,n|dd t-kr(|jr|jj%dn~|dd t.krh|jj/d|jrZ|jj d |j tt.n>|dd t0k r|jj/d|jr|jj d!|j tt0 q0|ddt1kr|j t2t3dg q0|ddt4kr|jr|jj d"|j5dd# q0|ddt6kr8|jr.|jj d$d|_7 q0|ddt8krh|jr^|jj d%d|_7 q0|ddt9krt:|dd |_;|j r|jj d&j|j; q0|ddtkr|dd t?kr@|jj@|jr2|jj d(|j tAt?n|dd tBkr~|jjC|jrp|jj d)|j tAtBnn|dd tDkr|jj@|jjC|jr|jj d*|j tAtDn&|j r|jj d+jtE|ddn&|j r0|jj d,jtE|ddn|j r0|jj%d-j|dS).z;Process subnegotiation, the data between IAC SB and IAC SE.rrCzreceived COM_PORT_OPTION: {!r}rBs!Izfailed to set baud rate: {}Nz{} baud rate: {}rmrs!BrDzfailed to set data size: {}z{} data size: {}zfailed to set parity: {}z {} parity: {}zfailed to set stop bits: {}z{} stop bits: {}Fzchanged flow control to NoneTz changed flow control to XON/XOFFzchanged flow control to RTS/CTSz'requested break state - not implementedzchanged BREAK to activezchanged BREAK to inactivez%requested DTR state - not implementedzchanged DTR to activezchanged DTR to inactivez%requested RTS state - not implementedzchanged RTS to activezchanged RTS to inactivezrequest for modem state)r!ZsuspendZresumezline state mask: 0x{:02x}zmodem state mask: 0x{:02x}zpurge inz purge outz purge bothzundefined PURGE_DATA: {!r}zundefined COM_PORT_OPTION: {!r}zunknown subnegotiation: {!r})Frrlrr^rrrrunpackrar rrkrrrZbytesizerrrRFC2217_REVERSE_PARITY_MAPrrrstopbitsRFC2217_REVERSE_STOPBIT_MAPrrrSET_CONTROL_REQ_FLOW_SETTINGZxonxoffrrZrtsctsrrSET_CONTROL_REQ_BREAK_STATEr rZsetBreakrSET_CONTROL_REQ_DTRrZsetDTRrSET_CONTROL_REQ_RTSrZsetRTSrNOTIFY_LINESTATEr rrr"rrrSET_LINESTATE_MASKrrSET_MODEMSTATE_MASKrrrrrrrPURGE_BOTH_BUFFERSr)r[ruZbackuprrrrr-rFrFrJrrsV    " " "                                  z*PortManager._telnet_process_subnegotiation)N)r)F)rdrerfrgr\r r`rkr"r(r)rrrrFrFrFrJrs #  $;r__main__zrfc2217://localhost:7000iz{} z write... shello z read: {} )rrrrror ImportErrorZ urllib.parseparserZqueuerZserial.serialutilrrrrrDEBUGINFOZWARNINGZERRORrrZNOPZDMZBRKZIPZAOZAYTZECZELZGArrrrrrrrrrrrrrrrr3rrrr4r5rrrrrrr rZSERVER_FLOWCONTROL_SUSPENDZSERVER_FLOWCONTROL_RESUMEZSERVER_SET_LINESTATE_MASKZSERVER_SET_MODEMSTATE_MASKrZRFC2217_ANSWER_MAPr/rrrr0rrr1rrr2rrZSET_CONTROL_REQ_FLOW_SETTING_INZ"SET_CONTROL_USE_NO_FLOW_CONTROL_INZ!SET_CONTROL_USE_SW_FLOW_CONTOL_INZ!SET_CONTROL_USE_HW_FLOW_CONTOL_INZ SET_CONTROL_USE_DCD_FLOW_CONTROLZ SET_CONTROL_USE_DTR_FLOW_CONTROLZ SET_CONTROL_USE_DSR_FLOW_CONTROLZLINESTATE_MASK_TIMEOUTZLINESTATE_MASK_SHIFTREG_EMPTYZLINESTATE_MASK_TRANSREG_EMPTYZLINESTATE_MASK_BREAK_DETECTZLINESTATE_MASK_FRAMING_ERRORZLINESTATE_MASK_PARTIY_ERRORZLINESTATE_MASK_OVERRUN_ERRORZLINESTATE_MASK_DATA_READYrrrrr'r&r%r$rrr6Z PARITY_NONEZ PARITY_ODDZ PARITY_EVENZ PARITY_MARKZ PARITY_SPACErdictrr,Z STOPBITS_ONEZSTOPBITS_ONE_POINT_FIVEZ STOPBITS_TWOrr.rrrrLrMrNrOobjectrPrhrxrrdsyssstdoutrr^flushrrrFrFrFrJ=s.      FG,