03、单线通讯—SIF通讯协议(一线通)案例二

0、前言


  目前很多便宜的单片机都没有标准的串行通讯口UART,甚至没有IIC、SPI等接口,MCU外围硬件接口不够。但有时又需要和其它设备或者器件进行简单的通讯,速度要求不是很高,又或者说受硬件限制,只能提供一根通讯线来通讯,此时可以尝试使用SIF协议进行通讯。

  SIF协议因为它的简单,低成本,适用一些需要不高的场景。最近在调充电器,与电动车充电时需要和车子的BMS进行一线通讯。充电器DC端使用的三芯插头,一正极,一负极,一通信。电动车上的电池包作为主机,充电器作为从机,充电器一线通的那个脚要求带有上拉电阻。一线通上拉电阻值统一要求 5V上拉2.2K,3.3V上拉1K,充电器上拉电压给出,电池发送一线通报文。

1、硬件接线示意图


在这里插入图片描述
接线方式:

  主从双方采用单线单工通讯方式,即只需要一根传输线路,电动车电池BMS为数据发送方,充电器CHG为数据接收方。

波特率:

  主机和从机制定协议之前可以双方约定好,也可以主机随意,从机根据主机发送的同步信号,进行自适应解析。

2、通讯规则


2.1、数据帧组成

  一次传输一帧数据,每帧数据由 同步信号 + 主报文 + 停止信号 3个部分组成。

  1、同步信号为发送主报文的前导信号;

  2、主报文为需要发送的有效数据内容,按一定占空比进行发送;

  3、结束信号代表一帧完整的数据发送结束的标志信号

2.2、同步信号

  同步信号:T1ms的低电平+T2ms的高电平
在这里插入图片描述
  其中:T1 ≥ 10ms

     T2 = 1ms±100us

2.3、主报文

  采用高低电平占空比的方式进行数据报文发送。

  一对低电平和高电平组成一个bit数据位。在高电平的下降沿计算高电平的占空比,根据占空   比判断本次电平是逻辑"1"或逻辑"0"。
  占空比 η = T2 / T ( T2 为高电平时间,T=T1+T2 )。

2.3.1、逻辑“1”

  如上图所示,T1和T2组成一个数据位,该数据位占空比η为75%,表示数据位为逻辑"1"。

  注意:η = T2 / T =(75 ± 5)%

  其中:T1 = 0.5ms ± 50μs

              T2 = 1.5ms ± 150μs

              T = T1 + T2 = 2ms ± 200μs

2.3.2、逻辑“0”

在这里插入图片描述
  如上图所示,T1和T2组成一个数据位,该数据位占空比η为25%,表示数据位为逻辑"0"。

  注意:η = T2 / T =(25 ± 5)%

  其中:T1 = 1.5ms ± 150μs

              T2 = 0.5ms ± 50μs

              T = T1 + T2 = 2ms ± 200μs

2.4、结束信号

  结束信号:T1ms低电平 + Nms高电平
在这里插入图片描述
  其中:T1 = 5ms

2.5、通信间隔

  1、连续两帧数据的发送时间间隔位 50ms

  2、发送数据前,电池会检测总线电平,如果检测到总线电平位低电平,则认为总线未连接充
  电器,或者充电器未上电,此时电池包将停止数据发送;如果低电平持续时间达到60秒,则电
  池包进入低功耗模式。

  3、电池包在低功耗模式下,可以被总线高电平唤醒。唤醒后,如果电池包持续检测到总线电平
  为高电平,且高电平持续时间达到 1s ,则开始发送数据。电池包在正常发送下一帧报文之前,
  需要检测总线电平为高电平才能启动发送。

3、主报文格式


3.1、一线通报文格式

在这里插入图片描述
一线通报文由报文ID、协议版本、数据内容、校验字节四部分组成。

报文ID: 包括初始报文、周期报文
协议版本:包括次通信协议版本、主通信协议版本
校验字节:为报文ID、协议版本及数据内容(B0~B47)的和校验
备注: 数据内容中未用到的字节,填充0xFF
在这里插入图片描述

4、应用报文格式(主报文格式中的数据内容)


在这里插入图片描述

4.1、单字节传输方式

  应用报文每字节由 8 位二进制bit组成,b0 是字节的最低有效位,b7 是字节的最高有效位。
收发数据时,先传最低有效位 b0,再传次低有效位 b1,以此类推,最后传最高有效位 b7。

4.2、多字节传输方式

  收发多字节信号时,默认采用 Intel_LSB 格式进行数据传输,如上表信号distance所示,先传最
