通用GPIO模拟串口,提供源代码,本人经过测试OK。(第一版)
来源:互联网 发布:网络国际象棋游戏 编辑:程序博客网 时间:2024/06/05 15:35
--------------------------serial.h------------------------------------------
#ifndef _SERIAL_H_
#define _SERIAL_H_
#define my_board
#ifdef my_board //只需修改这里,就可移植到STM32等多种支持定时器的单片机中。
void rx_timer_inter(void);
void tx_timer_inter(void);
void init_timer(void);
void start_tx_timer(void);//接收和发送分别采用一个定时器
void start_rx_timer(void);
void stop_rx_timer(void);
void stop_rx_timer(void);
//GPIO模块串口TX
//GPIO模拟串口RX
void init_gpio(void); //配置TX为输出,RX为输入管脚,并设置TX管脚的初始状态为1
unsigned char read_rx_line(void);
void write_tx_line(unsigned char dat);
#endif
//串口信息的结构体
struct serial_t{
unsigned char digital;
unsigned char parriy; //none even odd
unsigned char stop;
unsigned char baud;
};
static struct serial_t serial;
static unsigned char tx_flag=0; //定时器修改此标志
static unsigned char rx_flag=0; //
unsigned char make_odd_bit(unsigned char ch);
unsigned char make_even_bit(unsigned char ch);
unsigned char odd_check(unsigned char ch,unsigned char check);
unsigned char even_check(unsigned char ch,unsigned char check);
void serial_init(void);
unsigned char recv_one_bit(void);
unsigned char is_start_bit(void);
unsigned char is_stop_bit(void);
unsigned char recv_one_byte(unsigned char *ch);
unsigned char recv_n_byte(unsigned char *buf);
void send_one_byte(unsigned char ch);
void send_n_byte(unsigned char *buf,unsigned char num);
#endif
------------------------------------------------------------------
----------------------------serial.c--------------------------------
#include "serial.h"
#include "global.h"
#ifdef my_board
void rx_timer_inter(void)//中断服务程序
{
rx_flag = 1;
}
void tx_timer_inter(void)//中断服务程序
{
tx_flag = 1;
}
void init_timer(void)
{
STR_FP_ISR_CALLBACK fp;
fp = GetOldIsrCallback();
fp.Timer0 = tx_timer_inter;
RegIsrCallback(fp);
TimerInit(TIMER0,13334,0,INT);
fp = GetOldIsrCallback();
fp.Timer1 = rx_timer_inter;
RegIsrCallback(fp);
TimerInit(TIMER1,2667,0,INT);
}
void start_tx_timer(void)
{
StartTimer(TIMER0);
tx_flag = 0;
}
void start_rx_timer(void)
{
StartTimer(TIMER1);
rx_flag = 0;
}
void stop_tx_timer(void)
{
StopTimer(TIMER0);
}
void stop_rx_timer(void)
{
StopTimer(TIMER1);
}
//GPIO模块串口TX
//GPIO模拟串口RX
void init_gpio(void)
{
GpioInit(GPIOC,1,OUTPUT);
GpioBitOut(GPIOC,1,1);
GpioInit(GPIOC,2,INPUT);
}
unsigned char read_rx_line(void)
{
return GpioBitIn(GPIOC,2);
}
void write_tx_line(unsigned char dat)
{
GpioBitOut(GPIOC,1,dat);
}
void serial_init(void)
{
serial.digital = 8;
serial.stop = 1;
serial.parriy = 0;
serial.baud = 1; // BAUD = baud / 9600
init_timer();
init_gpio();
}
#endif
unsigned char make_odd_bit(unsigned char ch)
{
unsigned char check,i;
for(i=0;i<8;i++)
{
check += ( (ch & (1<<i)) >> i );
}
if(check % 2 == 0)
return 0;
else
return 1;
}
unsigned char make_even_bit(unsigned char ch)
{
unsigned char check,i;
for(i=0;i<8;i++)
{
check += ( (ch & (1<<i)) >> i );
}
if(check % 2 == 0)
return 1;
else
return 0;
}
unsigned char odd_check(unsigned char ch,unsigned char check)
{
unsigned char temp;
temp = make_odd_bit(ch);
if(temp == check)
return 1;
else
return 0;
}
unsigned char even_check(unsigned char ch,unsigned char check)
{
unsigned char temp;
temp = make_even_bit(ch);
if(temp == check)
return 1;
else
return 0;
}
unsigned char recv_one_bit(void)
{
unsigned char ch;
while(!rx_flag);
rx_flag = 0;
while(!rx_flag);
rx_flag = 0;
while(!rx_flag);
rx_flag = 0;
ch = read_rx_line();
while(!rx_flag);
rx_flag = 0;
while(!rx_flag);
rx_flag = 0;
return ch;
}
unsigned char is_start_bit(void)
{
unsigned char start_bit=1;
if(!rx_flag)
return 0;
rx_flag =0;
start_bit = read_rx_line(); //第一次采样RX
if(start_bit)
return 0;
while(!rx_flag);
rx_flag = 0;
start_bit = read_rx_line(); //第二次采样RX
if(start_bit)
return 0;
while(!rx_flag);
rx_flag = 0;
start_bit = read_rx_line(); //第三次采样RX
if(start_bit)
return 0;
while(!rx_flag); //第4次
rx_flag = 0;
while(!rx_flag); //第5次
rx_flag = 0;
return 1;
}
unsigned char is_stop_bit(void)
{
return recv_one_bit();
}
unsigned char recv_one_byte(unsigned char *ch)
{
unsigned char i=0,temp=0;
unsigned char parriy_bit=0;
*ch =0;
if(!is_start_bit())
return 0;
for(;i<8;i++)
{
temp |= (recv_one_bit() << i);
}
if(serial.parriy == 0)
{
}
else if(serial.parriy == 1)
{
parriy_bit = recv_one_bit();
if(!even_check(temp,parriy_bit))
return 0;
}
else if(serial.parriy == 2)
{
parriy_bit = recv_one_bit();
if(!odd_check(temp,parriy_bit))
return 0;
}
else //Default:None
{
}
if(serial.stop == 1)
{
if(!is_stop_bit())
return 0;
}
else if(serial.stop == 2)
{
if(!is_stop_bit())
return 0;
if(!is_stop_bit())
return 0;
}
else //Default : stop =1
{
if(!is_stop_bit())
return 0;
}
*ch = temp;
return 1;
}
unsigned char recv_n_byte(unsigned char *buf)
{
unsigned int i=0;
unsigned int count=0;
unsigned int timeout = 200000;
unsigned char ch=0;
while(1)
{
if(recv_one_byte(&ch))
{
buf[i++] = ch;
count = 0;
}
else
{
count++;
if(count > timeout)
break;
}
}
return i;
}
void send_one_byte(unsigned char ch)
{
unsigned char i=0,parriy_bit;
tx_flag = 0;
start_tx_timer();
write_tx_line(1);
while(!tx_flag);
tx_flag = 0;
write_tx_line(0);
for(;i<8;i++)
{
while(!tx_flag);
if(ch & (1<< i))
write_tx_line(1);
else
write_tx_line(0);
tx_flag = 0;
}
if(serial.parriy == 0)
{
}
else if(serial.parriy == 1 )
{
parriy_bit = make_even_bit(ch);
while(!tx_flag);
write_tx_line(parriy_bit);
tx_flag = 0;
}
else if(serial.parriy == 2 )
{
parriy_bit = make_odd_bit(ch);
while(!tx_flag);
write_tx_line(parriy_bit);
tx_flag = 0;
}
else
{
;
}
if(serial.stop == 1)
{
while(!tx_flag);
write_tx_line(1);
tx_flag = 0;
}
else if(serial.stop == 2)
{
while(!tx_flag);
write_tx_line(1);
tx_flag = 0;
while(!tx_flag);
write_tx_line(1);
tx_flag = 0;
}
else
{
while(!tx_flag);
write_tx_line(1);
tx_flag = 0;
}
while(!tx_flag);
tx_flag = 0;
stop_tx_timer();
}
void send_n_byte(unsigned char *buf,unsigned char num)
{
unsigned char i=0;
for(i=0;i<num;i++)
{
send_one_byte(buf[i]);
}
}
-----------------------------main.c------------------------------
void main(void)
{
SetSysClk(PLL_CLK_128MHz);//
while(1)
{
send_n_byte("hello world !\r\n",sizeof("hello world !\r\n"));
_delay_ms(1000);
while(1)
{
ret = recv_n_byte(buf);
if(ret)
{
send_n_byte(buf,ret);
}
}
}
}
- 通用GPIO模拟串口,提供源代码,本人经过测试OK。(第一版)
- esp8266 GPIO模拟串口
- 冰点(Deep Freeze)6.0教程 获取密码! 经过测试OK~~
- ubuntu上安装和设置samba,和windows共享(转来的,经过测试OK)
- linux下安装openssl和调用openssl接口(经过本人测试)
- 测试串口源代码
- 软件测试类型(第一版)
- 51单片机GPIO口模拟串口通信
- 51单片机GPIO口模拟串口通信
- 51单片机GPIO口模拟串口通信
- 单片机GPIO口模拟串口的方法
- 51单片机GPIO口模拟串口通信
- 单片机GPIO口模拟串口的方法
- 通用串口测试工具 使用方法
- [资源分享] (转载)Xcode 3.2.5免证书开发调试(经过本人测试xcode4.0使用)
- 通用的I/O模拟串口程序
- C++串口操作以及串口模拟测试
- iTest微服务测试经验总结(第一版)
- how to make dword with high/low word or high/low byte
- 淘宝 叔度高性能服务器开发相关资料
- copy 的实现原理与深浅拷贝
- java学习
- JavaScript 判断用户输入的格式是否正确
- 通用GPIO模拟串口,提供源代码,本人经过测试OK。(第一版)
- 差等과 均平-互大互小의 原理
- 异常:android.os.NetworkOnMainThreadException
- 黑马程序员-张孝祥老师高新技术-反射学习总结
- Android TTS 实战一:认识 TTS
- STL容器迭代器失效问题
- lvs+ldirectord+pacemaker+corosync+mysql实现高可用负载均衡(一)
- 時用과 時義
- V4L2编程模型简介(一)