rs485半双工程序发送文件及文本

合集下载

rs485通讯协议有哪些

rs485通讯协议有哪些

竭诚为您提供优质文档/双击可除rs485通讯协议有哪些篇一:Rs485通讯协议介绍第九章串行口Rs485通讯协议9.1通讯概述本公司系列变频器向用户提供工业控制中通用的Rs485通讯接口。

通讯协议采用modbus标准通讯协议,该变频器可以作为从机与具有相同通讯接口并采用相同通讯协议的上位机(如plc控制器、pc机)通讯,实现对变频器的集中监控,另外用户也可以使用一台变频器作为主机,通过Rs485接口连接数台本公司的变频器作为从机。

以实现变频器的多机联动。

通过该通讯口也可以接远控键盘。

实现用户对变频器的远程操作。

本变频器的modbus通讯协议支持两种传送方式:Rtu方式和ascii方式,用户可以根据情况选择其中的一种方式通讯。

下文是该变频器通讯协议的详细说明。

9.2通讯协议说明9.2.1通讯组网方式(1)变频器作为从机组网方式:单主机多从机图9-1从机组网方式示意图单主机单从机(2)多机联动组网方式:-107-图9-2多机联动组网示意图9.2.2通信协议方式该变频器在Rs485网络中既可以作为主机使用,也可以作为从机使用,作为主机使用时,可以控制其它本公司变频器,实现多级联动,作为从机时,pc机或plc可以作为主机控制变频器工作。

具体通讯方式如下:(1)变频器为从机,主从式点对点通信。

主机使用广播地址发送命令时,从机不应答。

(2)变频器作为主机,使用广播地址发送命令到从机,从机不应答。

(3)用户可以通过用键盘或串行通信方式设置变频器的本机地址、波特率、数据格式。

(4)从机在最近一次对主机轮询的应答帧中上报当前故障信息。

9.2.3通讯接口方式通讯为Rs485接口,异步串行,半双工传输。

默认通讯协议方式采用ascii方式。

默认数据格式为:1位起始位,7位数据位,2位停止位。

默认速率为9600bps,通讯参数设置参见p3.09~p3.12功能码。

9.3ascii通讯协议字符结构:10位字符框(Forascii)(1-7-2格式,无校验)(1-7-1格式,奇校验)-108-(1-7-1格式,偶校验)11位字符框(ForRtu)(1-8-2格式,无校验)(1-8-1格式,奇校验)(1-8-1格式,偶校验)通讯资料结构:ascii模式-109-通讯地址:00h:所有变频器广播(broadcast)01h:对01地址变频器通讯。

rs485通信协议介绍

rs485通信协议介绍

rs485通信协议介绍附录:RS485串⾏通讯协议1 主要性能本变频器通过内置的RS485标准接⼝,能与个⼈计算机、PLC 或同系列的变频器等连接,进⾏主从式、异步半双⼯串⾏通信。

其主要性能参见下表:项⽬规范适⽤机型 ALPHA3000系列变频器物理级EIA RS485 传输线屏蔽双绞线配线最长长度 500⽶连接台数主机⼀台,从机31台传输速度19200bps,9600bps,4800bps,2400bps,1200bps,600bps,300bps 数据交换⽅式异步串⾏、半双⼯传送协议点对点或⼴播字长 11位停⽌位长度 1位帧长 14字节固定奇偶校验奇校验出错检查⽅式异或校验2硬件连接 2.1硬件联接如下图:图 1 多台变频器⽤主机控制连接⽰意图图中的MASTER (主机)是ALPHA3000变频器、PC 机或可编程控制器(PLC ),图中的SLAVE (从机,在虚线框内)是变频器。

变频器做为主机,只要将从机的RS485端⼦和主机的RS485同名端⼦相联接即可;如果⽤PC 机或PLC 做为主机,则要在主机和总线之间增加⼀个RS485的转接器。

RS458串⾏总线接⼝最多可连接31台变频器做从机,每⼀个从机变频器都有⼀个唯⼀的号码(ID ),主机依靠ID 来识别每⼀台从机。

2.2 RS485转换器RS485转换器采⽤DB9/DB9外形,带孔的⼀端为RS232,带针的⼀端为RS485。

转换器外带接线转换头把RS485端的DB9接线转换为螺丝接线柱,便于通讯线缆的安装和拆卸。

