OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2481|回复: 2

想写一个串口发送控制电机转动。

[复制链接]

4

主题

8

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-4-21
在线时间
13 小时
发表于 2018-4-21 14:29:44 | 显示全部楼层 |阅读模式
3金钱
工程需求是用一组协议,通过串口以16位进制发送数据去控制电机,程序已经写好,但是不清楚如何发送数据。串口协议如下:        static uint8_t         state = 0;        static uint16_t speed_left_tmp = 0;
        static uint16_t speed_right_tmp = 0;
        static uint16_t speed_head_tmp = 0;
        static uint16_t dr_left_tmp = 0;
        static uint16_t dr_right_tmp = 0;
        static uint16_t dr_head_tmp = 0;
        static uint16_t check_sum = 0;

多次发送数据失败,求助如下:
1.不是很理解通过此协议发送是如何把原始数据变成16进制的数据的?
2.如何发送数据能使电机按照协议规定的运动?
3.附上位机协议的代码,此协议发送可以控制电机。
4.附定值PWM波控制电机,编码器串口读取到的数据,根据此数据发送电机不做相应的转动。
5.串口解析代码如下:
void usart1_decoder(uint8_t data){
       
        static uint8_t         state = 0;
        static uint16_t speed_left_tmp = 0;
        static uint16_t speed_right_tmp = 0;
        static uint16_t speed_head_tmp = 0;
        static uint16_t dr_left_tmp = 0;
        static uint16_t dr_right_tmp = 0;
        static uint16_t dr_head_tmp = 0;
        static uint16_t check_sum = 0;
        switch (state){
                case 0:
                        if(data == 254){                                
                                        state = 1;
                            check_sum += data;
                        }
                        break;
                case 1:
        if(data == 1){
                                  state = 2;
                                  check_sum += data;
                                }
        else{
          state = 0;
                                        check_sum = 0;
                                }
    break;
                case 2:
        dr_head_tmp = data;
        state = 3;
                    check_sum += data;
    break;
                case 3:
        speed_head_tmp = data;
        state = 4;
                                check_sum += data;
    break;
                case 4:
        dr_left_tmp = data;
        state = 5;
                                check_sum += data;
                break;
                case 5:
        speed_left_tmp = data;
        state = 6;
                    check_sum += data;
                break;
                case 6:
        dr_right_tmp = data;
        state = 7;
                    check_sum += data;
                break;
                case 7:
        speed_right_tmp = data;
        state = 8;
                    check_sum += data;
                break;
                case 8:
                          check_sum %= 256;
                    if(check_sum == data){
                                        speed_left = (dr_left_tmp)?speed_left_tmp-1)*speed_left_tmp;
                                        speed_right = (dr_right_tmp)?speed_right_tmp-1)*speed_right_tmp;
                                        speed_head = (dr_head_tmp)?speed_head_tmp-1)*speed_head_tmp;
                                }
                          state = 0;
                                check_sum = 0;
                                speed_left_tmp = 0;
              speed_right_tmp = 0;
              speed_head_tmp = 0;
                break;
        }
                usart1_reception_mark=sysTickUptime;                        //记录系统时间,超时速度清零
}

上位机协议

上位机协议

编码器读数

编码器读数
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

19

主题

246

帖子

0

精华

高级会员

Rank: 4

积分
608
金钱
608
注册时间
2017-9-21
在线时间
171 小时
发表于 2018-4-21 15:59:19 | 显示全部楼层
通信协议我基本都是移位或者强制类型转换两个操作来生成或者解析
回复

使用道具 举报

4

主题

8

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-4-21
在线时间
13 小时
 楼主| 发表于 2018-4-21 17:33:46 | 显示全部楼层
哆啦A萌 发表于 2018-4-21 15:59
通信协议我基本都是移位或者强制类型转换两个操作来生成或者解析

具体请问怎么操作,可以提供示例吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 06:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表