pepsi_dev 发表于 2011-7-11 15:53:04

请教关于串口协议

初学单片机,对于串口协议这块有点不明白,特来请教各位大大
下面是程序,现在是可以正常运行的,串口接收到字数据后能做出动作,我现在想改动一下,写成通讯协议的方式
比如:SYNC+M/S+CMD+END
其中SYNC和END固定,当然END也可以用常见的校验码的形式,M/S用来判断主从机,01是Master to Slave,00是Slave to Master,CMD就是下面代码中的"F""R""S"等。

拜谢!!


#include <reg51.h>

#define uchar unsigned char
#define uint unsigned int

sbit PULS=P0^0;
sbit EN=P0^1;
sbit DIR=P0^2;

//-------------------------------------------
//延时
//-------------------------------------------

void Delay(uint x)
{
        uchar i;
        while(x--) for(i = 0;i<43; i++); //100us*X
}


//-------------------------------------------
//设置串口中断
//-------------------------------------------
void InitUART(void)
{
    TMOD = 0x20;
    SCON = 0x50;
    TH1 = 0xFD;
    TL1 = TH1;
    PCON = 0x00;
    EA = 1;
    ES = 1;
    TR1 = 1;
}

/*
void SendOneByte(unsigned char c)
{
    SBUF = c;
    while(!TI);
    TI = 0;
}
*/

void main(void)
{
    InitUART();
        PULS = ~PULS;        //输出脉冲
        Delay(5);
}

void UARTInterrupt(void) interrupt 4
{
    if(RI)
    {
      RI = 0;
      switch(SBUF)
                {
                        case'F': EN = 1; DIR = 1; break;
                        case'R': EN = 1; DIR = 0; break;
                        case'S': EN = 0; DIR = 1; break;
                        default : break;
                }
    }
    else
      TI = 0;
}

gongnn 发表于 2011-7-11 16:36:26

关注,请参考MODBUS协议。

fjh120 发表于 2011-7-11 16:53:53

以帧为单位,接收完一帧之后置标志位,在主函数中做帧处理。
最好在帧中增加帧长:SYNC+LEN+M/S+CMD+END 。可以接收不同长度的帧
接收到SYNC之后,读取帧长度,以帧长度为条件接收剩下的字节。接收完置标志位,清相关标志位

Timerunner321 发表于 2015-3-6 10:27:18

对 现在一般都是modbus协议用的多
页: [1]
查看完整版本: 请教关于串口协议