接线转换头上“A+”为485收/发正端,“ B-”为485收/发负端,“GND”为485地线。

RS485接⼝组成半双⼯⽹络,⼀般只需⼆根连线,为获得良好的抗噪声⼲扰性和较长的传输距离,建议采⽤屏蔽双绞线传输。

3通讯协议3.1概述3.1.1通讯⽅式采⽤USS协议。

主机和从机之间⽤轮询的⽅式来进⾏通讯。

由主机启动每⼀次通信,主机向从机变频器发送任务报⽂,从机接到主机的任务命令后返回响应报⽂并执⾏相应动作。

RS485双工和RS422双工有什么区别

RS485双工和RS422双工有什么区别

RS485双工和RS422双工有什么区别
RS485两线制= 半双工
RS485四线制= 全双工兼容RS422
RS485有两线制和四线制两种接线,四线制只能实现点对点的通信方式,现很少采用,现在多采用的是两线制接线方式,这种接线方式为总线式拓朴结构在同一总线上最多可以挂接32个结点。

在RS485通信网络中一般采用的是主从通信方式,即一个主机带多个从机。

RS422,在RS232后推出,使用TTL差动电平表示逻辑,就是两根的电压差表示逻辑,RS422定义为全双工的,所以最少要4根通信线(一般额外地多一根地线),一个驱动器可以驱动最多10个接收器(即接收器为1/10单位负载),通讯距离与通讯速率有关系,一般距离短时可以使用高速率进行通信,速率低时可以进行较远距离通信,一般可达数百上千米。

半双工:使用同一根线传输,既可发送又可以接收数据,但不能同时发送和接收。

全双工:分别由两根同时发送和接收传送,双方都可以在同一时刻进行发送和接收。

RS485 半双工接法为:RX+ 和TX+ 并联为Data+;RX- 和TX- 并联为Data-。

RS485 全双工接法为:FULL 和GND 短接;信号线为RX+,TX+,RX-,TX-,可根据需要连接GND。

waveshare 微雪电子 rs485 can shield 用户手册说明书

waveshare 微雪电子 rs485 can shield 用户手册说明书

1RS485 CAN Shield用户手册概述RS485 CAN Shield 是微雪电子为NUCLEO/XNUCLEO 开发的一款的带RS485和CAN 通信功能的扩展板,具备RS485、CAN 通信功能。

特点: ● 基于Arduino 标准接口设计,兼容UNO 、Leonardo 、NUCLEO 、XNUCLEO 开发板 ● 具备RS485功能,收发器为MAX3485,3.3V 供电 ●具备CAN 功能,收发器为SN65HVD230,3.3V 供电注意:① 使用3.3V 供电; ②UNO 、Leonardo 等Arduino 板由于没有CAN 硬件接口,需要通过软件模拟CAN总线时序才能使用。

产品概述 (1)1.硬件说明 (3)1.1.芯片引脚功能概述 (3)1.1.1.MAX3485 (3)1.1.2.SN65HVD230 (3)2.操作与现象 (4)2.1.准备工作 (4)2.2.跳线说明 (4)2.3.工作原理 (5)2.3.1.发送端程序说明 (5)2.3.2.接收端程序说明 (7)2.3.3.实验现象 (8)231.1.1. 芯片引脚功能概述1.1.1. MAX3485MAX3485接口芯片是Maxim 公司的一种RS -485驱动芯片。

用于RS-485通信的低功耗收发器。

采用单一电源+3.3 V 工作,采用半双工通讯方式。

RO 和DI 端分别为接收器的输出和驱动器的输入端;RE����和DE 端分别为接收和发送的使能端,当RE ����为逻辑0时,器件处于接收状态;当DE 为逻辑1时,器件处于发送状态;A 端和B 端分别为接收和发送的差分信号端,当A-B>+0.2V 时,RO 输出逻辑1;当A-B<-0.2V 时,RO 输出逻辑0。

A 和B 端之间加匹配电阻,一般可选100Ω的电阻。

