关于串口多字节通信

2019-07-15 17:51发布

关于串口多字节通信,这个是2个字节的,只能读到前面的,按快的有时候会只读到后面的。。求原因啊



#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;*/
         

}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
15条回答
曹铁军
2019-07-16 04:42
Golf_research 发表于 2015-7-2 09:16
假如你定义的数据包是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); //字符型

一周热门 更多>