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

文章目录

  • 前言
  • MaixII-Dock使用UART
  • python串口模块
  • MaixII-Dock串口收发
  • MaixII-Dock与stm32串口通讯

  • 前言

      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);   
    		}
    	}
    
    物联沃分享整理
    物联沃-IOTWORD物联网 » MaixII-Dock(v831)学习笔记——UART

    发表评论