赞
踩
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,这样是为了一边是读,另一边自然就是写了。
到此,硬件连接部分就可以了,下面介绍代码编写部分。
你需要在你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)
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
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'))
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
(上述代码是手敲的,可能手误有错误,谅解)
接下来简单介绍一下代码大致内容。
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中一直报错,正在研究中,所以未加上。
第一次写博客,内容看着不多,但是这却是笔者花了一周多时间总结出来的,在网上找了好多文章,归纳总结出来的,也走了好多错路。错误之处多多包涵,敬请批评指正。
最后,我是浅安,在此恭迎林家大小姐驾到!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。