OpenEdv-开源电子网

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

串口接收数据

[复制链接]

25

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2016-3-24
在线时间
30 小时
发表于 2016-9-1 10:28:45 | 显示全部楼层 |阅读模式
1金钱
USART_ReceiveData(USART1)这个只能接收一位数据,比如我的串口发回来的是0x33 0x36 0x39,就只能收到最后一位,怎样才能把数据接收全呢

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2015-11-30
在线时间
39 小时
发表于 2016-9-1 10:30:19 | 显示全部楼层
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2016-9-1 10:35:55 | 显示全部楼层
串口接收寄存器只能放8位数据
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2016-8-31
在线时间
3 小时
发表于 2016-9-1 13:38:57 | 显示全部楼层
接受的数据存放到定义的数组里,每次接受一个就存到数组里。
回复

使用道具 举报

25

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2016-3-24
在线时间
30 小时
 楼主| 发表于 2016-9-1 19:52:56 | 显示全部楼层
bumbdong 发表于 2016-9-1 10:30
循环接收,放入数组

char USART_Receives()
{
        u8 i;
        char buffer[20];
        for (i=0;i<5;i++)
        {
                s = USART_ReceiveData(USART1)-48;
                sprintf(buffer,"%x",s);
        }
        return *buffer;
}
我这样做的,但是并没有实现,能帮我看一下为什么嘛?
回复

使用道具 举报

25

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2016-3-24
在线时间
30 小时
 楼主| 发表于 2016-9-1 19:53:08 | 显示全部楼层
huajiata 发表于 2016-9-1 13:38
接受的数据存放到定义的数组里,每次接受一个就存到数组里。

char USART_Receives()
{
        u8 i;
        char buffer[20];
        for (i=0;i<5;i++)
        {
                s = USART_ReceiveData(USART1)-48;
                sprintf(buffer,"%x",s);
        }
        return *buffer;
}
我这样做的,但是并没有实现,能帮我看一下为什么嘛?
回复

使用道具 举报

25

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2016-3-24
在线时间
30 小时
 楼主| 发表于 2016-9-1 20:41:56 | 显示全部楼层
ricefat 发表于 2016-9-1 10:35
串口接收寄存器只能放8位数据

我应该没有超吧
能帮我看一下我用这段代码有什么问题吗?谢谢
char USART_Receives()
{
        u8 i;
        char buffer[20];
        for (i=0;i<5;i++)
        {
                s = USART_ReceiveData(USART1)-48;
                sprintf(buffer,"%x",s);
        }
        return *buffer;
}
回复

使用道具 举报

6

主题

110

帖子

0

精华

高级会员

Rank: 4

积分
553
金钱
553
注册时间
2014-10-23
在线时间
195 小时
发表于 2016-9-1 21:56:52 | 显示全部楼层
天齐飞扬 发表于 2016-9-1 20:41
我应该没有超吧
能帮我看一下我用这段代码有什么问题吗?谢谢
char USART_Receives()

for循环里面,sprintf这样有意义吗?
回复

使用道具 举报

106

主题

418

帖子

0

精华

高级会员

Rank: 4

积分
764
金钱
764
注册时间
2016-7-26
在线时间
123 小时
发表于 2016-9-1 22:14:16 | 显示全部楼层
   for(DIV_Mantissa=0;DIV_Mantissa<20;DIV_Mantissa++)
   {
     data++;
         USART1->DR = data;
         while((USART1->SR & (1<<6)) == 0);            //这个不算读取SR;如果在定义BRR把USART1->SR付给BRR,当把这条语句加进去时TXE和TC都为0,就变成死循环了
   }
回复

使用道具 举报

106

主题

418

帖子

0

精华

高级会员

Rank: 4

积分
764
金钱
764
注册时间
2016-7-26
在线时间
123 小时
发表于 2016-9-1 22:17:43 | 显示全部楼层
不对吧,按照数据手册,RDR接收是并行接收啊
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2016-9-2 08:44:17 | 显示全部楼层
天齐飞扬 发表于 2016-9-1 20:41
我应该没有超吧
能帮我看一下我用这段代码有什么问题吗?谢谢
char USART_Receives()

你这段代码好像没有针对每次进来的8位数据进行分别存放,只是把一次进来的8位数据转换成十进制并返回。
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2778
金钱
2778
注册时间
2015-6-1
在线时间
394 小时
发表于 2016-9-2 08:55:31 | 显示全部楼层
        for (i=0;i<5;i++)
        {
                s = USART_ReceiveData(USART1)-48;
                sprintf(buffer,"%x",s);
        }
8楼说的对啊,这sprintf根本没意义啊。向同一个地址连存了5次
自在随心
回复

使用道具 举报

25

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2016-3-24
在线时间
30 小时
 楼主| 发表于 2016-9-2 09:38:52 | 显示全部楼层
ricefat 发表于 2016-9-1 10:35
串口接收寄存器只能放8位数据

如果只能存放8位数据那是不是发给它这一串0x33 0x36 0x39,就没办法接收了呀
回复

使用道具 举报

25

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2016-3-24
在线时间
30 小时
 楼主| 发表于 2016-9-2 09:41:10 | 显示全部楼层

可不可以提供个思路,怎么才能把像0x33 0x36 0x39这一串数据接收起来
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2016-9-2 10:17:29 | 显示全部楼层
天齐飞扬 发表于 2016-9-2 09:38
如果只能存放8位数据那是不是发给它这一串0x33 0x36 0x39,就没办法接收了呀

我建议你把开发板串口例程再看看,查询法中断法还有DMA发送接收是怎么回事。
回复

使用道具 举报

25

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2016-3-24
在线时间
30 小时
 楼主| 发表于 2016-9-2 10:21:21 | 显示全部楼层
ricefat 发表于 2016-9-2 10:17
我建议你把开发板串口例程再看看,查询法中断法还有DMA发送接收是怎么回事。

好的谢谢
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2778
金钱
2778
注册时间
2015-6-1
在线时间
394 小时
发表于 2016-9-2 10:37:53 | 显示全部楼层
天齐飞扬 发表于 2016-9-2 09:41
可不可以提供个思路,怎么才能把像0x33 0x36 0x39这一串数据接收起来

你开了一个长度为20的buffer,却一直在用buffer[0],存一个就+1呀就行了。每存一次需不需要清什么标志你自己找找例程,我感觉这么弄应该就行了。
自在随心
回复

使用道具 举报

15

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2015-11-30
在线时间
39 小时
发表于 2016-9-2 11:08:39 | 显示全部楼层
天齐飞扬 发表于 2016-9-1 19:53
char USART_Receives()
{
        u8 i;

你的缓存里面buffer地址始终没有更改过,所有数据始终放倒buffer[0]里面,后面的数据立马就把前面的数据覆盖buffer在存放了数据之后地址要增加
回复

使用道具 举报

25

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2016-3-24
在线时间
30 小时
 楼主| 发表于 2016-9-2 11:11:48 | 显示全部楼层
yuzeyuan1 发表于 2016-9-2 10:37
你开了一个长度为20的buffer,却一直在用buffer[0],存一个就+1呀就行了。每存一次需不需要清什么标志你 ...

奥奥,谢谢
回复

使用道具 举报

25

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2016-3-24
在线时间
30 小时
 楼主| 发表于 2016-9-2 11:12:04 | 显示全部楼层
bumbdong 发表于 2016-9-2 11:08
你的缓存里面buffer地址始终没有更改过,所有数据始终放倒buffer[0]里面,后面的数据立马就把前面的数据 ...

恩恩,好的我去修改一下看看
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-29 23:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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