串口通信

[复制链接]
 楼主| fengjiex 发表于 2013-8-7 14:52 | 显示全部楼层 |阅读模式
要做一个与上位机的通信,将SHT10转换好的float类型温湿度值上传到上位机上。一般的串口程序都是用指针的方式传输字符串,不知有没有直接传输float类型数值的源代码。
ayb_ice 发表于 2013-8-7 15:17 | 显示全部楼层
不就是4个字节吗
 楼主| fengjiex 发表于 2013-8-7 15:43 | 显示全部楼层
ayb_ice 发表于 2013-8-7 15:17
不就是4个字节吗

如果我用的串口程序如下:
void putc(uchar c)
{
        SBUF=c;
        while(TI==0);
        TI=0;
}
void putstr(uchar *s)
{
        while(*s!='\0')
        {
                putc(*s);
                s++;
                delay(5);
        }
}
但是我在main函数里要传输一个float类型的变量temp=89.48,代码如下:
putstr(temp);
这样的结果会因为类型不一致而编译错误的。
coody 发表于 2013-8-7 15:43 | 显示全部楼层
强制转成4个字节发送
 楼主| fengjiex 发表于 2013-8-7 15:49 | 显示全部楼层
coody 发表于 2013-8-7 15:43
强制转成4个字节发送

能否详细一点嘛
睡神耗子 发表于 2013-8-7 16:00 | 显示全部楼层
fengjiex 发表于 2013-8-7 15:49
能否详细一点嘛

朋友用共用体。。。。
union{
  uint8_t ch[4];
  float f;
}f32;

f32.f = x;//你的浮点数
UartSend(f32.ch,4);//输出用数组

朋友还要好好看看C语言啊。
睡神耗子 发表于 2013-8-7 16:02 | 显示全部楼层
fengjiex 发表于 2013-8-7 15:49
能否详细一点嘛

至于上位机的,也同样可以用共用体。
基本上每种语言都有这个结构的。。

同理
所有的数据结构都可以这样转换。。。。
 楼主| fengjiex 发表于 2013-8-7 16:07 | 显示全部楼层
睡神耗子 发表于 2013-8-7 16:00
朋友用共用体。。。。
union{
  uint8_t ch[4];

说的是,单片机是半路出家,现在又是单独做这个项目,有点骑虎难下了。
不知能否将你的UartSend()这个函数的源代码发给我吗?
睡神耗子 发表于 2013-8-7 16:15 | 显示全部楼层
本帖最后由 睡神耗子 于 2013-8-7 16:19 编辑
fengjiex 发表于 2013-8-7 16:07
说的是,单片机是半路出家,现在又是单独做这个项目,有点骑虎难下了。
不知能否将你的UartSend()这个 ...

这个其实跟你的要求写了,
我这是用51单片机写的。

  1. void UartSend(uint8_t *dat,uint8_t len)
  2. {
  3.         uint8_t i;
  4.         for(i=0;i<len;i++)
  5.         {
  6.                 SBUF = dat[i];
  7.                 while(!TI);
  8.                 TI = 0;
  9.         }
  10. }


其中uint8_t
是typedef unsigned char uint8_t;
睡神耗子 发表于 2013-8-7 16:18 | 显示全部楼层
本帖最后由 睡神耗子 于 2013-8-7 16:20 编辑
fengjiex 发表于 2013-8-7 16:07
说的是,单片机是半路出家,现在又是单独做这个项目,有点骑虎难下了。
不知能否将你的UartSend()这个 ...

郁闷。刚才直接黏贴的代码。被识别为斜体了。。。

 楼主| fengjiex 发表于 2013-8-7 16:33 | 显示全部楼层
睡神耗子 发表于 2013-8-7 16:18
郁闷。刚才直接黏贴的代码。被识别为斜体了。。。

我用你给的代码在Proteus上面用Virtual Terminal仿真了一下,发送了一下“89.45”,Virtual Terminal显示的是“Bf”
睡神耗子 发表于 2013-8-7 16:44 | 显示全部楼层
fengjiex 发表于 2013-8-7 16:33
我用你给的代码在Proteus上面用Virtual Terminal仿真了一下,发送了一下“89.45”,Virtual Terminal显示 ...

你用的是Proteus仿真啊。
不好意思,我不会用。。。
不过代码是没问题的。

你检查一下。89.45用字节数组应该是0x42,0xB2,0xE6,0x66,如果是ASCII表示
Bxxf
其中xx是比较特殊的符号,我估计你应该是对了。
睡神耗子 发表于 2013-8-7 16:46 | 显示全部楼层
fengjiex 发表于 2013-8-7 16:33
我用你给的代码在Proteus上面用Virtual Terminal仿真了一下,发送了一下“89.45”,Virtual Terminal显示 ...

你试试48.81
显示应该是
BC=q
睡神耗子 发表于 2013-8-7 16:48 | 显示全部楼层
fengjiex 发表于 2013-8-7 16:33
我用你给的代码在Proteus上面用Virtual Terminal仿真了一下,发送了一下“89.45”,Virtual Terminal显示 ...

你可以用这个工具做一下测试。
我自己写的
是各种数据格式之间转换用的。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
qzc13457 发表于 2013-8-7 17:17 | 显示全部楼层
转换成字符串发送,接受了再转换成float。
草民 发表于 2013-8-7 19:25 | 显示全部楼层
学习学习~~~~
罗那尓多 发表于 2013-8-7 20:10 | 显示全部楼层
很好,收益了
iceyu 发表于 2013-8-7 21:11 | 显示全部楼层
注意大小端和符号数问题。只要上位和单片机统一起来就可以。不过,我不知道有什么串口调试工具可以直接现实float,我以前做陀螺仪的时候,上位机程序都是自己写的。
睡神耗子 发表于 2013-8-8 08:27 | 显示全部楼层
iceyu 发表于 2013-8-7 21:11
注意大小端和符号数问题。只要上位和单片机统一起来就可以。不过,我不知道有什么串口调试工具可以直接现实 ...

朋友回答的挺好。

话说我原来也想弄个陀螺仪做角度测量用,没精力就忘了做了。

朋友用的什么IC?  我借鉴一下
lk07828 发表于 2013-8-8 09:09 | 显示全部楼层
学习的时候看过共用体,一直没有用到,这下知道了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

17

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部