关于串口多字节通信
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit wela=P2^3;
sbit dula=P2^2;
uchar num,flag,a,j=0;
uint temp=0;
uchar r_table[2];
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar code w_table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void display(uchar num1);
void delay(uchar x)
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void init()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
}
void main()
{
init();
//RI=1;
while(1)
{
if(flag==1)
{
ES=0;
temp=0;
for(j=0;j<2;j++)
{
SBUF=r_table[j];
//TI=1;
while(!TI);
TI=0;
}
j=0;
ES=1;
flag=0;
}
display(a);
}
}
void display(uchar num1)
{
dula=1;
P0=table[num1/4096];
dula=0;
P0=0xff;
wela=1;
P0=w_table[0];
wela=0;
delay(2);
dula=1;
P0=table[num1%4096/256];
dula=0;
P0=0xff;
wela=1;
P0=w_table[1];
wela=0;
delay(2);
dula=1;
P0=table[num1%16/16];
dula=0;
P0=0xff;
wela=1;
P0=w_table[2];
wela=0;
delay(2);
dula=1;
P0=table[num1%16];
dula=0;
P0=0xff;
wela=1;
P0=w_table[3];
wela=0;
delay(2);
}
void sc() interrupt 4
{
RI=0;
for(j=0;j<2;j++)
{
r_table[j]=SBUF;
}
flag=1;
/* a=SBUF;
temp++;
a=a*256+SBUF;
flag=1;*/
}
接收数据的时候用的是中断,每次中断发生,只能是接收到一个字节的数据,不应该在中断中做循环去接受数据,这样的话,只能接收到一个字节的数据。多字节数据传输要进行校验,做成一个packet,接收到这个packet后去做处理.
如何做一个packet,我想要51单片机发送一个大于255的数值。
怎么做一个packet,我想用51单片机发一个大于255的数值。
51单片机如何发送多字节
那就是多字节传输,如果不进行数据的校验,那就是和单字节传输一样的。如果叫校验,自己可以定协议,比如自己定义开始位是0x99,那设备接收到0x99就知道是数据传送开始了,这是个简单的比喻,具体的情况具体以分析,比如0x99不能和数据位重合,要不然就会乱掉,总之数据传输的协议你可以自己设定。
假如你定义的数据包是3个字节,第一个字节是开始位,第二个字节是数据位,最后一个字节是结束位,那就三个自己给外设或者单片机,不要在一次中断中做循环去读写数据,因为发送一个字节才产生一次中断,就是说一次中断就是只能发送或者接受一个字节的数据,这就是小编代码遇到的问题,希望能帮到你!
void main()
{
UART_init(); //串口初始化
// while(1);
ds_change();
delay(1000);
while(1)
{
display(get_temperature());
ds_change();
tmp1 = get_temperature();
tx_buf[0]=0xff;
tx_buf[1]=0xee;
SBUF = tx_buf;
以上是下位机主函数,接收的数据是tx_buf[0]tx_buf[1]都是10
以下是上位机 vs2012
if(m_comm.get_CommEvent() == 2)
{
int str = 0;
long i = 0;
COleSafeArray SafeArray = m_comm.get_Input(); //第一步
int iLen = SafeArray.GetOneDimSize(); //第二步
// int iLen1 = 3;
BYTE revBuf[1024];
for(i = 0;i < iLen; i++)
{
SafeArray.GetElement(&i, revBuf + i);
BYTE bt=*(char*)(revBuf+i); //字符型
发送的数据与接收不符
发送数据与接收不符
SBUF = tx_buf;SBUF寄存器是八位的,你这样赋值不对,上位机接受的数据不会变,tx_buf++或者tx_buf,你先试一下吧
tx_buf[0]=0xff;
delay(1000);
tx_buf[1]=0xee;
SBUF = tx_buf;
我要发送这样的两个数据,tx_buf该怎么定义
tx_buf[0]和tx_buf[1]分别发送是可以的,
恩,就这样,SBUF = tx_buf,做个循环,两个字节之间作延迟。你用的什么温度传感器?DS18B20?
ds_change();
// display(get_temperature());
// ds_change();
// delay(1000);
tmpp = (get_temperature());
tx_buf[0]=(tmpp/10);
tx_buf[1]=(tmpp%100%10);
for( e=0;e<2;e++)
{
SBUF = tx_buf[e];
delay(1000);
}
已经做了个循环,但是数据不对,get_temperature()返回值是准确的
好吧 有可能是串口设置初始化的问题 波特率设置啥的 你不介意的话代码发我看一下 3041586290@qq.com