本帖最后由 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实现简单的定速驱动。
|