OpenEdv-开源电子网

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

串口存储数据问题

[复制链接]

27

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2014-4-29
在线时间
6 小时
发表于 2014-11-22 11:27:24 | 显示全部楼层 |阅读模式
5金钱






就是原子哥的那个串口程序, 上面是希望电脑端串口发送数据101.1,在单片机上能得到101.1这个数据。但是现在是每一个字符占据一个字节,应该怎么弄能把数据USART_RX_BUF1接受的数据还原成101.1呢?

最佳答案

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

字符转换函数atof(将字符串转换成浮点型数) atoi(将字符串转换成整型数) atol(将字符串转换成长整型数)  strtod(将字符串转换成浮点数) strtol(将字符串转换成长整型数)  strtoul(将字符串转换成无符号长整型数),或者一开始就用十六进制格式发送数据
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1369
金钱
1369
注册时间
2014-2-13
在线时间
169 小时
发表于 2014-11-22 11:27:25 | 显示全部楼层
字符转换函数atof(将字符串转换成浮点型数) atoi(将字符串转换成整型数) atol(将字符串转换成长整型数)  strtod(将字符串转换成浮点数) strtol(将字符串转换成长整型数)  strtoul(将字符串转换成无符号长整型数),或者一开始就用十六进制格式发送数据
回复

使用道具 举报

17

主题

293

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
金钱
388
注册时间
2012-12-26
在线时间
1 小时
发表于 2014-11-22 11:27:25 | 显示全部楼层
atof(char *pdata) 返回pdata指向的串的浮点数,知道怎么用了么?
回复

使用道具 举报

31

主题

161

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2013-4-22
在线时间
7 小时
发表于 2014-11-22 12:22:51 | 显示全部楼层
你这是字符形式的101.1,,你换算成十进制的不就行了
http://www.tudou.com/programs/view/h5G_H9Kpk04/?bid=03&pid=1&resourceId=375113802_03_05_01
回复

使用道具 举报

27

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2014-4-29
在线时间
6 小时
 楼主| 发表于 2014-11-22 15:09:55 | 显示全部楼层
回复【3楼】solo:
---------------------------------
能具体点举个例子吗?例如就是这个101.1
真的不咋懂这个函数怎么用啊?感觉1 0 1 . 1分别占一个字节,怎么和在一起啊?
回复

使用道具 举报

27

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2014-4-29
在线时间
6 小时
 楼主| 发表于 2014-11-22 19:38:16 | 显示全部楼层
回复【2楼】华夏小川:
---------------------------------
能具体点举个例子吗?例如就是这个101.1 
真的不咋懂这个函数怎么用啊?感觉1 0 1 . 1分别占一个字节,怎么和在一起啊?谢啦
回复

使用道具 举报

27

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2014-4-29
在线时间
6 小时
 楼主| 发表于 2014-11-23 08:36:15 | 显示全部楼层
高手,可以再具体点吗?我这c语言学的一般。。。

我百度下了atof这个函数,我现在是把每个字符存在一个数组元素里,而且我还需要存很多的(数之间用空格隔开),我怎么去分成不同的字符串啊?还有字符串的结束标志‘\0’怎么弄啊?

例如table【3】={32,31.30}(对应的是数字210)怎么用这个函数啊?麻烦帮写一下呗,辛苦了!
回复

使用道具 举报

27

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2014-4-29
在线时间
6 小时
 楼主| 发表于 2014-11-23 08:39:25 | 显示全部楼层
回复【6楼】kassandra:
---------------------------------
可以写char *a = “table[0],table[1],table[2]”吗?
回复

使用道具 举报

27

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2014-4-29
在线时间
6 小时
 楼主| 发表于 2014-11-23 08:48:34 | 显示全部楼层
回复【6楼】kassandra:
---------------------------------
如果我的table[200]存了好几个数据?怎么处理啊?
回复

使用道具 举报

17

主题

293

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
金钱
388
注册时间
2012-12-26
在线时间
1 小时
发表于 2014-11-23 11:27:53 | 显示全部楼层

回复【9楼】高天小圣:
---------------------------------
给你一个数据处理的参考,这里以发送一个数字类的字符串为例子:
如从电脑串口发送100.101,首先你需要在串口中断程序中正确接收这7字节的数据(原子的中断函数可以完成该任务),收到数据后记得在数据后面加结束符。
如果一次只发送一个这样的数据,那么可以在任务函数里面直接使用atof(USART_RX_BUF),处理完后,将USART_RX_BUF清空,准备下一次接收。

如果你想一次接收多个 这样的字符型数字数据,然后在任务函数里面统一处理,那么可以这样设置数据结构:
最好的方法是自己定义一个传输协议,比如,一次传输先发送2个字节的后续数据的大小的值(方便后面申请缓存,最好不要超过USART_RX_BUF大小,否则要使用另外一种处理方式),如32字节,紧接着发送数据,一共4个数据,约定数据格式是每个数据后面跟一个0 
如这样排列:
“100.001”0“1234.501”0“5634.20”0“10.124”0   
然后在你的数据解析函数里面利用内存管理申请32字节的空间 pdata指向该缓存空间,在串口中断里面接收一个字节的数据就往pdata里丢一个字节的数据
待这批数据接收完毕后,在数据解析函数里面对这个长数组里的多个数据依次将其提取出来并转换成浮点数,转换的时候先检测下这一个长数组里一共有多少个数据,对0计数,如得到共有4个数据,那么接下来就可以用内存管理申请4个浮点型长度的缓存float *flatadata,并清零缓存。

void dataprocess()
{
char i =0,DataNum = 0;
........
DataNum = 检测pdata里有几个数据;
do
{
  
  *flatadata =(float)atof(pdata); //atof遇到0就结束了
  flatadata++;
  for(;;)
  {
    if(*pdata!=0)
pdata++;
    else
    {
     pdata++;
     break;
    }
   }
}while(i++<DataNum-1)  

释放pdata的缓存;

对得到的floatdata里的浮点数据处理完毕后记得释放floatdata的缓存;


 

回复

使用道具 举报

27

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2014-4-29
在线时间
6 小时
 楼主| 发表于 2014-11-23 11:55:45 | 显示全部楼层
回复【10楼】kassandra:
---------------------------------
好啊! 不过还是弱弱的问一下  “100.001”0“1234.501”0“5634.20”0“10.124”0   字符串之间的0用串口调试助手怎么发送啊?
回复

使用道具 举报

27

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2014-4-29
在线时间
6 小时
 楼主| 发表于 2014-11-23 11:56:39 | 显示全部楼层
回复【10楼】kassandra:
---------------------------------
感激啊,帮忙指导了这么多,好人啊!
回复

使用道具 举报

17

主题

293

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
金钱
388
注册时间
2012-12-26
在线时间
1 小时
发表于 2014-11-23 13:02:17 | 显示全部楼层
回复【11楼】高天小圣:
---------------------------------
一般这样的数据序列是由程序生成的,如果要手动输入的话,这个0可以先输入了数字(被串口以字符发送)后切换成HEX模式,然后随后输入0。你也可以不用0来区分,用一个字符。例如‘|’,这样 就可以手动输入了,然后在检测数据个数的时候顺便将‘|’换成0,方便你后面转换
回复

使用道具 举报

27

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2014-4-29
在线时间
6 小时
 楼主| 发表于 2014-11-23 14:37:38 | 显示全部楼层
回复【13楼】kassandra:
---------------------------------
思路很明了,谢啦!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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