串口的软硬件扩展及方案对比
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学习感受与总结
嵌入式系统串口扩展问题
一、常用串口介绍
1、RS-232C 接口
1.1、 RS-232C 是 EIA (美国电子工业协会) 1969 年修订 RS-232C 标准。 RS-232C 定义了数据终端设备(DTE)与数据通信设备(DCE)之间的物理接口标准。
TXD 计RXD 算 机 甲
TXD RXD 计 算 机 乙
3、RS-485 接口
TTL 电 平
双向仅需2条线
TTL 电 平
RS-485 是 RS-422A 的变型:RS-422A 用于全双工,而 RS-485 则用于半双工。RS-485 是一 种多发送器标准, 在通信线路上最多可以使用 32 对差分驱动器/接收器。 如果在一个网络中 连接的设备超过 32 个,还可以使用中继器。 RS-485 的信号传输采用两线间的电压来表示逻辑 1 和逻辑 0。由于发送方需要两根传 输线,接收方也需要两根传输线。传输线采用差动信道,所以它的干扰抑制性极好,又因为 它的阻抗低,无接地问题,所以传输距离可达 1200 米,传输速率可达 1Mbps。 RS-485 是一点对多点的通信接口,一般采用双绞线的结构。普通的 PC 机一般不带 RS485 接口,因此要使用 RS-232C/RS-485 转换器。对于单片机可以通过芯片 MAX485 来完 成 TTL/RS-485 的电平转换。在计算机和单片机组成的 RS-485 通信系统中,下位机由单片 机系统组成,上位机为普通的 PC 机,负责监视下位机的运行状态,并对其状态信息进行集 中处理, 以图文方式显示下位机的工作状态以及工业现场被控设备的工作状况。 系统中各节 点(包括上位机)的识别是通过设置不同的站地址来实现的。 接 性 能 单端 15(24kb/s) 200kb/s 1 1 ±3V 300Ω 3~7kΩ 3~7kΩ ±25 差动方式 1200(100kb/s) 10Mb/s 1 10 ±200mV 60kΩ >4kΩ 100Ω -0.25~+6 差动方式 1200(100kb/s) 10Mb/s 32 32 ±200mV 120kΩ >12kΩ 60 Ω -7~12 操作方式 最大距离/m 最大速率 最大驱动器数目 最大接收器数目 接收灵敏度 驱动器输出阻抗 接收器负载阻抗 负载阻抗 对共用点电压范围/ V 口 RS-232C RS-422A RS-485
陈歌-合肥 201007
- 3 -
学习感受与总结
Delay2cp(36); input=input>>1; } TXD=(bit)1; Delay2cp(46); } //-----------------------------------从串口读一个字节----------------------------------------// uchar RByte(void) { uchar Output=0; uchar i=8; uchar temp=RDDYN; //---------------------发送8位数据位 Delay2cp(RDDYN*1.5); //---------------------此处注意,等过起始位 while(i--) { Output >>=1; if(RXD) Output =0x80; //--------------------先收低位 Delay2cp(35); //--------------------(96-26)/2,循环共占用26个指令周期 } while(--temp) //--------------------- 在指定的时间内搜寻结束位。 { Delay2cp(1); if(RXD)break; //----------------------收到结束位便退出 } return Output; } //------------------------------------- 延时程序-----------------------------------------// void Delay2cp(unsigned char i) { while(--i); //--------------------------------两个指令周期。 } 缺点: 我感觉这种方法在接收上存在一定的难度,主要是采样定位存在需较准确,另外还必须 知道每条语句的指令周期数。 理论上可以模拟若干个串口,但是多于没有不能多任务的 MCU, 如果子串口同时传来数据则会出现不确定现象。同时我觉得在 KEIL C 环境下使用这种方法 也含有一定的不确定性。 同时上面的程序是我查阅相关论坛得到的,在延时方面我感觉不是很确切,时间关系, 没有深究,有疑问的地方均有标记。 72 2 //------------------------2+2+72+2=78? //-----------------------发送校验位(无) //-----------------------发送结束位
陈歌-合肥 201007
- 2 -
学习感受与总结
串口的扩展问题 二、 二、串口的扩展问题 、串口扩展的几种方法 2.1 2.1、串口扩展的几种方法
、软件模拟法 2.1.1 2.1.1、
2.1.1.1、软件模拟法基础定义 软件模拟法可根据串行通讯的传送格式, 利用定时器和主机的 I/O 口来模拟串行通讯的 时序,以达到扩展串口的目的。 接收过程中需要检测起始位, 这能够使用查询方式, 或在端口具备中断功能的主机中也 能够使用端口的中断进行处理。 接收和发送过程中, 对定时的处理既能够使用查询方式也能 够使用定时器中断方式。 为了确保数据的正确性, 在接收过程中能够在检测异步传输的起始 信号处加上一些防干扰处理,在接收每个位时能够采用多次采样。 2.1.1.2、软件模拟的几种基本方法 方法一:延时法 模拟串口就是利用51的两个输入输出引脚如 P1.0和 P1.1,置1或0分别代表高低电平,也就 是串口通信中所说的位 ,如起始位用低电平 ,则将其置0,停止位为高电平,则将其置1,各种数据 位和校验位则根据情况置1或置0。至于串口通信的波特率,说到底只是每位电平持续的时间, 波特率越高,持续的时间越短。 如波特率为 9600BPS, 即每一位传送时间为 1000ms/9600=0.104ms, 即位与位之间的延时 为为0.104毫秒。 单片机的延时是通过执行若干条指令来达到目的的,因为每条指令为1-3个指 令周期,可即是通过若干个指令周期来进行延时的 ,单片机常用11.0592M 的的晶振,用此频率 则每个指令周期的时间为(12/11.0592)us。 波特率为9600指令周期 s=(1000000/9600)/(12/11.0592)=96。 在此基础上假设11.0592M 的晶振,则串口的每位需延时0.104秒,中间可执行96个指令周期。 #define uchar unsigned char sbit P1_0 = 0x90; sbit P1_1 = 0x91; sbit P1_2 = 0x92; #define RXD P1_0 #define TXD P1_1 #define WRDYN 44 #define RDDYN 43
陈歌-合肥 201007
- 4 -
学习感受与总结
方法二:计数法 51的计数器在每指令周期加1,直到溢出,同时硬件置溢出标志位。这样我们就可以 通过预置初值的方法让机器每 96个指令周期产生一次溢出 ,程序不断的查询溢出标志来决定 是否发送或接收下一位。 //-------------------------计数器初始化----------------------------// void S2INI(void) { TMOD =0x02; //----------------计数器0,方式2 TH0=0xA0; //---------------预值为256-96=140,十六进制 A0 TL0=TH0; TR0=1; //---------------开始计数 TF0=0; } void WByte(uchar input) { //--------------------------------发送启始位 uchar i=8; TR0=1; TXD=(bit)0; WaitTF0(); //---------------------------------发送8位数据位 while(i--) { TXD=(bit)(input&0x01); WaitTF0(); input=input>>1; }
2、RS-422A 接口
SN75174 +5V SN75175
TTL 电 平
+5V
双向需4条线
TTL 电 平
SN75175
Hale Waihona Puke SN75174陈歌-合肥 201007
- 1 -
学习感受与总结
RS-422A 输出驱动器为双端平衡驱动器。如果其中一条线为逻辑“1”状态,另一条线 就为逻辑“0” ,比采用单端不平衡驱动对电压的放大倍数大一倍。差分电路能从地线干扰中 拾取有效信号, 差分接收器可以分辨 200mV 以上电位差。 若传输过程中混入了干扰和噪声, 由于差分放大器的作用, 可使干扰和噪声相互抵消。 因此可以避免或大大减弱地线干扰和电 磁干扰的影响。RS-422A 传输速率(90Kbps)时,传输距离可达 1200 米。
//------------------写延时 //-----------------读延时
//--------------------------往串口写一个字节-----------------------------------// void WByte(uchar input) { uchar i=8; TXD=(bit)0; //-----------------------发送启始位 Delay2cp(39); //-----------------------39*2???? while(i--) { TXD=(bit)(input&0x01); //-----------------------发送8位数据位 2 //----------------------先传低位 2
TXD RXD 计 4 算 5 机 6 甲 20
TXD RXD 4 5 6 20
计 算 机 乙
1.2、采用 RS-232C 接口存在的问题 1、传输距离短,传输速率低 RS-232C 总线标准受电容允许值的约束, 使用时传输距离一般不要超过 15 米 (线路条 件好时也不超过几十米) 。最高传送速率为 20Kbps。 2、有电平偏移 RS-232C 总线标准要求收发双方共地。 通信距离较大时, 收发双方的地电位差别较大, 在信号地上将有比较大的地电流并产生压降。 3、抗干扰能力差 RS-232C 在电平转换时采用单端输入输出, 在传输过程中当干扰和噪声混在正常的信 号中。为了提高信噪比,RS-232C 总线标准不得不采用比较大的电压摆幅。
陈歌-合肥 201007
- 5 -
学习感受与总结
件工作代替软件工作,相对减轻编程难度,不需要查阅每条指令的执行周期。在 C 语言环 境下不必担心编译后的时间精确问题。 但是需要使用计数器,扩展多个串口同时使用一个计数器在理论上实现不了。因此, 我 感觉这种方法在扩展数量方面有局限性。 方法三:中断法 中断的方法和计数器的方法差不多,只是当计算器溢出时便产生一次中断,用户可以 在中断程序中置标志,程序不断的查询该标志来决定是否发送或接收下一位 ,当然程序中需对 中断进行初始化,同时编写中断程序。 示例程序使用 Timer0中断。 #define TM0_FLAG P1_2 //-------------------设传输标志位 //-------------------计数器及中断初始化-----------------------------------------------// void S2INI(void) { TMOD =0x02; //-------------------计数器0,方式2 TH0=0xA0; //--------------------预值为256-96=140,十六进制 A0 TL0=TH0; TR0=0; //--------------------在发送或 接收才开始使用 TF0=0; ET0=1; //----------------------允许定时 器0中断 EA=1; //----------------------中断允许 总开关 } //--------------------------------------接收一个字符-----------------------------------// uchar RByte() { uchar Output=0; uchar i=8; TR0=1; //-------------------------启动 Timer0 TL0=TH0; WaitTF0(); //-------------------------等过起始位 //-------------------------发送8位数据位 while(i--) { Output >>=1; if(RXD) Output =0x80; //-------------------------先收低位 WaitTF0(); //-------------------------位间延时 } while(!TM0_FLAG) if(RXD) break; TR0=0; //-------------------------停止 Timer0
//---------------------------------先传低位
//----------------------------------发送校验位(无) //----------------------------------发送结束位 TXD=(bit)1; WaitTF0(); TR0=0; } //---------------------------------查询计数器溢出标志位------------------------------------// void WaitTF0( void ) { while(!TF0); TF0=0; } 我没有通过实际实验,一是没有时间,二是在合工大实验室这边没有相应的系统设备, 我感觉这种办法接收和发送在时间的控制上相对来说比较精确, 实现过程也比较简单, 用硬
嵌入式系统串口扩展问题
一、常用串口介绍
1、RS-232C 接口
1.1、 RS-232C 是 EIA (美国电子工业协会) 1969 年修订 RS-232C 标准。 RS-232C 定义了数据终端设备(DTE)与数据通信设备(DCE)之间的物理接口标准。
TXD 计RXD 算 机 甲
TXD RXD 计 算 机 乙
3、RS-485 接口
TTL 电 平
双向仅需2条线
TTL 电 平
RS-485 是 RS-422A 的变型:RS-422A 用于全双工,而 RS-485 则用于半双工。RS-485 是一 种多发送器标准, 在通信线路上最多可以使用 32 对差分驱动器/接收器。 如果在一个网络中 连接的设备超过 32 个,还可以使用中继器。 RS-485 的信号传输采用两线间的电压来表示逻辑 1 和逻辑 0。由于发送方需要两根传 输线,接收方也需要两根传输线。传输线采用差动信道,所以它的干扰抑制性极好,又因为 它的阻抗低,无接地问题,所以传输距离可达 1200 米,传输速率可达 1Mbps。 RS-485 是一点对多点的通信接口,一般采用双绞线的结构。普通的 PC 机一般不带 RS485 接口,因此要使用 RS-232C/RS-485 转换器。对于单片机可以通过芯片 MAX485 来完 成 TTL/RS-485 的电平转换。在计算机和单片机组成的 RS-485 通信系统中,下位机由单片 机系统组成,上位机为普通的 PC 机,负责监视下位机的运行状态,并对其状态信息进行集 中处理, 以图文方式显示下位机的工作状态以及工业现场被控设备的工作状况。 系统中各节 点(包括上位机)的识别是通过设置不同的站地址来实现的。 接 性 能 单端 15(24kb/s) 200kb/s 1 1 ±3V 300Ω 3~7kΩ 3~7kΩ ±25 差动方式 1200(100kb/s) 10Mb/s 1 10 ±200mV 60kΩ >4kΩ 100Ω -0.25~+6 差动方式 1200(100kb/s) 10Mb/s 32 32 ±200mV 120kΩ >12kΩ 60 Ω -7~12 操作方式 最大距离/m 最大速率 最大驱动器数目 最大接收器数目 接收灵敏度 驱动器输出阻抗 接收器负载阻抗 负载阻抗 对共用点电压范围/ V 口 RS-232C RS-422A RS-485
陈歌-合肥 201007
- 3 -
学习感受与总结
Delay2cp(36); input=input>>1; } TXD=(bit)1; Delay2cp(46); } //-----------------------------------从串口读一个字节----------------------------------------// uchar RByte(void) { uchar Output=0; uchar i=8; uchar temp=RDDYN; //---------------------发送8位数据位 Delay2cp(RDDYN*1.5); //---------------------此处注意,等过起始位 while(i--) { Output >>=1; if(RXD) Output =0x80; //--------------------先收低位 Delay2cp(35); //--------------------(96-26)/2,循环共占用26个指令周期 } while(--temp) //--------------------- 在指定的时间内搜寻结束位。 { Delay2cp(1); if(RXD)break; //----------------------收到结束位便退出 } return Output; } //------------------------------------- 延时程序-----------------------------------------// void Delay2cp(unsigned char i) { while(--i); //--------------------------------两个指令周期。 } 缺点: 我感觉这种方法在接收上存在一定的难度,主要是采样定位存在需较准确,另外还必须 知道每条语句的指令周期数。 理论上可以模拟若干个串口,但是多于没有不能多任务的 MCU, 如果子串口同时传来数据则会出现不确定现象。同时我觉得在 KEIL C 环境下使用这种方法 也含有一定的不确定性。 同时上面的程序是我查阅相关论坛得到的,在延时方面我感觉不是很确切,时间关系, 没有深究,有疑问的地方均有标记。 72 2 //------------------------2+2+72+2=78? //-----------------------发送校验位(无) //-----------------------发送结束位
陈歌-合肥 201007
- 2 -
学习感受与总结
串口的扩展问题 二、 二、串口的扩展问题 、串口扩展的几种方法 2.1 2.1、串口扩展的几种方法
、软件模拟法 2.1.1 2.1.1、
2.1.1.1、软件模拟法基础定义 软件模拟法可根据串行通讯的传送格式, 利用定时器和主机的 I/O 口来模拟串行通讯的 时序,以达到扩展串口的目的。 接收过程中需要检测起始位, 这能够使用查询方式, 或在端口具备中断功能的主机中也 能够使用端口的中断进行处理。 接收和发送过程中, 对定时的处理既能够使用查询方式也能 够使用定时器中断方式。 为了确保数据的正确性, 在接收过程中能够在检测异步传输的起始 信号处加上一些防干扰处理,在接收每个位时能够采用多次采样。 2.1.1.2、软件模拟的几种基本方法 方法一:延时法 模拟串口就是利用51的两个输入输出引脚如 P1.0和 P1.1,置1或0分别代表高低电平,也就 是串口通信中所说的位 ,如起始位用低电平 ,则将其置0,停止位为高电平,则将其置1,各种数据 位和校验位则根据情况置1或置0。至于串口通信的波特率,说到底只是每位电平持续的时间, 波特率越高,持续的时间越短。 如波特率为 9600BPS, 即每一位传送时间为 1000ms/9600=0.104ms, 即位与位之间的延时 为为0.104毫秒。 单片机的延时是通过执行若干条指令来达到目的的,因为每条指令为1-3个指 令周期,可即是通过若干个指令周期来进行延时的 ,单片机常用11.0592M 的的晶振,用此频率 则每个指令周期的时间为(12/11.0592)us。 波特率为9600指令周期 s=(1000000/9600)/(12/11.0592)=96。 在此基础上假设11.0592M 的晶振,则串口的每位需延时0.104秒,中间可执行96个指令周期。 #define uchar unsigned char sbit P1_0 = 0x90; sbit P1_1 = 0x91; sbit P1_2 = 0x92; #define RXD P1_0 #define TXD P1_1 #define WRDYN 44 #define RDDYN 43
陈歌-合肥 201007
- 4 -
学习感受与总结
方法二:计数法 51的计数器在每指令周期加1,直到溢出,同时硬件置溢出标志位。这样我们就可以 通过预置初值的方法让机器每 96个指令周期产生一次溢出 ,程序不断的查询溢出标志来决定 是否发送或接收下一位。 //-------------------------计数器初始化----------------------------// void S2INI(void) { TMOD =0x02; //----------------计数器0,方式2 TH0=0xA0; //---------------预值为256-96=140,十六进制 A0 TL0=TH0; TR0=1; //---------------开始计数 TF0=0; } void WByte(uchar input) { //--------------------------------发送启始位 uchar i=8; TR0=1; TXD=(bit)0; WaitTF0(); //---------------------------------发送8位数据位 while(i--) { TXD=(bit)(input&0x01); WaitTF0(); input=input>>1; }
2、RS-422A 接口
SN75174 +5V SN75175
TTL 电 平
+5V
双向需4条线
TTL 电 平
SN75175
Hale Waihona Puke SN75174陈歌-合肥 201007
- 1 -
学习感受与总结
RS-422A 输出驱动器为双端平衡驱动器。如果其中一条线为逻辑“1”状态,另一条线 就为逻辑“0” ,比采用单端不平衡驱动对电压的放大倍数大一倍。差分电路能从地线干扰中 拾取有效信号, 差分接收器可以分辨 200mV 以上电位差。 若传输过程中混入了干扰和噪声, 由于差分放大器的作用, 可使干扰和噪声相互抵消。 因此可以避免或大大减弱地线干扰和电 磁干扰的影响。RS-422A 传输速率(90Kbps)时,传输距离可达 1200 米。
//------------------写延时 //-----------------读延时
//--------------------------往串口写一个字节-----------------------------------// void WByte(uchar input) { uchar i=8; TXD=(bit)0; //-----------------------发送启始位 Delay2cp(39); //-----------------------39*2???? while(i--) { TXD=(bit)(input&0x01); //-----------------------发送8位数据位 2 //----------------------先传低位 2
TXD RXD 计 4 算 5 机 6 甲 20
TXD RXD 4 5 6 20
计 算 机 乙
1.2、采用 RS-232C 接口存在的问题 1、传输距离短,传输速率低 RS-232C 总线标准受电容允许值的约束, 使用时传输距离一般不要超过 15 米 (线路条 件好时也不超过几十米) 。最高传送速率为 20Kbps。 2、有电平偏移 RS-232C 总线标准要求收发双方共地。 通信距离较大时, 收发双方的地电位差别较大, 在信号地上将有比较大的地电流并产生压降。 3、抗干扰能力差 RS-232C 在电平转换时采用单端输入输出, 在传输过程中当干扰和噪声混在正常的信 号中。为了提高信噪比,RS-232C 总线标准不得不采用比较大的电压摆幅。
陈歌-合肥 201007
- 5 -
学习感受与总结
件工作代替软件工作,相对减轻编程难度,不需要查阅每条指令的执行周期。在 C 语言环 境下不必担心编译后的时间精确问题。 但是需要使用计数器,扩展多个串口同时使用一个计数器在理论上实现不了。因此, 我 感觉这种方法在扩展数量方面有局限性。 方法三:中断法 中断的方法和计数器的方法差不多,只是当计算器溢出时便产生一次中断,用户可以 在中断程序中置标志,程序不断的查询该标志来决定是否发送或接收下一位 ,当然程序中需对 中断进行初始化,同时编写中断程序。 示例程序使用 Timer0中断。 #define TM0_FLAG P1_2 //-------------------设传输标志位 //-------------------计数器及中断初始化-----------------------------------------------// void S2INI(void) { TMOD =0x02; //-------------------计数器0,方式2 TH0=0xA0; //--------------------预值为256-96=140,十六进制 A0 TL0=TH0; TR0=0; //--------------------在发送或 接收才开始使用 TF0=0; ET0=1; //----------------------允许定时 器0中断 EA=1; //----------------------中断允许 总开关 } //--------------------------------------接收一个字符-----------------------------------// uchar RByte() { uchar Output=0; uchar i=8; TR0=1; //-------------------------启动 Timer0 TL0=TH0; WaitTF0(); //-------------------------等过起始位 //-------------------------发送8位数据位 while(i--) { Output >>=1; if(RXD) Output =0x80; //-------------------------先收低位 WaitTF0(); //-------------------------位间延时 } while(!TM0_FLAG) if(RXD) break; TR0=0; //-------------------------停止 Timer0
//---------------------------------先传低位
//----------------------------------发送校验位(无) //----------------------------------发送结束位 TXD=(bit)1; WaitTF0(); TR0=0; } //---------------------------------查询计数器溢出标志位------------------------------------// void WaitTF0( void ) { while(!TF0); TF0=0; } 我没有通过实际实验,一是没有时间,二是在合工大实验室这边没有相应的系统设备, 我感觉这种办法接收和发送在时间的控制上相对来说比较精确, 实现过程也比较简单, 用硬