写在前面

之前我已经写了如何利用STM32CubeMX实现配置STM32F103C8Tx芯片,传送门在下面
STM32CubeMX配置STM32F103C8Tx芯片制作串口数据管理器
那么这篇博客将分享基于应答式的串口管理器的数据收发方案,在之后的内容中将STM32F103C8Tx串口管理器简称为103

流程图

效果展示

拨片架往右移动然后拨片拨取货物

拨片架往左移动然后准备拨取货物

测试环境以及结果

所有应答命令关系如下

下图就是我的测试环境,其中与USB-HUB连接的3个USB-TTL分别代表了103与树莓派,丝杆驱动板,拨片驱动板的通信串口,因为测试环境下只是为了查看串口逻辑是否正确,即对应的串口能否正常收发数据,所以就用USB-TTL来查看串口,并没有将103的串口接到驱动板上。

首先是树莓派下行数据,103接收到数据后会发送一个数据确认帧‘*’,从下图中可以看到当COM5(PI)发送了数据之后,COM3(SCREW)准确接收到了命令,并且将命令通过USB-TTL发送给了PC机

当丝杆完成移动了之后,丝杆控制板发送动作完成确认帧‘!’,103接收到丝杆动作完成帧之后将拨片驱动命令发送到COM30(SERVO)

当拨片驱动板完成任务之后,发送命令完成帧‘#’给103,此时103会意识到整个动作已经完成了,会发送动作完成帧‘?’给树莓派,告诉树莓派移动丝杆并且拨取货物的动作已经完成,至此,整个拨取机构的控制就完成了

程序分析

首先是main函数里面的循环,在这个循环里面我们一直监视着103与树莓派通信的串口,等待树莓派下行的命令,其中,树莓派下行的命令将以‘|’字符开头

char pi_serial[7] = {'\0'};
char screw_serial[3] = {'\0'};
char servo_serial[4] = {'\0'};
char reply_pi;
char get_servo;
char get_screw;

while (1)
{
    if(!HAL_UART_Receive(&PI_SERIAL,(uint8_t *)pi_serial,6,0XFFFF)){//接收到树莓派的消息

        if(pi_serial[0] == '|'){
            reply_pi = '*';
            HAL_UART_Transmit(&PI_SERIAL,(uint8_t *)&reply_pi,1,0XFFFF);
            screw_serial[0] = pi_serial[1];
            screw_serial[1] = pi_serial[2];
            servo_serial[0] = pi_serial[3];
            servo_serial[1] = pi_serial[4];
            servo_serial[2] = pi_serial[5];
            SerialControl();
        }

    }else{
        HAL_Delay(50);
    }

当103接收到树莓派命令,并将命令分解之后,先将丝杆移动命令发送给丝杆控制板,当丝杆移动完毕之后再将拨片拨取命令发送给拨片驱动板

void SerialControl()
{
    uint8_t rece_flag = 0;
    HAL_UART_Transmit(&SCREW_SERIAL,(uint8_t *)(&screw_serial),sizeof(screw_serial),0XFFFF);
    while(!rece_flag){
        if(!HAL_UART_Receive(&SCREW_SERIAL,(uint8_t *)(&get_screw),sizeof(get_screw),0XFFFF)){
            if(get_screw == '@'){
                while(1){
                    if(!HAL_UART_Receive(&SCREW_SERIAL,(uint8_t *)(&get_screw),sizeof(get_screw),0XFFFF)){
                        if(get_screw == '!'){
                                rece_flag = 1;
                                break;
                        }
                    }else{
                        HAL_Delay(50);
                    }
                }
            }
        }
    }

    rece_flag = 0;
    HAL_UART_Transmit(&SERVO_SERIAL,(uint8_t *)(&servo_serial),sizeof(servo_serial),0XFFFF);
    while(!rece_flag){
        if(!HAL_UART_Receive(&SERVO_SERIAL,(uint8_t *)(&get_servo),sizeof(get_servo),0XFFFF)){
            if(get_servo == '&'){
                while(1){
                    if(!HAL_UART_Receive(&SERVO_SERIAL,(uint8_t *)(&get_servo),sizeof(get_servo),0XFFFF)){
                        if(get_servo == '#'){
                                rece_flag = 1;
                                break;
                        }
                    }else{
                        HAL_Delay(50);
                    }
                }
            }
        }
    }
    reply_pi = '?';
    HAL_UART_Transmit(&PI_SERIAL,(uint8_t *)&reply_pi,1,0XFFFF);
}

(づ ̄3 ̄)づ╭❤~一键三连,这次一定(๑•̀ㅂ•́)و✧