打印

python 可以直接控制硬件吗?看看这个例子30行代码解决一个非常麻烦的问题

[复制链接]
2568|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
宇容创行|  楼主 | 2018-1-26 10:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
项目背景

1 嵌入linux 环境,一个无源码第三方程序固定读串口 /dev/ttyS0 的gps数据。
2 没有多余的串口了
3 ublox 方案的gps模块支持i2c 接口


解决方案
1 创建虚拟串口
2 建立一个软连接 将虚拟串口软链接到 /dev/ttyS0
2 python 读取gps,将读到的数据写到虚拟串口


代码如下,30行python 解决

#! /usr/bin/env python
#coding=utf-8

import pty
import os
import time
from periphery import I2C
import array
def mkpty():
    master, slave = pty.openpty()
    slaveName = os.ttyname(slave)
    print '\nslave device names:', slaveName
    return master

if __name__ == "__main__":
    master = mkpty()
    i2c = I2C("/dev/i2c-0")
    while True:
        msgs = [I2C.Message([0xfd]), I2C.Message([0xff,0xff], read=True)]
        i2c.transfer(0x42, msgs)
        msglen = (msgs[1].data[0])*256 +msgs[1].data[1]
        if msglen:
            msgs = [I2C.Message([0xff]*msglen, read=True)]
            i2c.transfer(0x42, msgs)
            msgstr="".join([chr(c) for c in msgs[0].data])
            os.write(master,  msgstr)
        else:   
            time.sleep(0.1)   
    i2c.close()   

使用特权

评论回复

相关帖子

沙发
宇容创行|  楼主 | 2018-1-29 09:35 | 只看该作者
项目背景

1 嵌入linux 环境,一个无源码第三方程序固定读串口 /dev/ttyS0 的gps数据。
2 没有多余的串口了
3 ublox 方案的gps模块支持i2c 接口


解决方案
1 创建虚拟串口
2 建立一个软连接 将虚拟串口软链接到 /dev/ttyS0
2 python 读取gps,将读到的数据写到虚拟串口


代码如下,30行python 解决

    #! /usr/bin/env python
    #coding=utf-8

    import pty
    import os
    import time
    from periphery import I2C
    import array
    def mkpty():
        master, slave = pty.openpty()
        slaveName = os.ttyname(slave)
        print '\nslave device names:', slaveName
        return master

    if __name__ == "__main__":
        master = mkpty()
        i2c = I2C("/dev/i2c-0")
        while True:
            msgs = [I2C.Message([0xfd]), I2C.Message([0xff,0xff], read=True)]
            i2c.transfer(0x42, msgs)
            msglen = (msgs[1].data[0])*256 +msgs[1].data[1]
            if msglen:
                msgs = [I2C.Message([0xff]*msglen, read=True)]
                i2c.transfer(0x42, msgs)
                msgstr="".join([chr(c) for c in msgs[0].data])
                os.write(master,  msgstr)
            else:   
                time.sleep(0.1)   
        i2c.close()   

使用特权

评论回复
发新帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

1549

帖子

3

粉丝