raspi串口、python串口模塊pyserial


一、安裝

1.下載軟件包pyserial-2.7.tar.gz   網址:https://pypi.python.org/pypi/pyserial

2.8uftp上傳至/usr/local/src/目錄下

3.cd /usr/local/src/

4.解壓tar -zxvf pyserial-2.7.tar.gz

5.cd pyserial-2.7/         //在該解壓后的文件里發現setup.py文件,而沒有configrue文件,所以,

                                  //下一步用sudo python setup.py install,而不是./configrue --prefix=/usr.....

6.安裝sudo python setup.py install

 

注:網上還有如下方法編譯安裝pyserial
cd /usr/local/src/
wget http://pypi.python.org/packages/source/p.......        //用wget直接下載到當地當前目錄下
tar -zxvf pyserial-2.4.tar.gz

cd pyserial-2.4
python2.6 setup.py install

 

二、使用

import serial導入模塊

然后就可以用了

ser = serial.Serial(0) 是打開第一個串口

print ser.portstr 能看到第一個串口的標識,windows下是COM1

ser.write(“hello") 就是往串口里面寫數據

ser.close() 就是關閉ser表示的串口

ser.open() 會打開這個串口

ser = serial.Serial('COM1', 115200) 來設置波特率,當然還有專門的函數

data = ser.read()可以讀一個字符

data = ser.read(20) 是讀20個字符

data = ser.readline() 是讀一行,以/n結束,要是沒有/n就一直讀,阻塞。

data = ser.readlines()和ser.xreadlines()都需要設置超時時間

ser.baudrate = 9600 設置波特率

ser 來查看當前串口的狀態

ser.isOpen() 看看這個串口是否已經被打開

三、樹莓派串口UART(轉載,原文:http://blog.csdn.net/xukai871105/article/details/22713925)

樹莓派學習筆記——UART使用

0.前言

    本文將詳細介紹樹莓派的串口(UART)配置和使用,並結合一個modbus RTU從機的例子說明樹莓派串口的應用。
    在開始前說明以下幾點
    【1】樹莓派UART端口的位置
    TXD位於HEAD-8
    RXD位於HEAD-10
    GND位於HEAD-6(可選其他GND)
    【2】樹莓派的TXD應接USB轉串口設備的RXD,當然如果測試失敗請交換RXD和TXD的順序
    【3】經過很多次的測試(N>25),當波特率為115200時打開樹莓派的UART時,樹莓派會莫名其妙的發送一字節0xF8,該問題始終無法解決。不過波特率為9600時並沒有此問題,猜測是樹莓派硬件或內核驅動問題。
    【4】樹莓派的串口默認為SSH調試使用(參考:http://www.cnblogs.com/ma6174/archive/2013/04/23/3038626.html),若要使用串口需要修改兩處文件。
    
圖1 樹莓派 UART位置
 
1.修改兩處文件
【1】/boot/cmdline.txt
    【輸入以下指令】
    sudo nano /boot/cmdline.txt
    【刪除紅色部分】//移除內核啟動信息輸出和內核調試信息輸出
dwc_otg.lpm_enable=0  console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
    【最終變為】
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
    
【2】/etc/inittab
    【輸入以下指令】
    sudo nano /etc/inittab
    【注釋最后一行內容】//禁止掉從串口登錄的功能
#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
 
2.使用minicom
    配置完之后便可測試一下樹莓派的UART是否正常工作,而minicom便是一個簡單好用的工具。minicom是linux平台串口調試工具,相當於windows上的串口調試助手。
    【1】minicom安裝
    sudo apt-get install minicom
    【2】minicom啟動
    minicom -b 9600 -o -D /dev/ttyAMA0
    -b代表波特率,-D代表端口,/dev/ttyAMA0 類似於windows中的COM1,-o功能暫時未知。
    圖2 minicon界面
    【3】minicom發送內容
        直接在控制台中輸入內容即可,如果minicom打開了回顯可在控制台中觀察到輸出內容,如果回顯關閉則控制台中沒人任何反應,千萬不要以為minicom沒有正常工作。
    【4】minicom回顯控制
        先Ctrl+A,再E。可翻轉回顯狀態(原來回顯打開則此事回顯關閉)
    【5】minicom回顯關閉
        先Ctrl+A,再Q。
 
3.使用pyserial
    minicom僅滿足調試用途,如果需要編程解決問題那么python的serial擴展庫——pyserial則是一個不錯的選擇。pyserial模塊非常好用,后面的文章還會分析如何使用pyserial控制GPRS模塊。
    【pyserial安裝】
    安裝pyserial擴展庫有很多種方法,可使用pip或者easy_install安裝,也可以直接選擇apt-get工具安裝。
    若使用apt-get工具安裝,可輸入以下指令
    sudo apt-get install python-serial
 
    【串口回顯程序】
    非常簡單的一個串口程序,樹莓派通過串口返回接收的內容。
[python]  view plain copy 在CODE上查看代碼片 派生到我的代碼片
  1.  # -*- coding: utf-8 -*  
  2. import serial  
  3. import time  
  4. # 打開串口  
  5. ser = serial.Serial("/dev/ttyAMA0", 9600)  
  6. def main():  
  7.     while True:  
  8.         # 獲得接收緩沖區字符  
  9.         count = ser.inWaiting()  
  10.         if count != 0:  
  11.             # 讀取內容並回顯  
  12.             recv = ser.read(count)  
  13.             ser.write(recv)  
  14.         # 清空接收緩沖區  
  15.         ser.flushInput()  
  16.         # 必要的軟件延時  
  17.         time.sleep(0.1)  
  18.      
  19. if __name__ == '__main__':  
  20.     try:  
  21.         main()  
  22.     except KeyboardInterrupt:  
  23.         if ser != None:  
  24.             ser.close()  
 
4.總結
    由於可借助python標准庫使得樹莓派的串口格外好用。是不是可以拿樹莓派做一個Modbus RTU從機,的確可以請期待后面的博文吧。
 
5.參考資料
【1】 minicom使用 國外博客
【2】 elinux python-serial 安裝pyserial及例程等
 
四、raspi串口通信控制51單片機點亮LED(裝載) 原文地址:http://www.360doc.com/content/13/0314/00/3810344_271368104.shtml

raspberry pi 串口控制51單片機

  制作小車都用raspberry pi上的口有些麻煩,所以把一些基礎控制給51單片機解決,raspberry pi控制高層應用。所以測試一下raspberry pi串口連接調試51單片機。
  第一步: //我自己第一步:sudo apt-get install pyserial(python的串口模塊)

sudo apt-get install python-serial
sudo easy_install pyserial

  第二部接線部分圖     //我自己這一排依次接:單片機的+5v、懸空、單片機的地、單片機的RXD、單片機的TXD。
  raspberry pi板子串口接線圖

raspberry 串口接線圖1

raspberry 串口接線圖1


  杜邦線連接
IMAG1302-1 
raspberry 串口接線圖3

raspberry 串口接線圖3

代碼部分
      raspberry pi python串口控制代碼://以下標黃色這句,運行錯誤,提示類型不正確,可能是python解釋器版本的問題,在python3.x以上版本
                                                      //函數的參數不是整形或字符串,而是序列,所以在黃色語句前加入語句tstlist=[i],將參數轉為序列,如下:

                                                      //#tstlist=[22,8,8,3,3,3]
                                                      //tstlist=[i]
                                                      //ser.write(tstlist[:])

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/bin/env python
# -*- coding:utf-8 -*-
# -------------------------------
# Filename:   
# Revision:   
# Date:        2013-02-5
# Author:      simonzhang
# Email:       simon-zzm@163.com
# WWW:         www.simonzhang.net
# -------------------------------
import  serial
import  time
 
#### 定義小燈亮滅初始值
=  0
#### 實例化串口
ser  =  serial.Serial( '/dev/ttyAMA0' 9600 , timeout  =  0.5 )
for  in  range ( 10 ):
     if  ser.isOpen()  = =  False :
         ser. open ()
     #### 每次循環對上值次取反
     if  = =  0 :
        =  1
     else :
        =  0
     #### 向串口發送字符
     ser.write(chr(i))
     #### 獲取串口返回值
     #### linux為福阻塞模式,在阻塞模式下
     #### 會報錯,所以抱起來就好了。
     try :
         re  =  ser.readlines()
     except :
         pass
     print  re
     time.sleep( 2 )
     注:以上標黃色這句,運行錯誤,提示類型不正確,可能是python解釋器版本的問題,在python3.x以上版本,函數的參數不是整形或字符串,而是序列,所以在黃色語句前加入語句tstlist=[i],將參數轉為序列,如下:

#tstlist=[22,8,8,3,3,3]   

tstlist=[i]    

ser.write(tstlist[:])。更重要的是解決問題的思路:當運行錯誤的時候,會提示在庫函數里面具體哪個函數出錯了,是to_bytes(data)函數,仔細解讀這個函數發現它是將所給參數(是序列)轉換為字符,在程序的注釋部分也有說明,於是想到先把參數轉化為序列再給ser.write(...)函數,解決問題。思路:去庫函數具體出錯的函數處分析原因。

 

/************其他人的解決辦法***************/

 

ser=serial.Serial(6,115200)#這里沒有問題
at='at'+chr(13)
ser.write(at)
讓后馬上就報錯了.
File "C:\Python33\lib\site-packages\serial\serialutil.py", line 76, in to_bytes
b.append(item) # this one handles int and str for our emulation and ints for Python 3.x
TypeError: an integer is required

 

 

某人回復:3的字符串都是unicode,發送前是不是要encoding成別的編碼?

樓主修改:at='AT' at=at+chr(13) at.encode('ascii')


/***************************************/

     51單片機代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <reg52.h>
#include <intrins.h>
typedef  unsigned  char  uint8;
typedef  unsigned  int   uint16;
 
 
uint8 num;
sbit D0 = P0^0;
 
void  init()
{
     SCON = 0x50;
     TMOD = 0x20;
 
     TH1 = 0xFD;
     TL1 = 0xFD;
     TR1 = 1;  //打開定時器
     ES  = 1;
     EA  = 1;  //打開總開關
}
 
void  interrupt_uart() interrupt 4
{
     if (TI)
     {
         TI = 0;
         REN = 1;
     }
     if (RI)
     {
         RI = 0;
         num = SBUF;
         if  (num == 1)
         {
             D0 = 0;
             SBUF = 0;
         }
         else
         {
             D0 = 1;
             SBUF =1;
         }
         REN = 0;
     }
}
 
 
main()
{
     init();
     while (1);
}

源碼下載
raspberrypito51

五、pyserial解析:

1.serial.Serial的參數有哪些:

>>> import serial
>>> ser=serial.Serial("/dev/ttyAMA0",9600)
>>> ser
Serial<id=0xb6afc6b0, open=True>(port='/dev/ttyAMA0', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)

2.pyserial官網文檔地址:pyserial.sourceforge.net

  • timeout = None: wait forever
  • timeout = 0: non-blocking mode (return immediately on read)
  • timeout = x: set timeout to x seconds (float allowed)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM