OpenEdv-开源电子网

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

原子哥,STM32的串口发送函数USART_SendData()怎么发送一个结构体数据?

[复制链接]

30

主题

97

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2016-4-13
在线时间
67 小时
发表于 2017-7-12 10:26:16 | 显示全部楼层 |阅读模式
1金钱
原子哥,STM32的串口发送函数USART_SendData()怎么发送一个结构体数据?
USART_SendData函数如下:

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_DATA(Data));

  /* Transmit Data */
  USARTx->DR = (Data & (uint16_t)0x01FF);
}

最佳答案

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

定义u8*p=u8*(temp); 然后发送p指向的值就行了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165359
金钱
165359
注册时间
2010-12-1
在线时间
2110 小时
发表于 2017-7-12 10:26:17 | 显示全部楼层
刺客_奋斗的菜鸟 发表于 2017-7-12 17:14
我改成这样,但还是打印不出来我想需要的内容:
typedef __packed struct{
    u8  num;

定义u8*p=u8*(temp);
然后发送p指向的值就行了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

33

主题

197

帖子

0

精华

高级会员

Rank: 4

积分
587
金钱
587
注册时间
2015-1-9
在线时间
80 小时
发表于 2017-7-12 12:16:12 | 显示全部楼层
第二个参数才是要发送的数据。楼主可以读一下这个库函数上面的说明。
君子性非异也,善假于物也
不知常,妄作,凶
纵浪大化中,不喜亦不惧,应尽便须尽,无复独多虑
路漫漫其修远兮,吾将上下而求索
菩萨畏因,凡夫畏果
回复

使用道具 举报

30

主题

97

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2016-4-13
在线时间
67 小时
 楼主| 发表于 2017-7-12 15:09:27 | 显示全部楼层
本帖最后由 刺客_奋斗的菜鸟 于 2017-7-12 15:13 编辑
XUZJWWSZ 发表于 2017-7-12 12:16
第二个参数才是要发送的数据。楼主可以读一下这个库函数上面的说明。

我是这样写的:
typedef struct{
    u8  num;
    u8 data[2];
}Temp;
Temp tem;
int main(void)
{
     u8  i,len;
     tem.num = 10;
     tem.data[0] = 50;
     tem.data[1] = 30;         
     ...................// 此处串口初始化省略
     len = sizeof(tem);
     while(len--){
         USART_SendData(USART1,(u8)&tem+i);
         while(USART_GetFlagStatus(USART1, USART_FLAG_TC));
    }
    while(1){
    }
}
但是打印出来的内容不是我对结构体成员赋的值。




回复

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2017-5-19
在线时间
15 小时
发表于 2017-7-12 16:40:25 | 显示全部楼层
首先len是不是结构体的长度要确定,因为虽然结构体里是u8但是有些编译器会针对32位机转成u32,那么len就变成4了,具体这个会不会这样编译要先确定。其次,你的i并没有改变。
回复

使用道具 举报

30

主题

97

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2016-4-13
在线时间
67 小时
 楼主| 发表于 2017-7-12 17:14:16 | 显示全部楼层
黄志豪 发表于 2017-7-12 16:40
首先len是不是结构体的长度要确定,因为虽然结构体里是u8但是有些编译器会针对32位机转成u32,那么len就变 ...

我改成这样,但还是打印不出来我想需要的内容:
typedef __packed struct{
    u8  num;
    u8 data[2];
}Temp;

Temp tem;

int main(void)
{
     u8  i,len;
     tem.num = 0x10;
     tem.data[0] = 0x50;
     tem.data[1] = 0x30;  
     delay_init();       
     uart_init(38400);                  
     while(1){
           len = sizeof(tem);
           i = 0;
           while(len--){
                i++;
               USART_SendData(USART1,(u8)&tem+i);
               while(USART_GetFlagStatus(USART1, USART_FLAG_TXE));
            }
                       
        delay_ms(1000);
        delay_ms(1000);                       
    }
}
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2017-3-28
在线时间
3 小时
发表于 2017-7-12 17:57:43 | 显示全部楼层
(tem+i)?
回复

使用道具 举报

30

主题

97

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2016-4-13
在线时间
67 小时
 楼主| 发表于 2017-7-13 08:53:41 | 显示全部楼层
那发送数据,也只能这样p->num,第二位再传p->data[0],再p->data[1]
回复

使用道具 举报

30

主题

97

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2016-4-13
在线时间
67 小时
 楼主| 发表于 2017-7-13 09:02:41 | 显示全部楼层

您就教怎么写就可以了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-12-18 16:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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