查看: 1976|回复: 0

[i.MX6ULL竞赛专区] 我的项目666——在i.MX6ULL开发板串口转网络客户端

[复制链接]

该用户从未签到

4

主题

18

帖子

0

注册会员

Rank: 2

积分
68
最后登录
2021-7-16
发表于 2018-7-6 16:33:51 | 显示全部楼层 |阅读模式
由于终端设备用的RF通信,MX6开发板通过串口与主模块连接,所以需要开发串口程序接收到数据之后,发送给服务器即可,完成数据到外网的传输现在python很流行,决定使用python来写程序
先编译python大约以下过程,先编译PC版本的,再给python源码打上交叉编译补丁,最后交叉编译python就好了
在python源码目录执行,标准过程
./configure
在编译python和Parser/pgen
make python Parser/pgen
将X86版本的python可执行文件备份为python_for_build
mv python python_for_build
将X86版本的pgen可执行文件配备为pgen_for_build
mv Parser/pgen Parser/pgen_for_build
清理编译好的项目文件,这一步是为了后面的交叉编译做准备
make distclean
整个步骤最重要的就是保存好python和pgen这两个可执行文件,因为之后在交叉编译Python时需要用到这两个文件。
整个过程参考,http://www.cnblogs.com/tolimit/p/4519838.html比较方便,就不在复制说明了
下面就是python程序了
import serial
import socket
import time
import threading
import serial.tools.list_ports

class MSerialPort:
    def __init__(self, port, buand):
        self.port = serial.Serial(port, buand)
        if not self.port.isOpen():
            self.port.open()

    def port_open(self):
        if not self.port.isOpen():
            self.port.open()

    def port_close(self):
        self.port.close()

    def write_data(self, data):
        number = self.write(data)
        return number

    def read_data(self, c):
                while True:
                    n = self.port.inWaiting()
                    if n:
                        try:
                            data = self.port.read()
                            time.sleep(0.02)
                            data += self.port.read(self.port.inWaiting())

                            c.send(data)
                        except socket.error as e:
                            print('disconnected...')
                            print(e)
                            c.close()
                            break

                c.close()

    def recv_data(self, c):
        while True:
            try:
                data = c.recv(1024)
                print(data)
            except socket.error as e:
                print(e)
                break


    def is_open(self):
        return self.port.is_open


class OpenSerial(threading.Thread):

    def __init__(self, mSerial):
        threading.Thread.__init__(self)
        self.mSerial = mSerial
        self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.host = ‘59.92.138.50’
        self.port = 12999
        self.s.bind((self.host, self.port))

        self.s.listen(5)

    def run(self):
        while True:
            c, addr = self.s.accept()
            try:
                c.settimeout(50)
                threading.Thread(target=mSerial.read_data, args=(c, )).start()
                threading.Thread(target=mSerial.recv_data, args=(c, )).start()
            except socket.timeout:
                print("time out")

if __name__ == '__main__':
    plist = list(serial.tools.list_ports.comports())
    if len(plist) <= 0:
        print("The Serial port can't find!")
    else:
        plist_0 = list(plist[0])
        serialName = plist_0[0]
        print(serialName)

        mSerial = MSerialPort(serialName, 115200)
        if mSerial.is_open:
            OpenSerial(mSerial).start()

            while True:
                time.sleep(1)



大约的过程就是创建网络客户端,并尝试连接到服务器,打开串口,监听串口数据,收到数据转发服务器
整个过程比较简单,可以参考一下

回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /4 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2024-4-26 04:53 , Processed in 0.103783 second(s), 18 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表