Linux下用XMODEM实现TR800图片传输

来源:互联网 发布:c语言是用什么写的 编辑:程序博客网 时间:2024/06/06 07:29

此为本人开发经历,诸如“引言”、“什么是XMODEM”、“TR800介绍”......在此就不再赘述,需要了解的各位可以去“摆渡一下”... ...

那下面进入正题... ...

用串口传输文件的时候容易出错,必须采用具有差错校验的传输协议进行控制。Xmodem就是这样的一个传输控制协议,因其简单性和较好的性能而被广泛应用。它支持128 字节和1K 字节两种类型的数据包,支持三种校验方式,分别是:CHECKSUM(普通校验和),128-CRC128字节的循环冗余校验),1K-CRC1K字节的循环冗余校验),在出现数据包错误的情况下支持多次重传(一般为10 次)。

 

Xmodem 协议传输由接收程序和发送程序完成。程序开始时,发送方向接收方发送指令,请求传输文件;此时由接收程序发送协商字符,协商校验方式。一般地,如果从接受方返回的是字符“C”,则发送方采用128-CRC方式进行数据包发送;如果返回的是“NAK”,则采用CHECKSUM方式进行传输;如果返回的是“STX”,则采用1K-CRC方式进行传输。若长时间没有收到来自接收方的协商字符,则取消本次传输。

 

协商通过之后发送程序就开始发送数据包,接收程序接收到完整的一个数据包之后按照协商的校验方式对数据包进行校验。校验通过之后发送确认字符,“ACK”表示接收数据包正确,发送程序继续发送下一包;“NAK”表示传输出错,请求再次重发,重发次数超限则取消本次传输。在传输的末尾,由发送方发送16进制字符0X04,表示此为最后一次发送。

 

Xmodem的数据包由以下四个部分组成:帧头(SOH),数据包号(0~255),包号取反,1281k字节的数据,校验位。如果是CHUCKSUM校验,则校验位为1字节;如果是CRC校验,则校验位为2字节。对于128字节的数据传输方式来说,它的数据包由可能是132字节或者133字节,取决于校验方式。累加和校验是一种比较简单的校验方法,其基本原理就是把所有的数据进行累加,得到一个字节的累加和,将累加和作为校验数据附加在数据帧末尾封装成完整的帧传送出去。累加和校验方法只适合于线路情况良好,误码率较低的环境使用。

 

Xmodem 文件传输一般选用CRC- 16(CCITT)校验方法,简称CRC-CCITT,其生成多项式为: X16+X12+X5+1。用二进制表示为:10001000000100001, 十六进制表示为( 因为首位均为1,为计数方便,统一去掉第一位)0x1021, 初始值取0x0000,输出异或掩码0x0000

 

CRC- CCITT常见有两种计算方法:查表法和代数法。虽然代数法需要的存储容量少,但是查表法在速度上具有明显的优势,符合嵌入式系统对于运算速度的要求。因此,嵌入式系统一般选择查表法作为CRC计算方法。

 

由于本系统功能中,彩信模块TR800只进行发送彩信,并不负责接收彩信,所以在设计主控板Xmodem协议的时候,省略了接收文件的部分;再则,在发送方发送“开始文件传输”指令之后,TR800将会返回字符“C”,16进制的0X06,而不会是“STX”或者“NAK”,可以省去一些判断,只要接收到字符C,就说明接收方已在等待接受数据,发送方可以开始发送数据包;并且,由这个字符C可知,TR800内部采用的是CRC16校验,因此就没有必要再去设计CHECKSUM校验了。这就是本系统功能的设计思想。

 

图片传输成功后,发送彩信就变得非常简单,按照手册上输入一系列AT指令即可完成。首先须对TR800模块进行一些初始化设置,比如设置接入点(CMWAP)、IP地址(10.0.0.172)、端口号(80)以及服务器网址。设置完毕后就可以进行彩信的发送,包括设置目标手机号码、彩信标题、彩信内容、附件,附件可以有多个。

 

由于时间关系,到此为止只实现了TR800的单向彩信发送。等过段时间空闲的时候,我将试着把XMODEM功能全部实现,并用miniGUI做个图形界面--收版权的哦......(在WINDOWS下已经有这样的程序了)

 

敬请期待~~ 哈哈!

原创粉丝点击