低字节 B43,再传次低字节 B44,以此类推,最后传最高字节 B46。

5、代码实现—纯定时器扫描方式+数组接收


/*******************************************************************************
 *Copyright (c) GeekYang
 *@文件名 : main.c
 *@作  者 : GeekYang
 *@时  间 : 2021-07-30 10:00:00
 *@摘  要 : 主程序文件
 *@芯  片 : STC8G1K08-TSSOP-20
 *@晶  振 : 33MHz/1
 *@版本号 : 1.0
 *@芯  片 :
 *										  -------------
 *			        T2/ECI/SS/ADC2/P1.2 -丨01       20丨- P1.1/ADC1/TxD2/CCP0
 *			      T2CLKO/MOSI/ADC3/P1.3 -丨02       19丨- P1.0/ADC0/RxD2/CCP1
 *	              I2CSDA/MISO/ADC4/P1.4 -丨03       18丨- P3.7/INT3/TxD_2/CCP2_2/CCP2/CMP+
 *				  I2CSCL/SCLK/ADC5/P1.5 -丨04       17丨- P3.6/ADC14/INT2/RxD_2/CCP1_2/CMP-
 *		  XTALO/MCLKO_2/RxD_3/ADC6/P1.6 -丨05       16丨- P3.5/ADC13/T1/T0CLKO/CCP0_2/SS_4
 *			      XTALI/TxD_3/ADC7/P1.7 -丨06       15丨- P3.4/ADC12/T0/T1CLKO/ECI_2/CMPO/MOSI_4
 *				         MCLKO/RST/P5.4 -丨07       14丨- P3.3/ADC11/INT1/MISO_4/I2CSDA_4 
 *				     Vcc/AVcc/ADC_VRef+ -丨08       13丨- P3.2/ADC10/INT0/SCLK_4/I2CSCL_4 
 *								   P5.5 -丨09       12丨- P3.1/ADC9/TxD
 *							   Gnd/AGnd -丨10       11丨- P3.0/ADC8/RxD/INT4
 *										  -------------			
*******************************************************************************/

/*================================= Demo说明 ===================================
由于有些单片机的外设资源比较缺乏,没有外部中断,但一般定时器都是有的,所以案例都采用
定时器扫描的方式进行波形解析,读取数据,即 利用 定时器 + 一个GPIO口进行通讯数据读取
==============================================================================*/


/* 包含的头文件 ---------------------------------------------------------------*/
#include "STC8G.H"

/* 宏定义 ---------------------------------------------------------------------*/
#define DATA_REV_PIN            P10     //定义数据接收引脚(根据实际项目进行更改)

#define LOW                     0       //低电平
#define HIGH                    1       //高电平

#define SYNC_L_TIME_NUM         200     //同步信号低电平时间:10ms = 10000us / 50us = 200
#define SYNC_H_TIME_NUM_MIN     18      //同步信号高电平最小时间:1ms-100us = 900us / 50us = 18  
#define SYNC_H_TIME_NUM_MAX     22      //同步信号高电平最大时间:1ms+100us = 1100us / 50us = 22

#define SHORT_TIME_NUM          23      //一个逻辑周期中短的时间最大值:1.1ms+50us = 1150us / 50us = 23
#define LONG_TIME_NUM           25      //一个逻辑周期中长的时间最小值:1.4ms-150us = 1250us / 50us = 25
#define LOGIC_CYCLE_NUM         44      //一个逻辑周期最大时间:2ms+200us = 2200us / 50us = 44
#define HALF_LOGIC_CYCLE        20      //一个逻辑周期的1/2最小时间:1msus = 1000us / 50us = 20

#define END_SIGNAL_TIME_NUM     100     //结束信号电平时间:5ms低电平 + Nms高电平,实际检测5ms低电平就行,一帧数据发送完成后检测5ms低电平就代表完成了,不发数据的时候上拉电阻拉高了

#define REV_BIT_NUM             8       //接收的bit位个数,看是按字节接收还是按字接收,1字节=8bit,1字=2字节=16bit
#define REV_DATA_NUM            51      //接收的数据个数


/* 类型定义 -------------------------------------------------------------------*/
typedef enum
{
    INITIAL_STATE=0,            //初始状态,等待接收同步信号
    SYNC_L_STATE=1,             //接收同步低电平信号状态
    SYNC_H_STATE=2,             //接收同步高电平信号状态
    DATA_REV_STATE=3,           //读取数据码电平状态
    END_SIGNAL_STATE=4,         //接收结束电平信号状态
    RESTART_REV_STATE=5         //接收过程出错重新接收状态
}REV_STATE_e;                   //接收数据状态枚举

