串口助手发送字符型数据给单片机,比如发送1。单片机怎么接收?char a; a=SBUF,可以吗?

如题所述

你好,要利用串口传送,首先要设置单片机串行接口的工作方式,并且REN允许串行接控制位要为1(REN=1)以及设置传送的波特率,串口助手的波特率也要与之对应.并且确定单片机已经与电脑连接成功.连接成功后.在串行口中断程序,可以用a=SBUF来存到里,但a必须在前面定义不能char a; a=SBUF这样.虽然原理是这样.希望对你有帮助追问

我已经设置好了,C#写的上位机程序。发送的是string=“100”,问题:PC如何把数据发送给单片机,单片机如何处理数据。得到100;

追答

我明白你的意思了.你是发了100收到的不是100.那是进制问题.单片机收到的并不是100而是64吧.我把它化成BCD码就行了.
64÷10=6……4

即商是6,余数是4

如果将商乘以16再加上余数,就是:

6×16+4=100,其16进制数就是64H,即是十进制数64(16进制为40H)的BCD码为64H。

如果在单片机中,程序这么写:

char HEX,BCD;
BCD=(HEX/10*16)+(HEX%10);

其中HEX存储十六进制数,BCD中存储的就是其BCD码

追问

用的串口助手,字符格式。100

追答

那样的话你就发错了,单个字符发送区是0-F.不包括两位数的,那是几个字符不是一个字符

追问

是,是发错了。谢谢指出。但是我改发a,b,c后,P2=SBUF;P2一直显示0x7c。能加下我Q吗:470837921

追答

好吧

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-08-29
应该用十六进制发送!
#include<c8051f340.h>
void port_init()
{
XBR0=0X01; //UART 的TX0,TX1连到P0.4,P0.5
XBR1=0X40; //交叉开关使能
P0MDOUT=0X10; //P0.4配置为推挽,其他漏极开路

}
void uart0_init()
{
SCON0|=0X10;//UART0接收允许
CKCON=0X01;//系统时钟4分频
TH1=0X64;//波特率为9600
TL1=TH1;
TMOD=0X20;//方式2,8为自动装载定时器
TR1=1;//定时器1允许
TI0=1;//INT1边沿触发
}
void main()
{
unsigned char i;
port_init();
uart0_init();
while(1)
{
while(RI==0);//接收
i=SBUF;

RI=0;
if(i!='\0')
{
SBUF=i;
while(TI==0);//发送
TI=0;
i='\0';
}
}
}
看看后半部分,单片机接收到后RI被置0,进入while。。。。。追问

比如PC发送“100”,PC是如何发送的,单片机直接接收的是“100”还是怎么?

追答

这个没什么关系的,反正你只要想不管是什么类型的变量都是以二进制补码形式存在内存中的,所以你发送一个十进制数就相当于把这个数转换二进制补码形式发送到单片机,然后单片机就会把这个二进制补码再转换成十进制显示出来,其实由这个你还可以知道不同类型的数据怎么进行转换的。
发送100可以这样发1 0 0
试试

第2个回答  2011-08-29
接收要么采用查询方式,要么采用中断方式。
直接从SBUF取数并不可靠,无法确定此前是否发生了传输。
好好看书为上……追问

问题是:PC发送的字符型数据 单片机如何接收。

追答

若已经知道PC发送格式为字符型,直接按字符型接收处理便是。

第3个回答  2011-08-29
我的博客里有详细讲解,希望对你有帮助!http://hi.baidu.com/txz01/blog/item/7ae25df4919cf779dcc4743e.html
第4个回答  2011-08-29
传送的是BCD码
追问

能详细说下吗。接收如何处理。

相似回答