SP485/MAX485/SP3485/MAX3485引脚(顶视图)引脚名称 说明1 RO接收器输出Receiver Output 2 RE���� 接收输出使能Receiver Output Enable 低电平有效Active LOW3 DE 发送输出使能Driver Output Enable 高电平有效Active HIGH4 DI 输出驱动器输入Driver Input5 GND 地Ground Connection6 A 差分信号正向端Driver Output/Receiver Input. Non-inverting7 B 差分信号反向端Driver Output/Receiver Input. Inverting8V CCSP485 / MAX485是5V 的RS485收发器 SP3485 / MAX3485是3.3V 的RS485收发器1.1.2. SN65HVD230SN65HVD230是德州仪器公司生产的3.3V CAN 收发器,该器件适用于较高通信速率、良好抗干扰能力和高可靠性CAN 总线的串行通信。

RS485通讯基础知识ppt课件

RS485通讯基础知识ppt课件

• 2、R85网络采用“屏蔽双绞线(STP)” 组网
• 双绞线的优点:

抗干扰能力强
14
威海北洋电气集团股份有限公司
四、RS-485网络的实现方式
3、RS-485终端电阻的选择 什么是终端电阻? 在线型网络两端(相距最远的两个通信端口上),并联在 一对通信线上的电阻 终端电阻作用? 根据传输线理论,终端电阻可以吸收网络上的反射波,有 效地增强信号强度
• ★485总线一定要用手牵手式的总线结构,坚决避免星型连接和
分叉连接。

★设备供电的交流电及机箱一定要真实接地,而且接地良好,以
防止雷击、浪涌冲击等意外情况损坏485设备。
23

★为避免强电威对海其北干洋扰电,气集48团5总股份线有应限避公免司和强电走在一起。
RS485通讯基础知识
一、串行通讯简介 二、RS-485通讯的特点 三、RS-485标准的电平特性 四、RS-485网络的实现方式 五、RS-485网络的工程施工 六、RS-485接口电路的器件选型 七、RS-485接口典型电路简介
20
威海北洋电气集团股份有限公司
五、RS-485网络的工程施工

485总线可以带32(或128、256)台
设备进行通讯

★一般485芯片负载能力有三个级别―32台、128台和256台
,整个485网络由指标较低的芯片确定。

★由RS-485网络的通讯距离一样,理论上的标称往往实际上是
达不到的,通讯距离越长、波特率越高、线径越细、线材质量越差、
24
威海北洋电气集团股份有限公司
六、RS-485接口电路的器件选型
1、常用的485芯片
MAXIM:MAX483、MAX485、MAX487、 MAX3080~MAX3089;

RS485通讯测试

RS485通讯测试

WindowsXP/2000下RS485通讯测试程序此测试程序为WindowsXP/2000下的测试工具。

操作说明:1. 把COM1,COM2的设置成RS485, 。

2. 用短接线把的COM1,COM2连接好,即COM1的5/7与COM2的5/7直接连接。

3. 进入系统, 运行RS485Test.exe。

4. 选择要测试的COM口, 工作模式,CHANGE COM MODE:SEND OR READ(S OR R)在这里选择是要发送还是接收。

回车5. 如果COM1,COM2出现相应的字符既表示这2个串口工作正常。

