【硬件控制】5. Pico使用串口与电脑通信 |
您所在的位置:网站首页 › 串口通信接线 › 【硬件控制】5. Pico使用串口与电脑通信 |
前几节都是在讲树莓派与外部的元件通信,本节来讲树莓派如何与电脑通信 本篇文章会教大家开发一个这样的上位机软件,用来和Pico通信,文章较长,耐心看完 先看一下树莓派Pico的引脚图吧 我们可以看到上面有UART的引脚,UART又分为TX和RX UART是串口的一种,可以用来通信,包括单片机和电脑,单片机和单片机,单片机和其它带串口的外设 UART是全双工的,也就是说发送的发送的同时可以接收数据,UART需要三根线,一根TX(发送),一根RX(接收)和一根GND(共地) 串口模块: 现在的电脑都不带串口了,我们需要一个USB转串口模块来给电脑增加串口能力 如图所示: 网上很容易买到这样的USB转串口模块,只需几块钱,用的是CH340芯片 这个模块一头插电脑,另一头的引脚可以通过杜邦线连接Pico或其它单片机,这些引脚上面都要标注,别插错就可以了 买到模块后找店家要一个驱动,安装驱动后,可以测试下模块是否正常工作,将模块插入电脑,设备管理器里面出现新的串口设备说明驱动安装成功 然后使用一根杜邦线将TXD脚和RXD脚连接起来,这样这个模块发送的数据就会被自己接收到了 连接完成后,打开串口调试助手 里面选择自己的串口号,点击打开,同时将接收区设置中的十六进制显示去掉 在下面的输入窗口中输入数据,点击发送,上面的接收窗口就能收到相同的数据了,说明串口模块工作正常 Pico连接串口: 1号脚是串口的TX 2号脚是串口的RX 3号脚是GND,也要用到 这三个脚接到USB转串口模块的对应引脚上 TX接RX,RX接TX,GND接模块的GND(需要共地才能通信) 连接完成后给Pico编写串口通信代码: import time from machine import UART, Pin led = Pin(25, Pin.OUT) uart = UART(0, baudrate=9600, bits=8, stop=1) while True: led.toggle() time.sleep(1) uart.write('hello-world\n')首先引入UART包,然后初始化一个uart对象 uart需要设置几个参数 第一个是串口号,设置为0代表用Pico上的第一个串口 baudrate设置串口通信的波特率 bits设置通信的数据位为8位 stop设置停止位为1位 代码写完上传到Pico中 然后打开串口助手工具 串口设置要和Pico中的配置保持一致,比如波特率写9600,两边都要写9600 然后打开串口,就能源源不断收到Pico发送的数据了 然后我们来通过Python写一个小工具,用来代替串口调试助手 读取串口数据 Python提供了一个串口操作的包,pyserial 需要先安装这个包 pip install pyserial然后编写代码,操作串口 import serial com = serial.Serial("COM4", 9600) if com.isOpen(): print("打开串口成功") print(com.name) try: while True: read_data = com.read() if read_data: print(read_data) except: print('err') finally: com.close() else: print("打开串口失败")代码写完后,将串口调试助手的串口操作关闭掉,运行上面的Python脚本,也能源源不断输出Pico发送的数据了 上位机程序: 最后来编写一个上位机程序控制Pico 上位机是一个运行在电脑或手机上的程序,可以操作单片机 我们编写一个Python界面程序来给Pico发送指令,Pico收到指令后执行开灯或者关灯操作 使用PySimpleGui来编写界面 需要先安装包 pip install PySimpleGUI然后编写如下代码: import PySimpleGUI as sg import serial from serial.rfc2217 import Serial from serial.tools import list_ports def get_com_list(): """ 获取串口列表 :return: """ ports = list_ports.comports(include_links=False) return [port.device for port in ports] def get_baudrates_list(): """ 获取波特率列表 :return: """ return [item for item in Serial.BAUDRATES] if __name__ == '__main__': com_list = get_com_list() baudrates_list = get_baudrates_list() com: serial.Serial = None layout = [[sg.Text('通过按钮控制Pico点亮/熄灭LED')], [sg.HorizontalSeparator()], [sg.Text('串口:'), sg.InputCombo(com_list, readonly=True, key='com'), sg.Button('刷新', key='refresh_com_list')], [sg.Text('波特率:'), sg.InputCombo(baudrates_list, readonly=True, default_value=115200, key='baudrates')], [sg.Button('打开串口', key='open_serial'), sg.Button('关闭串口', key='close_serial')], [sg.HorizontalSeparator()], [sg.Button('开灯', key='open_led'), sg.Button('关灯', key='close_led')]] window = sg.Window('Pico上位机程序v1.0', layout, size=(300, 200)) while True: event, values = window.read() if event == sg.WIN_CLOSED: break elif event == 'refresh_com_list': # 刷新串口列表 com_list = get_com_list() window['com'].update(values=com_list) elif event == 'open_serial': # 打开串口 selected_com = values['com'] selected_baudrates = values['baudrates'] if not selected_com: sg.Popup('请选择串口') elif not selected_baudrates: sg.Popup('请选择波特率') else: if not com: print(f'open serial: {selected_com}') com = serial.Serial(selected_com, int(selected_baudrates)) elif event == 'close_serial': # 关闭串口 if com and com.isOpen(): print('close serial') com.close() com = None elif event == 'open_led': if com and com.isOpen(): print('send open led command') com.write(b'open_led\n') elif event == 'close_led': if com and com.isOpen(): print('send close led command') com.write(b'close_led\n') window.close()上面这段代码会创建这样的窗口: 可以下拉选择串口,然后设置波特率,打开串口后就能发送指令了 这里定义了两个指令 开灯: open_led\n关灯: close_led\n这两个指令会通过串口发送到Pico设备,Pico收到后判断指令然后执行相应的动作 Pico的代码如下: import time from machine import UART, Pin led = Pin(25, Pin.OUT) uart = UART(0, baudrate=115200, bits=8, parity=None, stop=1) uart.write('pico started!\n') while True: time.sleep(1) if uart.any(): command = uart.readline() if not command: continue command_str = command.decode() uart.write('recv-{}\n'.format(command_str)) if command_str.startswith('open_led'): led.value(1) elif command_str.startswith('close_led'): led.value(0)循环接收串口消息,收到后判断是否为定义的指令 然后执行相应的动作 以上就是一个简单的单片机与上位机通信的案例,大家可以稍加改造完成自己的控制功能 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |