1,网上购买了常用芯片的 usb转485转换器,价格100以内,其中使用的常用转换芯片为 FTDI 公司的,转自百度-英商飞特帝亚有限公司(FTDI)是设计和供应USB芯片和软件方案的专业厂商。FTDI将易于实现的IC设备和经过千锤百炼的免费USB固件和软件驱动组合起来,提供了实现USB的快捷方式。公司的USB单信道和多信道接口可外设成具有易于使用特性的的UART或FIFO界面。这些现行的设备可用于传统 USB至RS232/RS422转换器应用, 也可用于MCU,PLD或FPGA至USB的快速界面。有非常多的评估工具软件和模块可用来设计评估FTDI的芯片。其公司主要芯片如下
官网上有详细驱动下载,注意windows下win8 win10自动安装驱动,而ubuntu下,我使用的是uart,FT232R芯片,利用虚拟串口,故查找驱动时候,开始找VCP D2XX D3XX, 因为我使用的是232R,如果芯片直接安装在板子上,认为是用D2XX驱动,而我是虚拟串口,所以选择了,vcp,通过官网vcp资料显示,在ubuntu11.1时,all ftdi devices已经集成到kernel 3.0.0.19 上面了,参考官网:https://www.ftdichip.com/FTDrivers.htm ,查看 vcp driver https://www.ftdichip.com/Drivers/VCP.htm,,故注意 ,
通过文档,因为我单独安装过dxx的驱动,不确定是kernal集成 还是我之前安装的可行,上述步骤可以不用一步步做,
我直接 1,dmesg | grep FTDI 发现, 最后那句, ttyusb0 已经attached,故 没有按照上面编写那个文件 99-usbftdi.rules
,(而我后面 发现只有sudo下root权限才能操作serial,也更改了/etc/udev/,可以增加udev规则来实现,具体方法如下:sudo vim /etc/udev/rules.d/70-ttyusb.rules增加如下内容:KERNEL=="ttyUSB[0-9]*",MODE="0666"保存,重新插入USB转串口,普通用户就能搞定了, 不知道 这个 99 和70 rules作用是啥,个人感觉因为linux下一切皆文件,这个是对usb的设置文件,写入keral权限)
2,很重要的一点,sudo apt-get remove brltty, ubuntu下必remove这个才可以使用。
3,插入 串口设备,如果你输入 cd /dev, ls 看到 ttyUSB0 或者ttyUSB1,等表示 已经识别到了这个设备,说明驱动正常。否则需要重新安装驱动,参考 vcp drives 和 d2xx drivers。(疑问: 出现过两次,插拔同一个硬件,只有一个这个com的情况下,发现一会ttyusb0,一会ttyusb1?原因待查),其中我走了个弯路,按照 别人给我的驱动找到了armv8下的 d2xx 驱动,libftd2xx-arm-v8-1.4.8.gz,解压 tar xfvz libftd2xx-arm-v8-1.4.8.tgz(gunzip libftd2xx-arm-v8-1.4.8.gz ,tar -vxf libftd2xx-arm-v8-1.4.8.tar tar -vxf -vxf libftd2xx-arm-v8-1.4.8),按照要求,1,cd build sudo -s su 后 ,2,cp libftd2xx.* /usr/local/lib ,3, chmod 0755 /usr/local/lib/libftd2xx.so.1.4.8, ,4, ln -sf /usr/local/lib/libftd2xx.so.1.,4.8 /usr/local/lib/libftd2xx.so 安装驱动完毕。 然后 cd exsamples下后make -B , cd 到eeprom下发现 FT_Open failed, 看文档意识是让我们open之前先去FT_SetVIDPID
,后面我执行这个setvidpid 发现一样不行,所以应该是用vcp,而不用d2xx。
4,为了防止走弯路,先用su权限运行程序 看看python下是否成功,方法:
sudo apt-get remove python-serial
sudo apt-get install python-pip
sudo pip install pyserial
执行 程序:-摘自;吴疆 地址:https://www.cnblogs.com/deeplearning1314/p/10818529.html
# -*- coding:utf-8 -*-
# Author: WUJiang
# 运行环境为Ubuntu18.04&Python2.7
import serial
import time
ser = serial.Serial("/dev/ttyUSB0", 9600) # 选择串口,并设置波特率
if ser.is_open:
print("port open success")
# hex(16进制)转换为bytes(2进制),应注意Python2.7与Python3.7此处转换的不同
send_data = 'ff010055000056'
send_data = send_data.decode('hex') # 发送数据转换为b'\xff\x01\x00U\x00\x00V'
ser.write(send_data) # 发送命令
time.sleep(0.1) # 延时,否则len_return_data将返回0,此处易忽视!!!
len_return_data = ser.inWaiting() # 获取缓冲数据(接收数据)长度
if len_return_data:
return_data = ser.read(len_return_data) # 读取缓冲数据
# bytes(2进制)转换为hex(16进制),应注意Python2.7与Python3.7此处转换的不同,并转为字符串后截取所需数据字段,再转为10进制
str_return_data = str(return_data.encode('hex'))
feedback_data = int(str_return_data[-6:-2], 16)
print(feedback_data)
else:
print("port open failed")
###运行环境为Ubuntu18.04&Python3.6
import serial
import time
ser = serial.Serial("/dev/ttyUSB1", 9600) # 选择串口,并设置波特率
if ser.is_open:
print("port open success")
# hex(16进制)转换为bytes(2进制),应注意Python2.7与Python3.7此处转换的不同
send_data = 'ff010055000056'
send_data = bytes.fromhex(send_data) # 发送数据转换为b'\xff\x01\x00U\x00\x00V'
print(send_data)
ser.write(send_data) # 发送命令
time.sleep(0.9) # 延时,否则len_return_data将返回0,此处易忽视!!!
len_return_data = ser.inWaiting() # 获取缓冲数据(接收数据)长度
if len_return_data:
return_data = ser.read(len_return_data) # 读取缓冲数据
# bytes(2进制)转换为hex(16进制),应注意Python2.7与Python3.7此处转换的不同,并转为字符串后截取所需数据字段,再转为10进制
str_return_data = str(return_data.hex())
feedback_data = int(str_return_data[-6:-2], 16)
print(feedback_data)
else:
print("port open failed")
返回值正常。
5,因为我是虚拟环境 新的用户,所以更改了权限,另外在新用户下安装了:
pip install pyftdi
pip install serial