单片机通过串口发送一个16位数

jackxiang 2010-3-28 00:26 | |
void send_data( long data)
{
SBUF=data;
while (TI== 0 );
TI= 0 ;
}
data是一个16位数,这个程序发送有问题吗?

这样怎么行啊。SBUF是8位的你发16位的。。。建议你分两次发,首先发高8位,然后发低八位,接收到后吧高8位向左移8位即A<<8。。。B是低8位这样就出来了DATA=A<<8|B.

有问题 SBUF寄存器是8位的 分2次才可以

一般来说你何必要这么发送呢,采用一个char型的8位数不是更好吗?
但是不一定出错,很多单片机都提供了促发传送的功能,也就是说,有一个FIFO队列,你可以一次写入2个或4个字节,这样的话就可以提高传送的效率和速度了,现在的单片机一般都带这个功能,所以说对于错很麻烦,光看这点东西是不行的

相当有问题,这么一来data的高8位被自动截掉了,确实得要分两次 ,如:对于1000,0XE8---低8位,0X03---高8位!


U8 a,b;
U16 c;
a = c|0x00ff;
c >>= 8;
b = c|0x00ff;
点击在新窗口中浏览此图片



00000011  :高位 十六进制:3  十进制:3
11111101  :地位 十六进制:FD  十进制:253

十六进制的高位+十六进制的低位 = 3FD  ===》转为:十进制等于:1021
1021/2047*70-10 = 24.91450903度



temp_value_height = ((temp_value >> 8) & 0xff) &0x7;

解释:
回忆未来(372647693)  19:09:29
我学php的。哈哈
石涛(47957728)  19:09:36
temp_value >> 8, 将高八位移位到低八位
回忆未来(372647693)  19:09:50
那低八位到哪儿去了?
石涛(47957728)  19:09:59
那个你就不用管了
石涛(47957728)  19:10:03
因为你不需要
回忆未来(372647693)  19:10:10
嗯,然后呢?
回忆未来(372647693)  19:10:30
& 0xff  ??
石涛(47957728)  19:10:31
& 0xff是将现在的数值的高8位清0
石涛(47957728)  19:11:01
& 0x7,就是取现在的数的低3位
回忆未来(372647693)  19:11:03
也就是刚才高八位移到低8位后高还是有东西的?
石涛(47957728)  19:11:56
因为移位之后是将原来的24~16位的移位到8~15了
石涛(47957728)  19:12:18
如果你的temp_value是个32位数的话








http://zhidao.baidu.com/question/110038192.html

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/2870/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2010-3-28 19:09
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]