通过Uart实现Xmodem协议

以s3c24xx为例,其它的cpu也类似,只是寄存器定义不一样而已。

 其实Xmodem协议本身我就不说了,网上多的是。请大家至少有些对ARM CPU,Xmodem有点了解才看此文,如果你什么都不懂,这篇文章你会云里雾里的

需要注意的要点:

1. Datasheet上提到的modem是浮云,与xmodem协议无关。一般我们的板子接上三根线TXD,RXD,GND,就可以和终端进行通讯,只要能和终端通信,恭喜你,就能实现xmodem协议。至于COM口的其他引脚:RTS,CTS等等,可能那是和真正的Modem(猫)通信需要的引线,大家不用管。

2.一般查询UTRSTAT通过中断或者轮询(polling)来进行,为了简单,我使用polling,关掉Uart的FIFO功能。简单嘛!

3. 板子上初始化Uart以后,是板子主动发送NAK(0x15)给终端(Hype temiral),时间可以自行定义,有些Arm推荐3秒钟,但是设置为30秒也行。

4.在3秒的等待时间,如果用户在终端选择xmodem上传文件,文件不会立刻上传,等待板子发送NAK以后,才开始上传。

5.在这些基本的代码中,时序非常非常重要。开始我的代码如下:

    do
    {
        putc(NAK);              //发送NAK给终端
        DelayTime(time);  //延时3秒钟, 一般time值十进制:6000000
    } while( !(UTRSTAT0 & RXD0READY));
有什么问题吗? 发送NAK以后,我开始sleep,拜托,这可是实时的操作,板子和终端信号线都准备发信号通信。

就这sleep,上传文件肯定失败啦! 正解如下:

    do
    {
        DelayTime(time);  //延时3秒钟, 一般time值十进制:6000000
        putc(NAK);              //发送NAK给终端
    } while( !(UTRSTAT0 & RXD0READY));
6.当读取了一个char值从寄存器URXH0,请调用while( !(UTRSTAT0 & RXD0READY)); 读取下一个数据,

int i = 0;

do

{

    while(!(UTRSTAT0 & RXD0READY));

    ch = URXH0;

    i++;

} while(i<132)

真实的代码请大家自己实现吧!

 

你可能感兴趣的:(通过Uart实现Xmodem协议)