#include <stdio.h> #include <stdlib.h> #include <string.h> #include "Serial.h"//RS485 测试程序 int RS485Test() { unsigned int unComNum1 = 0; // unsigned int unComNum2 = 0; unsig ned char ucCom1Mod = 0; unsigned char ucCom2Mod = 0; char chCom[5] = {0}; CSerial seri al1; CSerial serial2; char buffer[1024] = {0}; long lSendCounter = 0; char szSendBuff[1024] = {0}; DWORD dwRead = 0; int i = 0; //==================输入COM1的端口号和工作模式===========================// fprintf(stdout, "\nEnter COM1 Number (1,2) : "); // scanf("%d", &unComNum1); unComNum1 = 1;fprintf(stdout, "Change COM1 mode: Send or Read(s or r) : "); scanf("%s", &ucCom1Mod); memset(chCom, 0, 5);sprintf(chCom, "COM%d", unComNum1);BOOL bSer = serial1.InitCOM(chCom, 19200, 8, 0, 0, 1); if (!bSer) { fprintf(stdout, "Can't Ini tCOM Com1.\n"); return -1; }//==================输入COM2的端口号和工作模式===========================// fprintf(stdout, "\nEnter COM2 Number (1, 2) : "); // scanf("%d", &unComNum2); unComNu m2 = 2;fprintf(stdout, "Change COM2 mode: Send or Read(s or r) : "); scanf("%s", &ucCom2Mod); memset(chCom, 0, 5);sprintf(chCom, "COM%d", unComNum2);bSer = serial2.InitCOM(chCom, 19200, 8, 0, 0, 1); if (!bSer) { fprintf(stdout, "Can't InitCOM Com2.\n"); return -1; }fprintf(stdout, "Input Send data : "); scanf("%s", szSendBuff);for(int k = 0; k < 10; k++) { if( (ucCom1Mod=='s') || (ucCom1Mod=='S') ) { serial1.SendDa ta(szSendBuff, strlen(szSendBuff));} if( (ucCom2Mod=='s') || (ucCom2Mod=='S') ) { serial2.SendData(szSendBuff, strlen(szSe ndBuff)); } Sleep(100); if( (ucCom1Mod=='r') || (ucCom1Mod=='R') ) { memset(buff er, 0, sizeof(buffer)); dwRead = serial1.ReadData(buffer, sizeof(buffer)); printf("COM1 k=%d, Receive DataLen=%d, Data(HEX): ", k, dwRead); for(i = 0; i < dwRead; i++) { printf("%x ,", buffer[i]); } printf("\n"); } if( (ucCom2Mod=='r') || (ucCom2Mod=='R') ) { memset(buffer, 0, sizeof(buffer)); dwRead = serial2.ReadData(buffer, sizeof(buffer)); printf("COM2 k =%d, Receive DataLen=%d, Data(HEX): ", k, dwRead); for(i = 0; i < dwRead; i++) { print f("%x,", buffer[i]); } printf("\n"); } } serial1.Close(); serial2.Close(); return 0; }int main(int argc, char **argv){ RS485Test(); return 0;}// Serial.cpp: implementation of the CSerial class. //////////////////////////////////////////////////////////////////////// //#include <winioctl.h> #include <stdio.h> #incl ude <conio.h> #include <stdlib.h>#include "Serial.h"////////////////////////////////////////////////////////////////////// // Construction/Destruction//////////////////////////////////////////////////////////////////////CSerial::CSerial() {memset(&m_OverlappedRead, 0, sizeof( OVERLAPPED)); memset(&m_OverlappedWrite, 0, s izeof( OVERLAPPED)); m_hIDComDev = NULL; fWaitingOnRead = FALSE; } CSerial::~CSerial() {Close(); }/************************************************************************RS-485通讯说明由于RS-485是半双工通信,故同一时刻只能发送或接收。

RS485通信和Modbus协议实例分析

18.1 RS485通信实际上在RS485之前RS232就已经诞生,但是RS232有几处不足的地方:1、接口的信号电平值较高,达到十几V,容易损坏接口电路的芯片,而且和TTL电平不兼容,因此和单片机电路接起来的话必须加转换电路。

2、传输速率有局限,不可以过高,一般到几十Kb/s就到极限了。

3、接口使用信号线和GND与其他设备形成共地模式的通信,这种共地模式传输容易产生干扰,并且抗干扰性能也比较弱。

4、传输距离有限,最多只能通信几十米。

5、通信的时候只能两点之间进行通信,不能够实现多机联网通信。

针对RS232接口的不足,就不断出现了一些新的接口标准,RS485就是其中之一,他具备以下的特点:1、我们在讲A/D的时候,讲过差分信号输入的概念,同时也介绍了差分输入的好处,最大的优势是可以抑制共模干扰。

尤其工业现场的环境比较复杂,干扰比较多,所以通信如果采用的是差分方式,就可以有效的抑制共模干扰。

而RS485就是一种差分通信方式,它的通信线路是两根,通常用A和B或者D+和D-来表示。

逻辑“1”以两线之间的电压差为+(0.2~6)V表示,逻辑“0”以两线间的电压差为-(0.2~6)V来表示,是一种典型的差分通信。

2、RS485通信速度快,最大传输速度可以达到10Mb/s以上。

3、RS485内部的物理结构,采用的是平衡驱动器和差分接收器的组合,抗干扰能力也大大增加。

4、传输距离最远可以达到1200米左右,但是他的传输速率和传输距离是成反比的,只有在100Kb/s 以下的传输速度,才能达到最大的通信距离,如果需要传输更远距离可以使用中继。