/* 变量定义 -------------------------------------------------------------------*/
unsigned char receive_state=0;      //接收数据状态
unsigned char receive_bit_num=0;    //接收的bit位个数
unsigned char receive_data_num=0;   //接收的数据个数

//接收数据缓存数组-用一个数组来缓存数据,51个数据字节
unsigned char receive_data_buf[REV_DATA_NUM]={0};

unsigned int  H_L_Level_time_cnt=0; //高低电平时间计数

bit start_H_L_Level_timming_flag=0; //开始高低电平计时标记
bit has_read_bit = 0;               //1-已经读取一个bit位
bit check_OK = 0;                   //1-校验和正确,0-校验和失败
bit read_success=0;                 //一帧数据是否读取成功,0-不成功,1-成功

/* 函数声明 -------------------------------------------------------------------*/
void GPIO_Init(void);               //GPIO初始化函数
void Timer0_Init(void);             //定时器0初始化函数
void Receive_Data_Handle(void);     //接收数据处理
void Check_Sum_Handle(void);        //校验和处理

/* 函数定义 -------------------------------------------------------------------*/
/*******************************************************************************
 *函数名称 : main
 *函数功能 : 主函数入口
 *输入参数 : void
 *输出返回 : void
*******************************************************************************/
void main(void)
{
    GPIO_Init();        //GPIO初始化,设置数据接收引脚P10为高阻输入,检测高低电平
    Timer0_Init();      //定时器0初始化,定时周期为:50微秒@33.000MHz

    while(1)
    {        
        if (read_success == 1)              //如果成功读取一帧数据
        {
            //一帧数据接收成功后先根据协议要求进行校验和,验证数据的正确性
            Check_Sum_Handle();

            //如果数据正确,根据接收的数据进行分析获取需要的内容
            if (check_OK)
            {
                /* code */
            }

            read_success = 0;               //读取一帧数据清0
        }
    }
}

/*******************************************************************************
 *函数名称 : GPIO_Init
 *函数功能 : 数据接收引脚初始化
 *输入参数 : void
 *输出返回 : void
*******************************************************************************/
void GPIO_Init(void)
{
    P1M1 |= 0x01;       //设置数据接收引脚P10为高阻输入模式
    P1M0 &= 0xFE;

    P1PU  &= 0xFE;      //禁止P10端口内部的4.1K上拉电阻
    P1NCS |= 0x01;      //使能端口的施密特触发器
    P1SR  &= 0xFE;      //电平转换速度快
    P1DR  |= 0x01;      //控制端口驱动能力:0-增强驱动能力  1-一般驱动能力
    P1IE  |= 0x01;      //使能数字信号输入
}

/*******************************************************************************
 *函数名称 : Timer0_Init
 *函数功能 : 定时器0初始化,单次定时时间根据协议的最小公差±50us确定
 *输入参数 : void
 *输出返回 : void
*******************************************************************************/
void Timer0_Init(void)
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式:16位自动重载模式
	TL0 = 0x8E;		    //设置定时初值低8位,50微秒@33.000MHz
	TH0 = 0xF9;		    //设置定时初值高8位
	TF0 = 0;		    //清除TF0标志
	TR0 = 1;		    //定时器0开始计时
}

/*******************************************************************************
 *函数名称 : Timer0_isr
 *函数功能 : 定时器0中断处理函数
 *输入参数 : void
 *输出返回 : void
*******************************************************************************/
void Timer0_isr() interrupt 1 //50us定时器
{
    if (start_H_L_Level_timming_flag==1)
    {
        H_L_Level_time_cnt++;     //高低电平维持时间计数变量
    }   
    Receive_Data_Handle();      //接收数据处理,波特率自适应
}



