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

[复制链接]
 楼主| gaoyang9992006 发表于 2022-3-7 17:14 | 显示全部楼层 |阅读模式
本帖最后由 gaoyang9992006 于 2022-4-12 17:24 编辑

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

  6.     /* Configure USARTx Rx as input floating */
  7.     GPIO_InitStructure.Pin       = USARTx_RxPin;
  8.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  9. GPIO_InitPeripheral(USARTx_GPIO, &GPIO_InitStructure);
将RX的模式改为GPIO_Mode_AF_PP即可实现同时跟PC通信,又可以跟串口模块通信。
接收到一个字符的函数
  1. uint8_t get_1byte(void)
  2. {
  3.         uint8_t ch;
  4.         while (USART_GetFlagStatus(USARTx, USART_FLAG_RXDNE) == RESET)
  5.         {
  6.         }
  7.         ch = (USART_ReceiveData(USARTx)&0xFF);
  8. //        printf("%c",ch);
  9.         return ch;
  10. }
因为我们使用的是位宽为8bit的通信,所以有那个0xFF,其实不这个操作也会自动消除掉高位的0,目的就是告诉自己这是8位的。
解指令:
通过一串冗余的字符串,从中找出指令。
  1.            while(get_1byte()=='{')
  2.         {
  3.             cmd[0] = '{';
  4.             for(i=1;i<15;i++)
  5.                 cmd[i] = get_1byte();
  6.             if(cmd[14]=='}')
  7.             {
  8.                 x=cmd[12];
  9.                 switch(x)
  10.                 {
  11.                 case 'U':
  12.                     up();
  13.                     printf("UP\n");
  14.                     break;
  15.                 case 'D':
  16.                     down();
  17.                     printf("DOWN\n");
  18.                     break;
  19.                 case 'L':
  20.                     left();
  21.                     printf("LEFT\n");
  22.                     break;
  23.                 case 'R':
  24.                     right();
  25.                     printf("RIGHT\n");
  26.                     break;
  27.                 case 'S':
  28.                     stop();
  29.                     printf("STOP\n");
  30.                     break;
  31.                 }
  32.             }
  33.         }
111111111111111.jpg
这是手机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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2049

主题

16374

帖子

221

粉丝
快速回复 在线客服 返回列表 返回顶部