|
楼主 |
发表于 2019-1-9 13:06:07
|
显示全部楼层
void mb_gncl(void); // 功能处理
#define MBID 2 /* 从机站号 */
#define MBZJG 1 /* 帧间隔时间(按波特率调整) */
#define MBSIZE 14 /* 缓存大小 */
uchar mmbbuf[MBSIZE]; // mod缓存
uchar mmbgs; // mod数据个数,从1开始
uchar mmbjs; // mod帧间计时(用于判断帧尾)/出错码/mod发送指针(从0开始)
uchar mmbzt; // mod状态
#define DEkz PORTD.2 /* PD2为485发送控制 */
#define Dreg UDR /* 收发数据寄存器 */
/***/
interrupt [USART_RXC] void mb_rx(void) // 接收缓存非空中断
{
uchar nrxd=Dreg; // 读接受缓存
if(mmbzt<=2)
{
mmbjs=0; // 复位帧间计时
switch (mmbzt)
{
case 0:
mmbgs=1;
mmbbuf[0]=nrxd; // 站点ID
if(nrxd==MBID) mmbzt=1; else mmbzt=2; // 是本机站号转后续字节,否则等待帧结束
break;
case 1:
if(mmbgs<(MBSIZE-1)) mmbbuf[mmbgs++]=nrxd; else mmbzt=2; // 装入后续字节,超量则等待帧结束
break;
}
}
}
/***/
interrupt [USART_TXC] void mb_tx(void) // TXC发送完成中断 DRE→Dreg空中断
{
同主机模式
}
/***/
void mb_zjjs(void) // 帧间计时判断
{
同主机模式
}
/***/
void mb_slave(void)
{
uint ncrc;
if(mmbzt==8) // 收到一帧数据
{
if(mmbgs>=5) // 至少5字节
{
if(mb_crc16(mmbbuf,mmbgs)==0) // crc校验正确
{
mmbjs=0; // 出错码清0
mb_gncl(); // 功能处理
if(mmbjs) // 如果有错误
{
mmbbuf[1]|=0x80; // 功能码最高位置1
mmbbuf[2]=mmbjs; // 错误码
mmbgs=3;
}
ncrc=mb_crc16(mmbbuf,mmbgs); // 计算crc
mmbbuf[mmbgs++]=ncrc; // crc低字节
mmbbuf[mmbgs++]=ncrc>>8; // crc高字节
mmbjs=0; // 发送指针
DEkz=1; Dreg=mmbbuf[mmbjs++]; // 485芯片DE高电平,启动发送
mmbzt=6; // 置为发送状态
return;
}
}
mmbzt=0; // 回空闲状态
}
}
/***/ |
|