当前位置:   article > 正文

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

tx2 pyqt

你需要了解的

 

        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数据,并打印出来。

  1. import serial#导入串口通信库
  2. import time
  3. ser = serial.Serial()
  4. def port_open_recv():#对串口的参数进行配置
  5. ser.port='com3'
  6. ser.baudrate=115200
  7. ser.bytesize=8
  8. ser.stopbits=1
  9. ser.parity="N"#奇偶校验位
  10. ser.open()
  11. if(ser.isOpen()):
  12. print("串口打开成功!")
  13. else:
  14. print("串口打开失败!")
  15. def send(send_data):
  16. if(ser.isOpen()):
  17. ser.write(send_data.encode('utf-8'))#编码
  18. print("发送成功",send_data)
  19. else:
  20. print("发送失败!")
  21. if __name__ == '__main__':
  22. port_open_recv()
  23. CMD = open('send.txt')
  24. while True:
  25. line = CMD.read(4)
  26. if(line == ''):
  27. break
  28. send(line)
  29. data=ser.readline()
  30. print(data)
  31. time.sleep(1)

 串口接受方——TX2代码

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

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

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

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

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

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

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

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

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

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

一些注意的点

乱码问题

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

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

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

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

初始化问题

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

下一步工作

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

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

最后的话

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/211197
推荐阅读
相关标签
  

闽ICP备14008679号