本帖最后由 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[0] = '{';
- for(i=1;i<15;i++)
- cmd[i] = get_1byte();
- if(cmd[14]=='}')
- {
- x=cmd[12];
- 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实现简单的定速驱动。
|