
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
MÊ]WZJ  ã               @   sT   d dl Z d dlZd dlmZ d dlZd dlmZmZmZmZm	Z	 G dd„ deƒZ
dS )é    N)Úwin32)Ú
SerialBaseÚSerialExceptionÚto_bytesÚportNotOpenErrorÚwriteTimeoutErrorc                   s  e Zd ZdZdIZ‡ fdd„Zdd„ Zdd„ Zdd„ Zdd„ Z	e
dd„ ƒZdJd d!„Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Ze
d2d3„ ƒZe
d4d5„ ƒZe
d6d7„ ƒZe
d8d9„ ƒZdKd<d=„ZdLd?d@„Ze
dAdB„ ƒZdCdD„ ZdEdF„ ZdGdH„ Z‡  ZS )MÚSerialz5Serial port implementation for Win32 based on ctypes.é2   éK   én   é†   é–   éÈ   é,  éX  é°  é  é`	  éÀ  é€%  é K  é –  é á  é Â c                s(   d | _ d | _d | _tt| ƒj||Ž d S )N)Ú_port_handleÚ_overlapped_readÚ_overlapped_writeÚsuperr   Ú__init__)ÚselfÚargsÚkwargs)Ú	__class__© ú!/usr/lib/python3.6/serialwin32.pyr      s    zSerial.__init__c             C   s�  | j dkrtdƒ‚| jr tdƒ‚| j}y.|jƒ jdƒrRt|dd… ƒdkrRd| }W n tk
rh   Y nX tj	|tj
tjB ddtjtjtjB dƒ| _| jtjkr¼d| _td	j| jtjƒ ƒƒ‚yštjƒ | _tjdd
ddƒ| j_tjƒ | _tjddddƒ| j_tj| jddƒ tjƒ | _tj| jtj| jƒƒ | jƒ  tj | jtj!tj"B tj#B tj$B ƒ W n.   y| j%ƒ  W n   Y nX d| _‚ Y nX d| _dS )zx        Open port with current settings. This may throw a SerialException
        if the port cannot be opened.
        Nz.Port must be configured before it can be used.zPort is already open.ZCOMé   é   z\\.\r   zcould not open port {!r}: {!r}é   i   T)&Z_portr   Úis_openÚnameÚupperÚ
startswithÚintÚ
ValueErrorr   Z
CreateFileZGENERIC_READZGENERIC_WRITEZOPEN_EXISTINGÚFILE_ATTRIBUTE_NORMALZFILE_FLAG_OVERLAPPEDr   ZINVALID_HANDLE_VALUEÚformatZportstrÚctypesÚWinErrorZ
OVERLAPPEDr   ZCreateEventÚhEventr   Ú	SetupCommÚCOMMTIMEOUTSÚ_orgTimeoutsZGetCommTimeoutsÚbyrefÚ_reconfigure_portÚ	PurgeCommÚPURGE_TXCLEARÚPURGE_TXABORTÚPURGE_RXCLEARÚPURGE_RXABORTÚ_close)r   Zportr#   r#   r$   Úopen!   sR    
"




zSerial.openc             C   sÎ  | j stdƒ‚tjƒ }| jdkr"n*| jdkr6tj|_ntt| jd ƒdƒ|_	| jdkrv| j
dk	rvtt| j
d ƒdƒ|_| jdkr‚n*| jdkr–tj|_ntt| jd ƒdƒ|_tj| j tj|ƒƒ tj| j tjƒ tjƒ }tj| j tj|ƒƒ | j|_| jtjk�r
d|_nR| jtjk�r d|_n<| jtjk�r6d|_n&| jtjk�rLd	|_ntd
j| jƒƒ‚| jtj k�rztj!|_"d|_#nˆ| jtj$k�r˜tj%|_"d|_#nj| jtj&k�r¶tj'|_"d|_#nL| jtj(k�rÔtj)|_"d|_#n.| jtj*k�ròtj+|_"d|_#ntdj| jƒƒ‚| j,tj-k�rtj.|_/n@| j,tj0k�r2tj1|_/n(| j,tj2k�rJtj3|_/ntdj| j,ƒƒ‚d|_4| j5dk�rž| j6�r~tj7|_8n| j9�rŒtj:ntj;|_8| j6|_<n¢| j5j=�sºtdj| j5j=ƒƒ‚| j5j>�rÖtdj| j5j>ƒƒ‚| j5j?dk	�rötdj| j5j?ƒƒ‚| j5j@dk	�rtdj| j5j@ƒƒ‚| j5jA�r2tdj| j5jAƒƒ‚tjB|_8d|_<| jC�rRtjD|_En| jF�r`tjGntjH|_E| jC|_I| jJ|_K| jJ|_Ld|_Md|_Nd|_OtjP|_QtjR|_StjT| j tj|ƒƒ�sÊtdjtjUƒ ƒƒ‚dS )z,Set communication parameters on opened port.z'Can only operate on a valid port handleNr   iè  r'   é   é   é   r&   z%Unsupported number of data bits: {!r}zUnsupported parity mode: {!r}z%Unsupported number of stop bits: {!r}z:Unsupported value for RS485Settings.rts_level_for_tx: {!r}z:Unsupported value for RS485Settings.rts_level_for_rx: {!r}z9Unsupported value for RS485Settings.delay_before_tx: {!r}z9Unsupported value for RS485Settings.delay_before_rx: {!r}z2Unsupported value for RS485Settings.loopback: {!r}zCCannot configure port, something went wrong. Original message: {!r})Vr   r   r   r4   Z_timeoutZMAXDWORDZReadIntervalTimeoutÚmaxr,   ZReadTotalTimeoutConstantZ_inter_byte_timeoutÚ_write_timeoutZWriteTotalTimeoutConstantÚSetCommTimeoutsr0   r6   ZSetCommMaskZEV_ERRZDCBZGetCommStateZ	_baudrateZBaudRateZ	_bytesizeÚserialZFIVEBITSZByteSizeZSIXBITSZ	SEVENBITSZ	EIGHTBITSr-   r/   Z_parityZPARITY_NONEZNOPARITYZParityZfParityZPARITY_EVENZ
EVENPARITYZ
PARITY_ODDZ	ODDPARITYZPARITY_MARKZ
MARKPARITYZPARITY_SPACEZSPACEPARITYZ	_stopbitsZSTOPBITS_ONEZ
ONESTOPBITZStopBitsZSTOPBITS_ONE_POINT_FIVEZONE5STOPBITSZSTOPBITS_TWOZTWOSTOPBITSZfBinaryZ_rs485_modeZ_rtsctsZRTS_CONTROL_HANDSHAKEZfRtsControlÚ
_rts_stateZRTS_CONTROL_ENABLEZRTS_CONTROL_DISABLEZfOutxCtsFlowZrts_level_for_txZrts_level_for_rxZdelay_before_txZdelay_before_rxZloopbackZRTS_CONTROL_TOGGLEZ_dsrdtrZDTR_CONTROL_HANDSHAKEZfDtrControlÚ
_dtr_stateZDTR_CONTROL_ENABLEZDTR_CONTROL_DISABLEZfOutxDsrFlowZ_xonxoffZfOutXZfInXZfNullZ
fErrorCharZfAbortOnErrorZXONZXonCharZXOFFZXoffCharZSetCommStater1   )r   ZtimeoutsZcomDCBr#   r#   r$   r7   b   s¾    














