打印

串口通信

[复制链接]
2989|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fengjiex|  楼主 | 2013-8-7 14:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
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个字节发送

使用特权

评论回复
5
fengjiex|  楼主 | 2013-8-7 15:49 | 只看该作者
coody 发表于 2013-8-7 15:43
强制转成4个字节发送

能否详细一点嘛

使用特权

评论回复
6
睡神耗子| | 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语言啊。

使用特权

评论回复
7
睡神耗子| | 2013-8-7 16:02 | 只看该作者
fengjiex 发表于 2013-8-7 15:49
能否详细一点嘛

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

同理
所有的数据结构都可以这样转换。。。。

使用特权

评论回复
8
fengjiex|  楼主 | 2013-8-7 16:07 | 只看该作者
睡神耗子 发表于 2013-8-7 16:00
朋友用共用体。。。。
union{
  uint8_t ch[4];

说的是,单片机是半路出家,现在又是单独做这个项目,有点骑虎难下了。
不知能否将你的UartSend()这个函数的源代码发给我吗?

使用特权

评论回复
9
睡神耗子| | 2013-8-7 16:15 | 只看该作者
本帖最后由 睡神耗子 于 2013-8-7 16:19 编辑
fengjiex 发表于 2013-8-7 16:07
说的是,单片机是半路出家,现在又是单独做这个项目,有点骑虎难下了。
不知能否将你的UartSend()这个 ...

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

void UartSend(uint8_t *dat,uint8_t len)
{
        uint8_t i;
        for(i=0;i<len;i++)
        {
                SBUF = dat[i];
                while(!TI);
                TI = 0;
        }
}


其中uint8_t
是typedef unsigned char uint8_t;

使用特权

评论回复
10
睡神耗子| | 2013-8-7 16:18 | 只看该作者
本帖最后由 睡神耗子 于 2013-8-7 16:20 编辑
fengjiex 发表于 2013-8-7 16:07
说的是,单片机是半路出家,现在又是单独做这个项目,有点骑虎难下了。
不知能否将你的UartSend()这个 ...

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

使用特权

评论回复
11
fengjiex|  楼主 | 2013-8-7 16:33 | 只看该作者
睡神耗子 发表于 2013-8-7 16:18
郁闷。刚才直接黏贴的代码。被识别为斜体了。。。

我用你给的代码在Proteus上面用Virtual Terminal仿真了一下,发送了一下“89.45”,Virtual Terminal显示的是“Bf”

使用特权

评论回复
12
睡神耗子| | 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是比较特殊的符号,我估计你应该是对了。

使用特权

评论回复
13
睡神耗子| | 2013-8-7 16:46 | 只看该作者
fengjiex 发表于 2013-8-7 16:33
我用你给的代码在Proteus上面用Virtual Terminal仿真了一下,发送了一下“89.45”,Virtual Terminal显示 ...

你试试48.81
显示应该是
BC=q

使用特权

评论回复
14
睡神耗子| | 2013-8-7 16:48 | 只看该作者
fengjiex 发表于 2013-8-7 16:33
我用你给的代码在Proteus上面用Virtual Terminal仿真了一下,发送了一下“89.45”,Virtual Terminal显示 ...

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

DataTypeConversion.rar

6.36 KB, 阅读权限: 10

数据转换工具

使用特权

评论回复
15
qzc13457| | 2013-8-7 17:17 | 只看该作者
转换成字符串发送,接受了再转换成float。

使用特权

评论回复
16
草民| | 2013-8-7 19:25 | 只看该作者
学习学习~~~~

使用特权

评论回复
17
罗那尓多| | 2013-8-7 20:10 | 只看该作者
很好,收益了

使用特权

评论回复
18
iceyu| | 2013-8-7 21:11 | 只看该作者
注意大小端和符号数问题。只要上位和单片机统一起来就可以。不过,我不知道有什么串口调试工具可以直接现实float,我以前做陀螺仪的时候,上位机程序都是自己写的。

使用特权

评论回复
19
睡神耗子| | 2013-8-8 08:27 | 只看该作者
iceyu 发表于 2013-8-7 21:11
注意大小端和符号数问题。只要上位和单片机统一起来就可以。不过,我不知道有什么串口调试工具可以直接现实 ...

朋友回答的挺好。

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

朋友用的什么IC?  我借鉴一下

使用特权

评论回复
20
lk07828| | 2013-8-8 09:09 | 只看该作者
学习的时候看过共用体,一直没有用到,这下知道了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

17

帖子

0

粉丝