gaoyang9992006 发表于 2022-3-7 17:14

[N32G45x] +串口的收发与解指令

本帖最后由 gaoyang9992006 于 2022-4-12 17:24 编辑

@21小跑堂 本开发板默认调试器使用了USART1,对应开发板上的针脚为PA9与PA10
#define USARTx          USART1
#define USARTx_GPIO   GPIOA
#define USARTx_CLK      RCC_APB2_PERIPH_USART1
#define USARTx_GPIO_CLK RCC_APB2_PERIPH_GPIOA
#define USARTx_RxPin    GPIO_PIN_10
#define USARTx_TxPin    GPIO_PIN_9厂家提供的例子默认RX为输入浮空,本次测试通过针脚PA10,同时连接USB(用于电脑端上位机监视收发过程)与外部模块USART1连接WIFI串口模块后发现不能实现接收,可正常发送。
厂家初始化的模式为
    /* Configure USARTx Tx as alternate function push-pull */
    GPIO_InitStructure.Pin      = USARTx_TxPin;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF_PP;
    GPIO_InitPeripheral(USARTx_GPIO, &GPIO_InitStructure);

    /* Configure USARTx Rx as input floating */
    GPIO_InitStructure.Pin       = USARTx_RxPin;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitPeripheral(USARTx_GPIO, &GPIO_InitStructure);将RX的模式改为GPIO_Mode_AF_PP即可实现同时跟PC通信,又可以跟串口模块通信。
接收到一个字符的函数
uint8_t get_1byte(void)
{
      uint8_t ch;
      while (USART_GetFlagStatus(USARTx, USART_FLAG_RXDNE) == RESET)
      {
      }
      ch = (USART_ReceiveData(USARTx)&0xFF);
//      printf("%c",ch);
      return ch;
}因为我们使用的是位宽为8bit的通信,所以有那个0xFF,其实不这个操作也会自动消除掉高位的0,目的就是告诉自己这是8位的。
解指令:
通过一串冗余的字符串,从中找出指令。
         while(get_1byte()=='{')
      {
            cmd = '{';
            for(i=1;i<15;i++)
                cmd = get_1byte();
            if(cmd=='}')
            {
                x=cmd;
                switch(x)
                {
                case 'U':
                  up();
                  printf("UP\n");
                  break;
                case 'D':
                  down();
                  printf("DOWN\n");
                  break;
                case 'L':
                  left();
                  printf("LEFT\n");
                  break;
                case 'R':
                  right();
                  printf("RIGHT\n");
                  break;
                case 'S':
                  stop();
                  printf("STOP\n");
                  break;
                }
            }
      }
这是手机APP发送完指令给的回显,就是上面代码中的printf来的消息。
你能看出来我的完整指令格式是什么样的吗?
下一个贴将会集成上指令的执行,先通过IO实现简单的定速驱动。

huquanz711 发表于 2022-3-7 20:42

手机APP自己写的吗?

gaoyang9992006 发表于 2022-3-7 21:19

huquanz711 发表于 2022-3-7 20:42
手机APP自己写的吗?

是的

海滨消消 发表于 2022-3-8 16:48

在手机上都可以玩程序了

yiy 发表于 2022-4-26 18:49

学会了一招。666
页: [1]
查看完整版本: [N32G45x] +串口的收发与解指令