OpenEdv-开源电子网

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

怎么用32的串口向电脑上位机发送结构体数据啊。。。

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2016-4-14
在线时间
0 小时
发表于 2016-4-14 00:36:51 | 显示全部楼层 |阅读模式
1金钱
求助啊。。。printf()和USART_SendData()不行啊。。。

最佳答案

查看完整内容[请看2#楼]

没有哪么简单, 这个要上位机与单片机之前的数据定义要一样, 取结构体数据的首地址,强制转化为8位的的数据指针, 算出要发送的结构体大小, 然后从头到尾发出去, 上位机收到数据后,将接收缓存区数组的首地强制转化为结构体指针, 然后按结构体的数据格式读出来! 比如要发送以下数据 typedef struct { u32 ZUOBIAO; //坐标 u8 BIANHAO; //电机编号 u ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

507

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3347
金钱
3347
注册时间
2013-4-10
在线时间
333 小时
发表于 2016-4-14 00:36:52 | 显示全部楼层
本帖最后由 likunxue 于 2016-4-14 04:36 编辑

没有哪么简单, 这个要上位机与单片机之前的数据定义要一样, 取结构体数据的首地址,强制转化为8位的的数据指针, 算出要发送的结构体大小, 然后从头到尾发出去, 上位机收到数据后,将接收缓存区数组的首地强制转化为结构体指针, 然后按结构体的数据格式读出来!
比如要发送以下数据

typedef struct
{       
u32 ZUOBIAO;                                    //坐标
u8 BIANHAO;                                     //电机编号
u8 BIAOZHI;                                     //校验码               
}DIANJIZUOBIAO;                              //串口电机坐标数据结构  


发送程序

/************************************************************************************
函数名: 发送工作坐标
调  用: RX_BMB(u8 rr1,u32 Dat)        
参  数: rr1 驱动器编号
返回值:
************************************************************************************/   
void RX_BMB(u8 rr1,u32 Dat)   
     {
     const int SIZE = sizeof(DIANJIZUOBIAO); //得要转送数据的大小     
     DIANJIZUOBIAO  BM;     //定义一个串口电机参数数据结构
     u8 *Bu = (u8*)&BM;     //定义一个8位的指针,首地址指向 BM;     
     u8 Byte,K,i;     
     BM.ZUOBIAO = Dat;      //装入坐标
     BM.BIANHAO = rr1;      //装入电机编号
     BM.BIAOZHI = 0xe5;     //装入校验码     
     SUA_ShiYongQuan();     //申请485总线使用权  
     for(i = 0; i< SIZE; i++)
        {       
        Byte = Bu;                  //取得要发送的数据        
        while((USART2->SR & 0x80)==0); //等待发送区空         
        USART2->DR = Byte & 0x7f;      //发送低7位        
        if(i == 0)K = ((Byte >> 7) & 0x07)|SUA_CLRINT; //初始化指令
        else{
            K = ((Byte >> 7) & 0x07)|SUA_QIEMIANCANSHU; //数据码
            }       
        while((USART2->SR & 0x80)==0); //等待发送区空  
        USART2->DR = K;                //发送高3位与指令码   
        }
     while((USART2->SR & 0x40)==0);    //等待发送结束
     OSMutexPost(sem_SUA);             //释放485使用权         
     }


接收处理

  DIANJIZUOBIAO *const P = (DIANJIZUOBIAO *)RX_Buf;    //这里将接收缓存区数组首地址强制转化为数据结构体指针
  if((P->BIAOZHI == 0xe5)&&(P->BIANHAO == SYS_QDQBH)) //数据接收正确
   {
   MoB.ZhiDingZuoBiao= P->ZUOBIAO;//坐标直接写入
   MoB.SuDu = 100;                                 
  SYS_CSPZBZJCQ |= 0x40;  
  }

回复

使用道具 举报

15

主题

317

帖子

0

精华

高级会员

Rank: 4

积分
854
金钱
854
注册时间
2015-2-12
在线时间
352 小时
发表于 2016-4-14 08:10:53 | 显示全部楼层
likunxue 发表于 2016-4-14 04:25
没有哪么简单, 这个要上位机与单片机之前的数据定义要一样, 取结构体数据的首地址,强制转化为8位的的数据指 ...

高人!
回复

使用道具 举报

22

主题

751

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1605
金钱
1605
注册时间
2015-6-10
在线时间
222 小时
发表于 2016-4-14 08:19:20 | 显示全部楼层
c语言指针的简单应用

你和我一样  c语言不过关
回复

使用道具 举报

1

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1183
金钱
1183
注册时间
2015-5-28
在线时间
149 小时
发表于 2016-4-14 09:08:59 | 显示全部楼层
很简单啊,把数据指针和长度传进去就好了~
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2020-8-14
在线时间
12 小时
发表于 2021-1-6 16:13:09 | 显示全部楼层
likunxue 发表于 2016-4-14 00:36
没有哪么简单, 这个要上位机与单片机之前的数据定义要一样, 取结构体数据的首地址,强制转化为8位的的数据指 ...

楼主可以发一份源代码么?这两天在网上找了很多资料但都移植不成功
回复

使用道具 举报

0

主题

15

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2019-8-21
在线时间
11 小时
发表于 2021-1-6 16:29:04 | 显示全部楼层
学习一下学习
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3874
金钱
3874
注册时间
2017-3-7
在线时间
1690 小时
发表于 2021-1-6 16:53:59 | 显示全部楼层
跟发数组类似
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-15 03:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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