/*******************************************************************************
 *函数名称 : Receive_Data_Handle
 *函数功能 : 接收数据处理
 *输入参数 : void
 *输出返回 : void
*******************************************************************************/
void Receive_Data_Handle(void)
{
    switch (receive_state)                          //检测当前接收数据状态
    {
        case INITIAL_STATE:                         //初始状态,未接收到同步信息,进行同步判断
            if (DATA_REV_PIN == LOW)                //判断接收引脚的电平状态,当读到低电平时,开始计时
            {
                receive_bit_num = 0;                //重置bit位计数器
                receive_data_num = 0;               //重置接收数据个数
                H_L_Level_time_cnt = 0;             //高低电平计时变量清0
                start_H_L_Level_timming_flag = 1;   //开始高低电平计时
                receive_state = SYNC_L_STATE;       //进入读取同步低电平信号状态
            }
            break;
        
        case SYNC_L_STATE:                          //在读取同步低电平信号期间
            if (DATA_REV_PIN == HIGH)               //同步信号低电平检测期间读到高电平
            {
                if (H_L_Level_time_cnt >= SYNC_L_TIME_NUM)//如果同步信号低电平时间>=SYNC_L_TIME_NUM
                {                                       //同步信号低电平时间要>=10ms
                    H_L_Level_time_cnt = 0;         //高低电平计时变量清0
                    receive_state = SYNC_H_STATE;   //进入读取同步信号高电平状态
                }
                else
                {
                    receive_state = RESTART_REV_STATE;      //进入重新接收状态  
                }
            }
            break;

        case SYNC_H_STATE:                          //在读取同步信号高电平期间
            if (DATA_REV_PIN == LOW)                //同步信号高电平检测期间读到低电平
            {
                //判断同步信号高电平时间是否在1ms±100us之间
                if (H_L_Level_time_cnt >= SYNC_H_TIME_NUM_MIN && H_L_Level_time_cnt <= SYNC_H_TIME_NUM_MAX)
                {
                    H_L_Level_time_cnt = 0;         //高低电平计时变量清0
                    has_read_bit = 0;				//标记还未读取一个bit位
                    receive_state = DATA_REV_STATE; //进入读取数据状态
                }
                else                                    
                {
                    receive_state = RESTART_REV_STATE;      //进入重新接收状态
                }
            }
            else            //如果在同步信号高电平检测期间,时间超过2ms±200us,认为超时
            {
                //判断时间是否超时 2ms±200us
                if (H_L_Level_time_cnt >= LOGIC_CYCLE_NUM)
                {
                     receive_state = RESTART_REV_STATE;      //进入重新接收状态
                }    
            }
            break;

        case DATA_REV_STATE:          //在读取数据码电平期间
            //逻辑“0”为 1.5ms±150us低电平 + 0.5ms±50us高电平
            //逻辑“1”为 0.5ms±50us低电平 + 1.5ms±150us高电平
            //如何判断当前为逻辑“0”还是逻辑“1”,关键在于寻找共同点
        
            //方法一:
            //不管是逻辑“0”还是逻辑“1”,周期一样,都是2ms ± 200us
            //可以取中间时间点进行判断,(2ms ± 200us) / 2 = 1ms ± 100us,中间值
            //一个逻辑周期都是先低后高,所以当读到高电平的时候,判断当前计数时间
        
            //如果还没有读取一个bit位
            if (has_read_bit==0) 
            {
                if(DATA_REV_PIN == HIGH)    //如果接收引脚接收到高电平
                {
                    if(H_L_Level_time_cnt < HALF_LOGIC_CYCLE)   //低电平时间判断
                    {
                        receive_data_buf[receive_data_num] |= 0x80;	//设置逻辑“1”
                    }
                    else
                    {
                        receive_data_buf[receive_data_num] &= 0x7F;	//设置逻辑“0”
                    }
                    has_read_bit = 1;
                }
            }
            else    //如果已经读取一个bit位
            {
                if(DATA_REV_PIN == LOW)    //如果接收引脚接收到低电平,即一个逻辑周期过去了
                {
                    H_L_Level_time_cnt = 0;             //高低电平计时变量清0
                    has_read_bit = 0;                   //清0,读取下一个bit位
                    receive_bit_num++;                  //接收的bit数++
                    
                    if (receive_bit_num==REV_BIT_NUM)   //如果一个字节8个bit位接收完成
                    {
                        receive_data_num++;             //接收的数据个数++
                        receive_bit_num = 0;            //接收bit位个数清0重新接收

                        if (receive_data_num == REV_DATA_NUM)   //如果数据采集完毕
                        {
                            receive_state = END_SIGNAL_STATE;   //进入接收结束低电平信号状态 
                        }  
                    }
                    else                                //如果一个字节8个bit位还没有接收完成
                    {
                        //将接收数据缓存右移一位,数据从低bit位开始接收
                        receive_data_buf[receive_data_num] = receive_data_buf[receive_data_num] >> 1;
                    }
                }
            }

            //方法二:
            //不管是逻辑“0”还是逻辑“1”,高低电平维持时间都是以 0.5ms±50us 为基数,
            //1.5ms±150us = 3 * (0.5ms±50us),所以一个逻辑周期 2ms±200us = (1.5ms±150us) + (0.5ms±50us) = 4 * (0.5ms±50us)
            //所以可以取一个逻辑周期的中间时间断进行判断,即>(1ms±50us) 且 <(1.5ms±150us) 这段时间内判断,
            //这段时间范围再高低电平切换的临界点,容易产生误差,再取中间范围
            //大于取上公差,小于取下公差
            //所以判断时间范围为 1ms+50us ~ 1.5ms-150us = 1050us ~ 1350us,取中间值 1150us~1250us
            if (has_read_bit==0)    //如果还没读一个bit位
            {
                if((H_L_Level_time_cnt >= SHORT_TIME_NUM) && (H_L_Level_time_cnt < LONG_TIME_NUM))
                {
                    if(DATA_REV_PIN==HIGH)          //如果在一个逻辑周期的中间段读到高电平
                    {
                        receive_data_buf[receive_data_num] |= 0x80; //设置逻辑“1”
                    }
                    else
                    {
                        receive_data_buf[receive_data_num] &= 0x7F;	//设置逻辑“0”
                    }
                    has_read_bit = 1;
                }
            }
            else        //如果已经读取一个bit位
            {
                if(H_L_Level_time_cnt >= 1750)
                {
                    if(DATA_REV_PIN == LOW)         //等待低电平到来,说明一个逻辑周期结束
                    {
                        H_L_Level_time_cnt = 0;             //高低电平计时变量清0
                        has_read_bit = 0;                   //清0,读取下一个bit位
                        receive_bit_num++;                  //接收的bit数++
                        
                        if (receive_bit_num==REV_BIT_NUM)   //如果一个字节8个bit位接收完成
                        {
                            receive_data_num++;             //接收的数据个数++
                            receive_bit_num = 0;            //接收bit位个数清0重新接收

                            if (receive_data_num == REV_DATA_NUM)   //如果数据采集完毕
                            {
                                receive_state = END_SIGNAL_STATE;   //进入接收结束低电平信号状态 
                            }  
                        }
                        else                                //如果一个字节8个bit位还没有接收完成
                        {
                            //将接收数据缓存左移一位,数据从低bit位开始接收
                            receive_data_buf[receive_data_num] = receive_data_buf[receive_data_num] >> 1;
                        }
                    }
                }
            }     
            break;

        case END_SIGNAL_STATE:                              //在接收结束信号低电平期间
            if (DATA_REV_PIN == HIGH)                       //结束信号低电平检测期间读到高电平
            {
                if (H_L_Level_time_cnt >= END_SIGNAL_TIME_NUM)  //如果读到低电平时间>=5ms
                {
                        read_success = 1;                   //一帧数据读取成功
                        start_H_L_Level_timming_flag = 0;   //停止高低电平计时
                        H_L_Level_time_cnt = 0;             //定时器计数值清0
           		        receive_state = INITIAL_STATE;      //接收状态清0  
                }
                else        //如果低电平时间没有5ms
                {
                    receive_state = RESTART_REV_STATE;      //进入重新接收状态
                }  
            }
            else    //结束信号低电平检测期间一直为低
            {
                if (H_L_Level_time_cnt >= SYNC_L_TIME_NUM)  //如果读到低电平时间>=10ms,认为超时
                {                                           //一帧数据发送完成后需要间隔50ms才发送第二帧数据,期间肯定会被拉高
                    receive_state = RESTART_REV_STATE;      //进入重新接收状态
                }
            }
            break;

        case RESTART_REV_STATE:                     //重新接收数据状态
            start_H_L_Level_timming_flag = 0;       //停止高低电平计时
            H_L_Level_time_cnt = 0;                 //定时器计数值清0
            receive_state = INITIAL_STATE;          //接收状态清0    	
            break;
    }
}

