用IO模拟串口通信

最近做了串口通信的程序,为了提高通信的稳定,减少晶振不稳定的影响,就使用IO模拟串口通信的过程.

基本原理:

  使用的波特率是2400bps,传输1bit的时间大约为0.416ms.

  数据由1bit起始位+8bit数据位+1bit停止位组成,共10bit. 起始位是低电平,停止位是高电平.

  IO一直处于高电平,数据传输由低位到高位.

  上位机首先发送1byte的数据,比如0x55,然后等待接收返回的1byte数据,比如0xAA,并计算传输8bit需要的时间,求平均值,是1bit的传输时间.

  低电平表数据0,高电平表数据1.

代码:

 1 BOOL sendByte(unsigned char ucData)
 2 {
 3     unsigned char i = 0;
 4 
 5     //延时
 6     delayETU();
 7     delayETU();
 8 
 9     //发送低电平起始位
10     sentBit(0);
11     delayETU();
12 
13     //发送数据
14     for(;i<8;i++)
15     {
16         sentBit(ucData);
17         delayETU();
18         ucData>>=1;
19     }
20 
21     //发送停止位
22     sentBit(1);
23     delayETU();
24     delayETU();
25 
26     return TRUE;
27 }
BOOL getByte(unsigned char * rData)
{
    unsigned char i = 0;
    unsigned char tmp = 0;

    //开始计时
    startTimer0();    
    //等待起始位低电平
    while(reveiveBit())
    {
        //如果超过40ms没有数据到来,则报错
        if(getCurTimer() > 0xF000)
        {
            endTimer0();
            return FALSE;
        }
    }
    //关闭计时
    endTimer0();

    delayETU();
    for(;i<8;i++)
    {
        if(reveiveBit())
        {
            tmp |= (1<<i);
        }
        //延迟1etu
        delayETU();
    }

    //接收停止位
    delayETU();
    *rData = tmp;

    return TRUE;
}

 

posted @ 2013-09-27 18:23  fed  阅读(2393)  评论(0)    收藏  举报