2016年10月24日 星期一

[Python]Python中各種溝通控制介面介紹 UART(Serial) I2C SPI GPIB Socket等等

PySerial(UART)
import serial
#串口打开方式:
#1)带串口号和波特率
ser. interCharTimeout #字符間隔超時
print ser.portstr #能看到第一個serial的標示,windows下是COM1
ser #來查看當前serial的狀態


serial.Serial類——原生端口
class serial.Serial
{
    __init__(port=None, baudrate=9600, bytesize=EIGHTBITS,parity=PARITY_NONE, stopbits=STOPBITS_ONE, timeout=None, xonxoff=False, rtscts=False, writeTimeout=None, dsrdtr=False, interCharTimeout=None)
    #其中:
    #  bytesize:FIVEBITS、SIXBITS、SEVENBITS、EIGHTBITS
    #  parity: PARITY_NONE, PARITY_EVEN, PARITY_ODD, PARITY_MARK, PARITY_SPACE
    #  stopbits: STOPBITS_ONE, STOPBITS_ONE_POINT_FIVE, STOPBITS_TWO
    #異常:
    #ValueError:參數錯誤
    #SerialException:找不到設備或不能配置
   ser = serial.Serial('COM6',115200)
    ser.open():打開串口
    ser.close():立即關閉串口
   ser.isOpen()   #確認ser物件是否已經被打開 若被打開回船True
    __del__():析構函數


    #只讀屬性:
    name:設備名字
    portstr:已廢棄,用name代替
    ser.port:讀或者寫端口
    ser.baudrate:鮑率      #9600   #115200
    ser.bytesize:字節大小   #8      #serial.EiGHTBITS   八位數據位
    ser.parity:校驗位     serial.PARITY_NONE #無校驗    serial.PARITY_EVEN  #偶校驗   serial.PARITY_ODD
    ser.stopbits:停止位
    ser.timeout:讀超時設置
    ser.writeTimeout:寫超時
    ser.xonxoff:軟體流程控制
    ser.rtscts:硬體流程控制
    ser.dsrdtr:硬體流程控制
    interCharTimeout:字符間隔超時

    #端口設置可以被讀入字典,也可從字典加載設置:
    getSettingDict():返回當前串口設置的字典
    applySettingDict(d):應用字典到串口設置
    #對提供io庫的系統(python 2.6或以上),Serial從io.RawIOBase派生。對其它系統,從FileLike派生。
    #異常:
    exception serial.SerialException
    exception serial.SerialTimeoutException
    #常量:
    serial.VERSION:pyserial版本
    #模塊函數和屬性:
    serial.device(number)
    serial.serial_for_url(url, *args, **kwargs)
    serial.protocol_handler_packages()
    serial.to_bytes(sequence):接收一個字符串或整數列表sequence,返回bytes實例
}


