前提:在已经安装USB驱动的情况下,笔者已经安装了ch341驱动,linux已经能够检测到USB设备存在。

1. 查看USB属性以及蓝牙属性

插入USB转蓝牙模块

stty -F \dev\ttyUSB0

尤其要关注USB的波特率属性,保证要与即将设置的蓝牙的波特率相同,这样传递数据才不会乱码。

stty -F \dev\ttyUSB0  115200 #修改usb的波特率
 # 其余用法可以通过 stty --help 来查询

蓝牙属性是通过AT指令来查询,详细见跳转 其中有以下内容需要注意:

  1. 蓝牙波特率需要与USB的波特率相同
  2. 查询的时候留意NAME与PWSD
  3. 需要将模式设置为Slave,因为手机或者电脑需要主动连接蓝牙HC-05,在配对角色中蓝牙模块属于从模式。

2. 查看USB设备文件

将USB转串口模块连接蓝牙模块。

cd \dev # 跳到设备文件夹下
ls -l # 列出所有设备文件

尤其注意ttyUSB0文件,如果存在就没问题。ttyUSB0文件是USB数据读写中间文件,向其中写数据,相当于发送数据;从其中读数据,相当于接收数据。
在将USB转蓝牙模块的Rx与Tx相连之后(相当于回环模式)之后,可以用下面的代码进行测试:

echo "hello" > ttyUSB0 # 用USB发送"hello"
cat ttyUSB0 # 查看USB的接收缓冲区内容,应该会看到"hello"

ttyUSB0的接受缓冲区是没有结尾的,如果cat的时候会一直输出,需要control+c终止。

3. 利用pyserial发送数据

虽然知道是对ttyUSB0进行读写,但是利用python自身的file类文件操作会出现很多问题,比如read时候会一直卡死,write时候接收方得到的是不可见字符等等,所以使用pyserial库。

import serial #导入模块
try:
  #端口,GNU / Linux上的/ dev / ttyUSB0 等 或 Windows上的 COM3 等
  portx="/dev/ttyUSB0"
  #波特率,标准值之一:50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,19200,38400,57600,115200
  bps=115200
  #超时设置,None:永远等待操作,0为立即返回请求结果,其他值为等待超时时间(单位为秒)
  timex=5
  # 打开串口,并得到串口对象
  ser=serial.Serial(portx,bps,timeout=timex)

  # 写数据
  # 如果使用中文必需使用gbk编码
  result=ser.write("All is ready. 一切都准备好了。".encode("gbk")) 
  print("写总字节数:",result)

  ser.close()#关闭串口

except Exception as e:
    print("---异常---:",e)