5、可以在总线上进行联网实现多机通信,总线上允许挂多个收发器,从现有的RS485芯片来看,有可以挂32、64、128、256等不同个设备的驱动器。

RS485的接口非常简单,和RS232所使用的MAX232是类似的,只需要一个RS485转换器,就可以直接和我们单片机的UART串行接口连接起来,并且完全使用的是和UART一致的异步串行通信协议。

RS232,RS422,RS485 临时接线解决方案

RS-232、RS-485、RS-422接线的临时的解决方案收藏RS-232、RS-485、RS-422 在现场调试经常遇到多种方式的串口通讯的问题,如RS-232、RS-485、RS-422不同口的通讯连接问题,通常RS-485和RS-422之间转换很方便。

但遇到RS-232口要和RS-422口通讯,现场无其他转换方式,如果再邮寄可能等的时间较长。

现在可以有一种临时的解决方案。

(1).RS-232和RS-422 将RS-422的R+、T+短接,和RS-232的GND相连。

RS-422的R-和RS-232的Txd相连,RS-422的T-和RS-232的Rxd相连即可。

.原理如下:RS-232-C接口的电气特性是电压均为负逻辑关系。

即:逻辑“1”,-5—-15V;逻辑“0”+5—+15V 。

噪声容限为2V。

即要求接收器能识别低至+3V的信号作为逻辑“0”,高到-3V的信号作为逻辑“1”。

RS-485的电气特性:逻辑“1”以两线间的电压差为+(2—6)V表示;逻辑“0”以两线间的电压差为-(2—6)V 表示。

所以当RS-232发送“1”时,Txd和GND的电压差为-3—-15V,在RS-422的R+和R-之间形成逻辑“1”的电平(注:线路电平衰减较小)。

当RS-422发送“1”时,RS-422的T+和T-之间形成逻辑“1”的电平为+(2—6)V ,在RS-232的Txd和GND的之间形成逻辑“1”的电平(注:由于RS-422通讯采用差动电平,线路较长衰减也较小,RS-232接收的电平基本维持在5伏)。

通讯距离可以认为以RS-232为准。

即一般小于50米。

我在宝塔石化临时测试过,达40米后还好的很。

(2).RS-232和RS-485 将RS-485的R+、T+短接,和RS-232的GND相连。

RS-485的R-、T-短接,将RS-232的Rxd、Txd短接,两者相连即可。

由于RS-232为全双工,RS-485为半双工,如要通讯则要在通讯程序中做处理才可,但临时使用(如电度表连在NAS-968D/E,用DEBUG设电度表的地址)。

(7)STM32使用HAL库实现RS485通讯(全双工串口)

(7)STM32使⽤HAL库实现RS485通讯(全双⼯串⼝)⼀、硬件如下图所⽰,485芯⽚链接到单⽚机的USART2上,但是默认的USART2并不是在PD5和PD6上,这⾥是需要重映射的。

另外PG4作为485收发的控制(在485协议中,RE、DE同时为⾼电平那么芯⽚使能发送,如果同时为低电平那么芯⽚使能接收)⼆、软件设计1.软件功能默认485芯⽚是接收功能,每隔1s发送⼀个0x88,如果接收到0x55那么返回0x01,如果接收到的数据不是0x55就返回0x00。

2.CubeMX操作(1)时钟(2)调试注意:这⾥⼀定要选择上,否则会导致Jlink⽆法下载,Cube这⾥默认是不使能的,那么调试引脚就会被配置成普通IO。