/*******************************************************************************
 *函数名称 : Check_Sum_Handle
 *函数功能 : 校验和处理
 *输入参数 : void
 *输出返回 : void
*******************************************************************************/
void Check_Sum_Handle(void)
{
    unsigned char i = 0, checkByte = 0;
    unsigned long checkSum = 0;

    for ( i = 0; i < (REV_DATA_NUM-1); i++)
    {
        checkSum += receive_data_buf[i];
    }
    
    checkByte = (unsigned char)checkSum;

    if (checkByte == receive_data_buf[REV_DATA_NUM-1])  //校验和正确
    {
        check_OK = 1;           //标记校验成功
    }
    else
    {
        check_OK = 0;           //标记校验失败
    }
}

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 单线通讯指的是通过一根线路传输数据的通讯方式,即通过单根线路同时传输数据和电源信号。而SIF(Single Interface)通讯协议也被称为一线通,是一种用于实现单线通讯通讯协议一线通通讯协议主要用于一些嵌入式设备和智能家居等领域,通过单根线路同时传输数据和电源供给。传统的通讯方式需要使用两根线路进行数据和电源传输,而使用一线通通讯协议则可以通过优化通讯方式,仅使用一根线路实现数据和电源的传输。 一线通通讯协议的主要特点是简化了通讯线路的复杂性,降低了设备的成本,并且提高了系统的可靠性。通过一线通通讯协议,设备可以直接从主控器上获取所需的电源供给,避免了使用额外的电源适配器或者电源线。这种设计无疑减少了设备的体积和功耗,提高了整个系统的可靠性。 除了传输电源供给,一线通通讯协议也可以同时传输数据。通过协议的设计,实现了设备与主控器之间的双向通讯,可以传输各种指令、状态信息等。这样的设计使得设备可以与主控器之间进行实时的交互,增加了设备的智能化。 总而言之,一线通通讯协议是一种用于实现单线通讯通讯协议,通过简化通讯线路的复杂性、降低设备成本以及提高系统可靠性等特点,使得设备可以通过一根线路同时传输数据和电源信号,提高了整个系统的性能和功能。 ### 回答2: SIF通讯协议,也称为单线通讯一线通,是一种用于数据传输的通讯协议。它不同于传统的双线通讯方式,通过只使用一根线缆就能实现数据的发送与接收。 SIF通讯协议通过将数据信号编码成不同的电压水平来传送信息。通讯的开始和结束由特定的电平转变来表示,中间的数据由不同的电平表示进制的0和1。 SIF通讯协议的优点之一是减少了线缆数量。传统的通讯方式通常需要两根线缆,其中一根用于数据的发送,另一根用于数据的接收。而采用SIF通讯协议,只需要一根线缆就可以实现数据的发送和接收,降低了线缆的成本和复杂度。 此外,SIF通讯协议还具有较好的抗干扰性能。由于只使用一根线缆来传输数据,可以更好地抵御噪声和其他电磁干扰。通过精确的电平变化表示数据,可以更准确地恢复发送方的原始数据。 然而,SIF通讯协议也存在一些限制。由于只有一根线缆,传输速率相对较低,无法满足高速数据传输的需求。此外,由于信号是通过电压水平进行编码,所以对传输距离和线缆质量有一定要求,不适用于长距离传输或恶劣环境下的通讯。 总的来说,SIF通讯协议是一种简单、成本低廉、抗干扰性能较好的数据传输方式。在一些对传输速率要求不高且通讯距离较短的应用场景下,可以考虑采用SIF通讯协议。 ### 回答3: 单线通讯是指只使用一根物理线路进行通信通讯方式。而SIF通讯协议,也被称为一线通,是一种广泛应用于大型机械设备和工业控制系统中的通信协议SIF通讯协议采用了单线通讯的方式,使用一根物理线路来同时传输数据和供电。通过这种方式,可以减少线缆的使用量和布线的复杂度,同时也降低了成本和维护的难度。 SIF通讯协议具有以下特点: 1. 双工通信SIF通讯协议支持双向数据传输,可以同时进行数据的发送和接收。这使得设备之间可以实现实时的数据交互,提高了通信的效率和灵活性。 2. 性能稳定:SIF通讯协议使用了一种具有抗干扰能力强的通信技术,可以在复杂的工业环境中保持通信的稳定性。这对于工业控制系统的稳定运行至关重要。 3. 简单易用:SIF通讯协议的设计目标是简化通信的操作和配置,使得设备的连接和通信设置更加简单。这极大地降低了使用者的学习和上手的难度。 4. 扩展性强:SIF通讯协议支持多设备并行连接,在扩展新设备时更加灵活。此外,它还支持多种通信方式,如RS485、RS232等,可以适应不同的通信需求。 总的来说,SIF通讯协议一线通)是一种基于单线通讯方式的工业控制通信协议,具有双工通信、性能稳定、简单易用和扩展性强等特点,广泛应用于大型机械设备和工业控制系统中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Geek@Yang

码字不易,来点鼓励~~~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值