zoukankan      html  css  js  c++  java
  • 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 plaincopy在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:Python33libsite-packagesserialserialutil.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)
  • 相关阅读:
    Android之弹出/隐藏系统软键盘
    Android之自定义侧滑菜单
    2017-2018-2 20179204 PYTHON黑帽子 黑客与渗透测试编程之道
    2017-2018-2 20179204《网络攻防实践》第十三周学习总结 python实现国密算法
    2017-2018-2 20179204《网络攻防实践》第十二周学习总结 免杀技术
    2017-2018-2 20179204《网络攻防实践》第十一周学习总结 SQL注入攻击与实践
    2017-2018-2 20179204《网络攻防实践》第十周学习总结 缓冲区溢出漏洞实验
    2017-2018-2 20179204《网络攻防实践》第九周学习总结
    2017-2018-2 20179204《网络攻防实践》第八周学习总结
    2017-2018-2 20179204《网络攻防实践》第七周学习总结
  • 原文地址:https://www.cnblogs.com/cj2014/p/3818675.html
Copyright © 2011-2022 走看看