(3)usart2(4)重映射(5)配置485芯⽚使能引脚-PG4(6)配置时钟,这个要根据具体的芯⽚与晶振来配置(7)配置串⼝,这⾥默认就⾏(8)配置串⼝中断(9)配置485收发使能引脚PG4默认是接收功能,所以是低电平(10)点击⽣成⼯程3.软件设计(1)根据功能,系统要每⼀秒发送⼀个0x88出去,那么就在main的while(1)循环中填写如下代码:while (1){//将485芯⽚设置为发送模式HAL_GPIO_WritePin(GPIOG, GPIO_PIN_4, GPIO_PIN_SET);TxByte = 0x88;//发送数据HAL_UART_Transmit(&huart2, (uint8_t *)&TxByte, 1, 0xFF);//将485芯⽚设置为接收模式HAL_GPIO_WritePin(GPIOG, GPIO_PIN_4, GPIO_PIN_RESET);HAL_Delay(1000);}(2)如果接收到0x55那么返回0x01,如果接收到的数据不是0x55就返回0x00。

这⾥⽤到中断,写⼀个中断回调函数如下:void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){if (0x55 == RxByte){TxByte = 0x01;HAL_GPIO_WritePin(GPIOG, GPIO_PIN_4, GPIO_PIN_SET);HAL_UART_Transmit(&huart2, (uint8_t *)&TxByte, 1, 0xFF);}else{TxByte = 0x02;HAL_GPIO_WritePin(GPIOG, GPIO_PIN_4, GPIO_PIN_SET);HAL_UART_Transmit(&huart2, (uint8_t *)&TxByte, 1, 0xFF);}HAL_GPIO_WritePin(GPIOG, GPIO_PIN_4, GPIO_PIN_RESET); //重新使能串⼝接收中断HAL_UART_Receive_IT(&huart2, (uint8_t *)&RxByte, 1);}(3)默认是要使能485接收的,那么串⼝接收中断默认应该也是开启的,所以在main函数的while(1)之前添加上下⾯的代码:HAL_UART_Receive_IT(&huart2, (uint8_t *)&RxByte, 1);齐活,下载验证:。

RS-485和Modbus通信协议及工作原理

RS-485和Modbus通信协议及工作原理在(工业控制)、电力通讯、(智能)仪表等领域,通常情况下是采用串口(通信)的方式进行数据交换。

最初采用的方式是(RS)232接口,由于(工业)现场比较复杂,各种(电气)设备会在环境中产生比较多的电磁千扰,会导致(信号)传输错误。

1979年施耐德电气制定了一个用于工业现场的总线协议Modbus协议,现在工业中使用RS485通信场合很多都采用Modbus 协议,所以今天我们来了解下RS485通信和Modbus通信协议。

什么是串口通信串口通信(Serial Communication),是指外设和计算机间,通过数据信号线、地线、控制线等,按位进行传输数据的一种通讯方式。

这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。

由于串行通信是在一根传输线上一位一位的传送信息,所用的传输线少,并目可以借助现成的电话网进行信息传送,因此,特别适合于远距离传输。

(RS-485)协议概述RS-485和RS-232一样,都是审行通信标准,现在的标准名称是(TI)A485/EIA-485-A,但是人们会习惯称为RS485标准,RS-485常用在工业、自动化、汽车和建筑物管理等领域。

RS-485总线弥补了RS-232通信距离短,速率低的缺点,RS-485的速率可高达10Mbit/s,理论通讯距离可达1200米;RS-485和RS-232的单端传输不一样是差分传输,使用一对双绞线,其中一根线定义为A,另一个定义为B。

通常情况下,RS485的信号在传送出去之前会先分解成正负对称的两条线路(即我们常说的A、B信号线),当到达接收端后,再将信号相减还原成原来的信号。

拓扑结构RS485有两线制和四线制两种接线,四线制只能实现点对点的通信方式,现很少采用,多采用的是两线制接线方式,这种接线方式为总线拓扑结构,在同一总线上最多可以挂接32个节点RS-485总线同12C总线一样支持主从模式,支持点对点单从机模式,也支持多从机模式,不支持多主机模式。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

rs485半双工程序发送文件及文本(十六进制、二进
制数据)

(这是***编写的一个RS485半双工传输程序的协议,及说明。支持全双工,可以
发送文件和字符,对文件采取分块传输的原则。发送文本支持16进制二进制自
动发送,功能比串口调试助手强大,免费提供源代码renchunyun@sina.com,

1、RS485传输协议格式

(1)、传输文件
A、请求包
是发送方发给接收方的,用于发送方向接收方发出发送文件的请求
ENQ 文件尺寸 文件名长度 文件名 校验

ENQ=5 一个字节
文件尺寸 4个字节
文件名长度 1个字节
文件名 若干字节
校验 1个字节
B、普通数据包
普通数据包是发送方向接收方发送的具有固定长度的数据包共1028个字节
STX 序号 数据(1024个字节) 校验
STX是包标识,表明是一个普通数据包,长度为一字节。值为2
序号用来标识当前数据包在整个传输过程中的顺序号,2个字节
数据为传输的具体数据内容,1024个字节
校验位,为从STX开始的所有字节的异或和

C、结束数据包
ETX 数据长度 序号 数据 校验
ETX为结束包首字符,表示一个包的结束,1个字节
数据长度为两个字节为该数据包传输的数据长度
数据包含具体要传输的内容,长度由数据长度值决定。
D、响应包
一个字节
名称 取值 含义
ACK 6 接收方收到正确无误的数据
NAK 21 发送方收到的数据有错误
CAN 24 接收方由于某种原因取消了发送方的传输请求


(2)、传输文本

传输文本格式
SOH 0 文本长度 0 文本内容
SOH为传输文本头,长度为1字节,内容为1
第二个段为2个0字节,第四个段为1个0字节,这两个段主要是为了与传输文
件的格式保持一致,便于接收端接收。

文本长度为2个字节;
文本内容段为具体的文本内容,长度由文本长度段决定。
由于传输文本不具有校验位,所以不具有检错能力。
(2)、发送及接收状态
文件发送态
0态:发送操作尚未开始处于接收态,单击发送文件,提示输入文件名后,此时
即是0态,此时发送以ENQ为头的请求包,通知对方接收文件。然后进入1态。

1态:表示发送操作已经开始,等待对方响应,若受到Ack,则表示上次传输成
功,然后判断剩余文件长度是否小于1024 ,是则发送ETX数据包,然后转2态。
否则发送Stx数据包。收到CAN表示对方拒绝接受此文件取消操作。收到NAK,
表示传输错误要求重传。

2态:表示发送方已发送结束数据包,等待对方确认,若收到NAK,则重传上次
数据包;若收到ACK,则传输成功切换到初始状态即接收0态。

文本发送态:
仅有一个状态
把要送的文本加上包头,按传输文本的格式传输出去。无校验也没有确认包。
文本发送辅助功能:自动发送,16进制发送及接收,二进制发送及接收,自动
清空等。

接收状态
分两种即0态和接收1态。
0态:程序处于接收状态,等待发送方的请求包,若收到一完整的数据包后,首
先判断数据包是否为请求包,不是则退出消息响应函数,是则提出包头看是为文
件请求包还是文本数据的发送。若是文件请求包,从包内容中提取发送方发送的
文件名称,及文件大小开辟内存空间,存储到默认的存储路径中。若接收方开辟
内存空间失败则发送CAN,成功接收将接收数据序号设为1,发送ACK,并切换
到接收1态。若为文本数据,提取并显示在接受界面上并退出消息循环函数。

1态:表示程序处于数据接收状态,等待接收普通数据包或结束数据包,当接收
方接受到一帧完整的数据包后首先检查数据包类型。若是普通数据包,检查校验
位,校验正确,则提取其中数据并写入文件,发送ACK,校验错误则发送NAK要
求重传。若是结束包,同样检查校验位,若校验正确置状态为0态,发送ACK,
否则发NAK要求重传。

3、RS485程序结构
(1)、线程及主要操作函数
a、主线程
本程序在主线程中除进行串口的基本设置如设置、读写函数等,最重的是处理文
件及文本的接受和发送。此功能由OnReceiveEvent()来实现。这是一个自定
义消息函数。实现步骤如下:
(1)、在RS485View.h中定义消息 #define WM_MYMSG WM_USER+101;
(2)、RS485View.h中在
//}}AFX_MSG
……..
DECLARE_MESSAGE_MAP()
中定义函数
afx_msg LONG OnReceiveEvent(WPARAM wParam,LPARAM lParam);
(3)在RS485View.cpp中
添加ON_MESSAGE(WM_MYMSG,OnReceiveEvent)最后如下

//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CFormView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CFormView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview)
ON_MESSAGE(WM_MYMSG,OnReceiveEvent)
END_MESSAGE_MAP()
(4)在检测线程中检测有无字符到达有则发送消息
::SendMessage(hWnd,WM_MYMSG,0,(LPARAM)EV_RXCHAR);
(5)在LONG CRS485View::OnReceiveEvent(WPARAM wParam,LPARAM lParam){}
接收消息实现消息循环

b、检测线程
检测线程由函数OnOpencom()调用CreateThread创建。
DWORD WINAPI ThreadProcEvent(LPVOID pParam);
此函数是检测串口事件,发送消息通知主线程开始数据接收

相关文档
最新文档