打印
[N32G45x]

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

[复制链接]
1289|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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实现简单的定速驱动。

使用特权

评论回复
沙发
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 | 只看该作者
在手机上都可以玩程序了

使用特权

评论回复
5
yiy| | 2022-4-26 18:49 | 只看该作者
学会了一招。666

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:西安公路研究院南京院
简介:主要工作从事监控网络与通信网络设计,以及从事基于嵌入式的通信与控制设备研发。擅长单片机嵌入式系统物联网设备开发,音频功放电路开发。

1971

主题

15979

帖子

210

粉丝