微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于串口多字节通信

关于串口多字节通信

时间:10-02 整理:3721RD 点击:
关于串口多字节通信,这个是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;*/
         
}

接收数据的时候用的是中断,每次中断发生,只能是接收到一个字节的数据,不应该在中断中做循环去接受数据,这样的话,只能接收到一个字节的数据。多字节数据传输要进行校验,做成一个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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top