用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; }

浙公网安备 33010602011771号