ser.write(“hello") #就是往serial裡面寫訊息hello


Serial write用法

write(data):發送data,並返回發送字節數。如果bytes和bytearray可用(python 2.6以上),則接受其作為參數;否則接受str作為參數。

    #異常:SerialTimeoutException——配置了寫超時並發生超時時發生此異常。

    inWaiting():返回接收緩存中的字節數

    flush():等待所有數據寫出。

    flushInput():丟棄接收緩存中的所有數據

    flushOutput():終止當前寫操作,並丟棄發送緩存中的數據。

    sendBreadk(duration=0.25):發送BREAK條件,並於duration時間之後返回IDLE

    setBreak(level=True):根據level設置break條件。

    setRTS(level=True)

    setDTR(level=True)

    getCTS()

    getDSR()

    getRI()

    getCD()



data = ser.read() #讀一個字節

read(size=1):從串口讀size個字節。如果指定超時,則可能在超時後返回較少的字節;如果沒有指定超時,則會一直等到收完指定的字節數。
data = ser.read(20) #讀20個字節
data = ser.readline() #一次讀一行,直到讀到/n當作结束,要是没有/n就會一直讀。

Readline方法的使用

        是讀一行,以/n結束,要是沒有/n就一直讀,阻塞。

        使用readline()時應該注意:打開串口時應該指定超時,否則如果串口沒有收到新行,則會一直等待。如果沒有超時,readline會報異常。
data = ser.readlines() #和ser.xreadlines()都需要設定超時時間
ser.next() #讀下一個
===================================================================
i2C




===================================================================
SPI



===================================================================
GPIB(IEEE488) - Python GPIB控制 結合 NI VISA api
如此我們就可以透過python指令在cmd模式下 安裝pyvisa套件了 :
python -m pip 可以查看模組    pip模組介紹  pip套件官網(取代easy_install的python套件安裝神器)
python -m pip install -U pip 可以更新pip模組
python -m pip install -U pyvisa 可以安裝pyvisa模組,並更新到最新版本   pyvisa官網
 
為了確定此兩套件順利安裝,我們可以在cmd打python進入python mode或是開啟python專用的IDE (IDLE) 並打入
import visa(enter鍵送出)
來確定是否有錯誤訊息跳出,若順利執行則安裝成功
Q&A

Q:鍵入 import visa 時會出現下列錯誤訊息:
Traceback (most recent call last):
  File "", line 1, in 
  File "C:\Python27\lib\site-packages\visa.py", line 18, in 
    from pyvisa import logger, __version__, log_to_screen
  File "C:\Python27\lib\site-packages\pyvisa\__init__.py", line 20, in 
    import pkg_resources
ImportError: No module named pkg_resources
A:這是缺少 pkg_resources 模組所致,請到是德科技網站 http://www.keysight.com/ 下載 IO Libraries Suite 軟體,下載頁 http://www.keysight.com/main/software.jspx?ckey=1184883&lc=cht&cc=TW&nid=-11143.0.00&id=1184883
Q:Windows ERROR 126 A:詳 http://sourceforge.net/p/pyvisa/bugs/15/
程式碼範例 import visa rm = visa.ResourceManager() my_instrument = rm.open_resource('GPIB::14') my_instrument.write("*IDN?") print(my_instrument.read())
=================//作業系統NI 環境安裝//====================
安裝 NI-VISA 5.4.1

切換網頁到http://www.ni.com/download/ni-visa-5.4.1/4626/en/,點擊NIVISA541full_downloader.exe。它會要求您建立使用者帳號,如下圖。

如果您已經註冊過那麼就點擊「登入」,輸入正確的使用者名稱和密碼,然後再次點擊 NIVISA541full_downloader.exe  接著再雙擊下載的檔案NIVISA541full.exe,然後依照安裝視窗指示進行即可。



===================================================================
Socket
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('www.py4inf.com', 80))
mysock.send(**b**'GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n')

while True:
    data = mysock.recv(512)
    if ( len(data) < 1 ) :
        break
    print (data);

mysock.close()


===================================================================
CANBus(Kvaser) - Python結合CAN Bus的初勘-以Kvaser為例
最近工作上需要使用Python透過CAN Bus的工具來跟車機(BDC)做溝通控制。
以CAN tool來說,除了NI以外Vector solution for CAN也非常有名。
但礙於經費,手上只有一條Kvaser的產品

我們來到其 官網的下載區,找到了CANKing以及kvaser driver,進行溝通模擬以綽綽有餘。
若需要利用第三方平台來開發工具進行連接,我們需要Kvaser CANlib SDK。

CANlib SDK中各種api的呼叫以及回傳表 : 點此連結

因為其工作需求,需要用Python開發,找到下列三部曲連結:

  1. Accessing Kvaser CANlib from Python
  2. Using Python to connect to your remote device
  3. A more object oriented approach on accessing your Kvaser device from Python
我使用第一部曲就已綽綽有餘!!!!



===================================================================

1 則留言:

  1. 感謝你提供 在Python環境驅動CAN BUS Interface的教學

    回覆刪除