zSerial._reconfigure_portc             C   s|   | j dk	rxtj| j | jƒ | jdk	r@| jƒ  tj| jjƒ d| _| jdk	rf| j	ƒ  tj| jjƒ d| _tj| j ƒ d| _ dS )zinternal close port helperN)
r   r   rD   r5   r   Úcancel_readZCloseHandler2   r   Úcancel_write)r   r#   r#   r$   r=   ã   s    


zSerial._closec             C   s   | j r| jƒ  d| _ dS )z
Close portFN)r(   r=   )r   r#   r#   r$   Úcloseó   s    zSerial.closec             C   s:   t jƒ }t jƒ }t j| jtj|ƒtj|ƒƒs4tdƒ‚|jS )z9Return the number of bytes currently in the input buffer.zcall to ClearCommError failed)	r   ÚDWORDÚCOMSTATÚClearCommErrorr   r0   r6   r   ÚcbInQue)r   ÚflagsÚcomstatr#   r#   r$   Ú
in_waitingû   s
    zSerial.in_waitingr'   c       
      C   sT  | j s
t‚|dk�rFtj| jjƒ tjƒ }tjƒ }tj| j	t
j|ƒt
j|ƒƒs`tdjt
jƒ ƒƒ‚| jdkrvt|j|ƒn|}|dk�r>t
j|ƒ}tjƒ }tj| j	||t
j|ƒt
j| jƒƒ}| rätjƒ tjtjfkrätdjt
jƒ ƒƒ‚tj| j	t
j| jƒt
j|ƒdƒ}|�s,tjƒ tjk�r,tdjt
jƒ ƒƒ‚|jd|j… }	ntƒ }	ntƒ }	t|	ƒS )zÑ        Read size bytes from the serial port. If a timeout is set it may
        return less characters as requested. With no timeout it will block
        until the requested number of bytes is read.
        r   zClearCommError failed ({!r})zReadFile failed ({!r})Tz!GetOverlappedResult failed ({!r})N)r(   r   r   Z
ResetEventr   r2   rK   rL   rM   r   r0   r6   r   r/   r1   ZtimeoutÚminrN   Zcreate_string_bufferZReadFileÚGetLastErrorZERROR_SUCCESSÚERROR_IO_PENDINGÚGetOverlappedResultÚERROR_OPERATION_ABORTEDÚrawÚvalueÚbytes)
r   ÚsizerO   rP   ÚnZbufÚrcZread_okZ	result_okÚreadr#   r#   r$   r]     s@    



zSerial.readc             C   s¼   | j s
t‚t|ƒ}|r´tjƒ }tj| j|t|ƒtj	|ƒ| j
ƒ}| rdtjƒ tjkrdtdjtjƒ ƒƒ‚| jdkr®tj| j| j
tj	|ƒdƒ}tjƒ tjkrœ|jS |jt|ƒkr®t‚|jS dS dS )z2Output the given byte string over the serial port.zWriteFile failed ({!r})r   TN)r(   r   r   r   rK   Z	WriteFiler   Úlenr0   r6   r   rS   rT   r   r/   r1   rC   rU   rV   rX   r   )r   Údatar[   Úerrr#   r#   r$   Úwrite-  s      
zSerial.writec             C   s   x| j rtjdƒ qW dS )zb        Flush of file like objects. In this case, wait until all data
        is written.
        gš™™™™™©?N)Úout_waitingÚtimeZsleep)r   r#   r#   r$   ÚflushG  s    zSerial.flushc             C   s$   | j s
t‚tj| jtjtjB ƒ dS )z9Clear input buffer, discarding all that is in the buffer.N)r(   r   r   r8   r   r;   r<   )r   r#   r#   r$   Úreset_input_bufferR  s    zSerial.reset_input_bufferc             C   s$   | j s
t‚tj| jtjtjB ƒ dS )zs        Clear output buffer, aborting the current output and discarding all
        that is in the buffer.
        N)r(   r   r   r8   r   r9   r:   )r   r#   r#   r$   Úreset_output_bufferX  s    zSerial.reset_output_bufferc             C   s.   | j s
t‚| jrtj| jƒ ntj| jƒ dS )zBSet break: Controls TXD. When active, to transmitting is possible.N)r(   r   Z_break_stater   ZSetCommBreakr   ZClearCommBreak)r   r#   r#   r$   Ú_update_break_statea  s
    zSerial._update_break_statec             C   s,   | j rtj| jtjƒ ntj| jtjƒ dS )z)Set terminal status line: Request To SendN)rF   r   ÚEscapeCommFunctionr   ZSETRTSZCLRRTS)r   r#   r#   r$   Ú_update_rts_statej  s    zSerial._update_rts_statec             C   s,   | j rtj| jtjƒ ntj| jtjƒ dS )z-Set terminal status line: Data Terminal ReadyN)rG   r   rh   r   ZSETDTRZCLRDTR)r   r#   r#   r$   Ú_update_dtr_stateq  s    zSerial._update_dtr_statec             C   s,   | j s
t‚tjƒ }tj| jtj|ƒƒ |jS )N)	r(   r   r   rK   ZGetCommModemStatusr   r0   r6   rX   )r   Ústatr#   r#   r$   Ú_GetCommModemStatusx  s
    zSerial._GetCommModemStatusc             C   s   t j| jƒ @ dkS )z(Read terminal status line: Clear To Sendr   )r   Z	MS_CTS_ONrl   )r   r#   r#   r$   Úcts  s    z
Serial.ctsc             C   s   t j| jƒ @ dkS )z)Read terminal status line: Data Set Readyr   )r   Z	MS_DSR_ONrl   )r   r#   r#   r$   Údsr„  s    z
Serial.dsrc             C   s   t j| jƒ @ dkS )z)Read terminal status line: Ring Indicatorr   )r   Z
MS_RING_ONrl   )r   r#   r#   r$   Úri‰  s    z	Serial.ric             C   s   t j| jƒ @ dkS )z)Read terminal status line: Carrier Detectr   )r   Z
MS_RLSD_ONrl   )r   r#   r#   r$   ÚcdŽ  s    z	Serial.cdé   Nc             C   s    |dkr|}t j| j||ƒ dS )z�        Recommend a buffer size to the driver (device driver can ignore this
        value). Must be called before the port is opended.
        N)r   r3   r   )r   Zrx_sizeZtx_sizer#   r#   r$   Úset_buffer_size•  s    zSerial.set_buffer_sizeTc             C   s4   | j s
t‚|r tj| jtjƒ ntj| jtjƒ dS )a*          Manually control flow - when software flow control is enabled.
        This will do the same as if XON (true) or XOFF (false) are received
        from the other device and control the transmission accordingly.
        WARNING: this function is not portable to different platforms!
        N)r(   r   r   rh   r   ZSETXONZSETXOFF)r   Úenabler#   r#   r$   Úset_output_flow_controlž  s
    zSerial.set_output_flow_controlc             C   s:   t jƒ }t jƒ }t j| jtj|ƒtj|ƒƒs4tdƒ‚|jS )z0Return how many bytes the in the outgoing bufferzcall to ClearCommError failed)	r   rK   rL   rM   r   r0   r6   r   ZcbOutQue)r   rO   rP   r#   r#   r$   rb   ¬  s
    zSerial.out_waitingc             C   sR   t jƒ }t j| jtj|ƒtj|ƒdƒ}| rNt jƒ t jt jfkrNt j	| j|ƒ dS )zACancel a blocking read operation, may be called from other threadFN)
r   rK   rU   r   r0   r6   rS   rT   ZERROR_IO_INCOMPLETEZ
CancelIoEx)r   Z
overlappedr\   r`   r#   r#   r$   Ú_cancel_overlapped_ioµ  s    zSerial._cancel_overlapped_ioc             C   s   | j | jƒ dS )zACancel a blocking read operation, may be called from other threadN)ru   r   )r   r#   r#   r$   rH   Â  s    zSerial.cancel_readc             C   s   | j | jƒ dS )zBCancel a blocking write operation, may be called from other threadN)ru   r   )r   r#   r#   r$   rI   Æ  s    zSerial.cancel_write)r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r'   )rq   N)T) Ú__name__Ú
__module__Ú__qualname__Ú__doc__Z	BAUDRATESr   r>   r7   r=   rJ   ÚpropertyrQ   r]   ra   rd   re   rf   rg   ri   rj   rl   rm   rn   ro   rp   rr   rt   rb   ru   rH   rI   Ú__classcell__r#   r#   )r"   r$   r      s:    A 	
)		
	
	r   )r0   rc   rE   r   Zserial.serialutilr   r   r   r   r   r   r#   r#   r#   r$   Ú<module>   s
   