如何用python实现TX2(Linux)与win系统串口通信

你需要了解的

 

        TX2,简单来说就是一个小型Linux计算机系统,如果想具体了解TX2,请查阅其他相关文章,本文是基于读者对TX2有一定基础(能刷机后启动即可)的前提下展开的。所以你需要提前TX2系统,显示器(包括连接线),鼠标键盘,如果USB接口不够用,你需要额外准备一个多USB转接口。

      win系统,也就是笔记本电脑,没啥要求,下载一个pycharm就行

而本文所要实现的内容是win系统每秒给TX2系统发送一段数据,然后TX2接收该段数据后进行数据处理(比如可以进行时间序列预测),将处理完的结果再传输给win系统。

一 硬件连接

        要实现笔记本电脑与TX2的连接,你需要一根USB转TTL电平的转接线

USB一端连接笔记本电脑,针脚一端一共有六个,我们只需要GND,XTD,  RXD这三个口(5V那个线是不需要的,因为电脑会给它供电)。TX2这边我们可以找到如下位置管脚。

他们每个管脚从下到上我们定义为1-6号管脚,如上图所示。其中1号管脚是GND线,所以需要与转接线的GND线相连接,TX2系统板的4号管脚是RX线,需要与转接线的TXD线相连接。5号管脚是TX线,需要与转接线的RXD线相连接。这里注意的是,转接线和TX2都有TX和RX两中管脚,他们是交错连接的,即TXD连接RXD,这样是为了一边是读,另一边自然就是写了。

到此,硬件连接部分就可以了,下面介绍代码编写部分。

串口发送方——win系统代码

你需要在你pycharm下载好serial库,这步有手就行,读者自行下载。然后读者需要准备一份txt文件,用来保存你需要发送的数据,这里笔者用的是send.txt。需要注意的是txt文件的位置需要跟代码在同一目录下,如果不在同一目录,将txt改为绝对路径即可。

我的串口号是com3,这里你需要查阅一下你的串口号是什么,然后修改即可。

运行该代码,win系统会将send.txt文件的内容每一行数据line每秒发送给TX2系统,具体有没有发送成功,在print输出口会有显示。

TX2处理完后将数据再传输给win系统,也就是data数据,并打印出来。

import serial#导入串口通信库
import time
ser = serial.Serial()

def port_open_recv():#对串口的参数进行配置
    ser.port='com3'
    ser.baudrate=115200
    ser.bytesize=8
    ser.stopbits=1
    ser.parity="N"#奇偶校验位
    ser.open()
    if(ser.isOpen()):
        print("串口打开成功!")
    else:
        print("串口打开失败!")

def send(send_data):
    if(ser.isOpen()):
        ser.write(send_data.encode('utf-8'))#编码
        print("发送成功",send_data)
    else:
        print("发送失败!")

if __name__ == '__main__':
    port_open_recv()
    CMD = open('send.txt')
    while True:
        line = CMD.read(4)
        if(line == ''):
            break
        send(line)
        data=ser.readline()
        print(data)
        time.sleep(1)

 串口接受方——TX2代码

TX2串口号我的是/dev/ttyTHS2,这里你需要查询你的串口号是多少,修改即可。win系统发送给TX2的数据,TX2将其保存在read.txt中,将其路径改为你的即可,这里文件模式采用的是“a+”,可以按照需求修改成你想要的模式。

本文没有数据处理部分的代码,读者可以自行添加,这里的代码是当接收一行数据后,保存在read.txt文件中,然后给win系统发送data1,即“okok”数据,表明接收到了。

import serial
ser = serial.Serial(
    port='/dev/ttyTHS2',
    baudrate=115200,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS
)
data1="okok"
while True:
    with open(file="/**/read.txt",mode="a+") as note:
        data = ser.readline()
        if '\\x' in str(data):
            data = data.decode("utf-8").replace("\n","")
        else:
            data = str(data)[2:-3]
        note.writelines(data+'\n')
        ser.write(data1.encode('utf-8'))
    

(上述代码是手敲的,可能手误有错误,谅解) 

接下来简单介绍一下代码大致内容。

 if '\\x' in str(data):

 这行if判断的目的区分出中文,来实现发送中文也可以传输的目的,如果你的数据不含中文,可以把if去掉,只保存else的内容即可。具体实现原理就是编码解码那一套,这里不详述了。

 data = str(data)[2:-3]

这里的数据切片是为了把数据段的前后无用字符去掉,比如“\n”回车符之类的,读者可以去掉切片部分自行观察切掉了哪部分内容。 

其他部分的代码都是数据转化解码编码部分的内容。简单来说就是接收发送都是字节型,需要转化成字符型才能保存。(嗯,我是这么理解的,不知道对不对)

一些注意的点

乱码问题

实现串口通信最难的点就是避免乱码问题,最开始我在TX2接收方采用的是终端命令的方法来接受串口发送过来的数据。

stty -F /dev/ttyO2 raw
stty -F /dev/ttyTHS2 speed 115200
cat /dev/ttyO2 > serial.txt &

 但是一直存在乱码问题,我试了N种方法,搞了一天也没弄出来,就研究了python实现接收方。

另辟蹊径解决了乱码问题,或者说避开了这问题。

初始化问题

接收方发送方都有一些初始化操作,比如比特率数据位结束位等等,这要注意的是要保证接收方发送方的初始化一致,不然传输会有问题。

下一步工作

实现发送接收同步进行是下一步的工作内容,也就是说,你等待接收的时候,代码是停在这一步的,是没办法进行其他工作的,效率会比较低,所以这一步需要解决。

还有就是要加上数据处理的代码,由于数据处理部分我用的时间序列预测,但是在TX2中一直报错,正在研究中,所以未加上。

最后的话

第一次写博客,内容看着不多,但是这却是笔者花了一周多时间总结出来的,在网上找了好多文章,归纳总结出来的,也走了好多错路。错误之处多多包涵,敬请批评指正。

最后,我是浅安,在此恭迎林家大小姐驾到!

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值