请教关于串口协议
初学单片机,对于串口协议这块有点不明白,特来请教各位大大下面是程序,现在是可以正常运行的,串口接收到字数据后能做出动作,我现在想改动一下,写成通讯协议的方式
比如: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;
} 关注,请参考MODBUS协议。 以帧为单位,接收完一帧之后置标志位,在主函数中做帧处理。
最好在帧中增加帧长:SYNC+LEN+M/S+CMD+END 。可以接收不同长度的帧
接收到SYNC之后,读取帧长度,以帧长度为条件接收剩下的字节。接收完置标志位,清相关标志位 对 现在一般都是modbus协议用的多
页:
[1]