MaixII-Dock(v831)学习笔记——UART


前言

  UART通用异步收发传输器(Universal Asynchronous Receiver/Transmitter,通常称作UART,俗称串口)是一种串行异步收发协议,下到8位单片机,上到64位Soc,一般都会提供UART接口,应用范围广。

MaixII-Dock使用UART

  在Linux系统中,UART在用户空间会生成名为/dev/ttyS*的设备(ttyS名称是驱动给出的,可能因驱动而异),应用程序通过读写设备就可以进行UART通信。Linux内核实现了tty层和serial core,serial core会调用tty层的接口,注册tty driver,同时提供了底层uart的抽象
在这里插入图片描述
  由引脚功能图可以看出,MaixII-Dock有两个UART可以使用,但因为不要使用 UART-0 通道来进行串口通讯,这个串口是直连芯片,会有一些其他数据吞吐,所以只有UART-1可以使用。

python串口模块

  serial是python的标准库,常用方法:

ser = serial.Serial(“/dev/ttyS1”,115200) # 实例化串口,设置波特率
ser.write(“hello") # 输入需要通讯的内容
data = ser.read()#可以读一个字符
data = ser.read(20)# 是读20个字符
data = ser.readline() #是读一行,以/n结束,要是没有/n就一直读,阻塞。如果timeout设置 则不堵塞。
ser.setDTR(True)#设置引脚状态
ser.setDTR(False)#设置引脚状态
ser.setRTS(True)#设置引脚状态
ser.setRTS(False)#设置引脚状态
ser.close() #关闭串口
ser.open() #打开串口

MaixII-Dock串口收发

  准备USB转TTL板一块,将ch340的tx接PG7,ch340的rx接PG6,还要接一根地线,使ch340与MaixII-Dock工地。
  打开串口助手,运行下列代码,即可进行串口通讯:

import serial
ser = serial.Serial("/dev/ttyS1",115200)    # 连接串口
print('serial test start ...')              
ser.write(b"Hello Wrold !!!\n")             # 输入需要通讯的内容
while True:
    ser.setDTR(True)                        
    ser.setRTS(True)
    tmp = ser.readline()  #接收到的内容
    if tmp:
    	print(tmp)
    	ser.write(b"Get datas successful")

在这里插入图片描述

MaixII-Dock与stm32串口通讯

  MaixII-Dock与stm32串口通讯和单片机之间的串口通讯差不多,tx接rx,rx接tx,然后共地即可,这里我用的是stm32rc6,stm32的代码可以之间用正点原子的例程。
在这里插入图片描述
MaixII-Dock上电后运行下列代码:

import serial
ser = serial.Serial("/dev/ttyS1",115200)    # 连接串口
print('serial test start ...')
ser.write(b"1")             # 输入需要通讯的内容
while True:
    ser.setDTR(True)
    ser.setRTS(True)
    tmp = ser.readline()  #接收到的内容
    if tmp:
        print(tmp)
        ser.write(b"Get datas successful\n")

MaixII-Dock上电后运行代码后会像stm32发送b"1",也就是0x31,当stm32收到后LED1亮。stm32的代码用printf()函数就可以发送信息,不过要注意结尾加上\n,要是没有\n就一直读,阻塞。stm32端部分代码:

while(1)
	{
    
    		
		t=KEY_Scan(0);		//得到键值
		switch(t)
		{
    
    				 
			case KEY0_PRES:
				LED0=!LED0;
			printf("0x31\n");
				break;
			case KEY1_PRES:;
				break;
			case WKUP_PRES:				
				break;
			default:
				delay_ms(10);
		}
		if(USART_RX_BUF[0]==0x31)
		{
    
    
		LED1=0;
		}
		else if(USART_RX_BUF[0]==0x32)
		{
    
    
			LED1=1;
		}
		if(USART_RX_STA&0x8000)
		{
    
    					   
			len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
			for(t=0;t<len;t++)
			{
    
    
				USART1->DR=USART_RX_BUF[t];
				while((USART1->SR&0X40)==0);//等待发送结束
			}
			USART_RX_STA=0;
		}else
		{
    
    
			times++;
			delay_ms(10);   
		}
	}

猜你喜欢

转载自blog.csdn.net/Thousand_drive/article/details/126312092