通用GPIO模拟串口,提供源代码,本人经过测试OK(第一版)
--------------------------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;
; //定时器修改此标志
; //
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 = ;
}
void tx_timer_inter(void)//中断服务程序
{
tx_flag = ;
}
void init_timer(void)
{
STR_FP_ISR_CALLBACK fp;
fp = GetOldIsrCallback();
fp.Timer0 = tx_timer_inter;
RegIsrCallback(fp);
TimerInit(TIMER0,,,INT);
fp = GetOldIsrCallback();
fp.Timer1 = rx_timer_inter;
RegIsrCallback(fp);
TimerInit(TIMER1,,,INT);
}
void start_tx_timer(void)
{
StartTimer(TIMER0);
tx_flag = ;
}
void start_rx_timer(void)
{
StartTimer(TIMER1);
rx_flag = ;
}
void stop_tx_timer(void)
{
StopTimer(TIMER0);
}
void stop_rx_timer(void)
{
StopTimer(TIMER1);
}
//GPIO模块串口TX
//GPIO模拟串口RX
void init_gpio(void)
{
GpioInit(GPIOC,,OUTPUT);
GpioBitOut(GPIOC,,);
GpioInit(GPIOC,,INPUT);
}
unsigned char read_rx_line(void)
{
);
}
void write_tx_line(unsigned char dat)
{
GpioBitOut(GPIOC,,dat);
}
void serial_init(void)
{
serial.digital = ;
serial.stop = ;
serial.parriy = ;
serial.baud = ; // BAUD = baud / 9600
init_timer();
init_gpio();
}
#endif
unsigned char make_odd_bit(unsigned char ch)
{
unsigned char check,i;
;i<;i++)
{
check += ( (ch & (<<i)) >> i );
}
== )
;
else
;
}
unsigned char make_even_bit(unsigned char ch)
{
unsigned char check,i;
;i<;i++)
{
check += ( (ch & (<<i)) >> i );
}
== )
;
else
;
}
unsigned char odd_check(unsigned char ch,unsigned char check)
{
unsigned char temp;
temp = make_odd_bit(ch);
if(temp == check)
;
else
;
}
unsigned char even_check(unsigned char ch,unsigned char check)
{
unsigned char temp;
temp = make_even_bit(ch);
if(temp == check)
;
else
;
}
unsigned char recv_one_bit(void)
{
unsigned char ch;
while(!rx_flag);
rx_flag = ;
while(!rx_flag);
rx_flag = ;
while(!rx_flag);
rx_flag = ;
ch = read_rx_line();
while(!rx_flag);
rx_flag = ;
while(!rx_flag);
rx_flag = ;
return ch;
}
unsigned char is_start_bit(void)
{
unsigned ;
if(!rx_flag)
;
rx_flag =;
start_bit = read_rx_line(); //第一次采样RX
if(start_bit)
;
while(!rx_flag);
rx_flag = ;
start_bit = read_rx_line(); //第二次采样RX
if(start_bit)
;
while(!rx_flag);
rx_flag = ;
start_bit = read_rx_line(); //第三次采样RX
if(start_bit)
;
while(!rx_flag); //第4次
rx_flag = ;
while(!rx_flag); //第5次
rx_flag = ;
;
}
unsigned char is_stop_bit(void)
{
return recv_one_bit();
}
unsigned char recv_one_byte(unsigned char *ch)
{
unsigned ,temp=;
unsigned ;
*ch =;
if(!is_start_bit())
;
;i++)
{
temp |= (recv_one_bit() << i);
}
)
{
}
)
{
parriy_bit = recv_one_bit();
if(!even_check(temp,parriy_bit))
;
}
)
{
parriy_bit = recv_one_bit();
if(!odd_check(temp,parriy_bit))
;
}
else //Default:None
{
}
)
{
if(!is_stop_bit())
;
}
)
{
if(!is_stop_bit())
;
if(!is_stop_bit())
;
}
else //Default : stop =1
{
if(!is_stop_bit())
;
}
*ch = temp;
;
}
unsigned char recv_n_byte(unsigned char *buf)
{
unsigned ;
unsigned ;
unsigned ;
unsigned ;
)
{
if(recv_one_byte(&ch))
{
buf[i++] = ch;
count = ;
}
else
{
count++;
if(count > timeout)
break;
}
}
return i;
}
void send_one_byte(unsigned char ch)
{
unsigned ,parriy_bit;
tx_flag = ;
start_tx_timer();
write_tx_line();
while(!tx_flag);
tx_flag = ;
write_tx_line();
;i++)
{
while(!tx_flag);
<< i))
write_tx_line();
else
write_tx_line();
tx_flag = ;
}
)
{
}
)
{
parriy_bit = make_even_bit(ch);
while(!tx_flag);
write_tx_line(parriy_bit);
tx_flag = ;
}
)
{
parriy_bit = make_odd_bit(ch);
while(!tx_flag);
write_tx_line(parriy_bit);
tx_flag = ;
}
else
{
;
}
)
{
while(!tx_flag);
write_tx_line();
tx_flag = ;
}
)
{
while(!tx_flag);
write_tx_line();
tx_flag = ;
while(!tx_flag);
write_tx_line();
tx_flag = ;
}
else
{
while(!tx_flag);
write_tx_line();
tx_flag = ;
}
while(!tx_flag);
tx_flag = ;
stop_tx_timer();
}
void send_n_byte(unsigned char *buf,unsigned char num)
{
unsigned ;
;i<num;i++)
{
send_one_byte(buf[i]);
}
}
-----------------------------main.c------------------------------
void main(void)
{
SetSysClk(PLL_CLK_128MHz);//
)
{
send_n_byte("hello world !\r\n",sizeof("hello world !\r\n"));
_delay_ms();
)
{
ret = recv_n_byte(buf);
if(ret)
{
send_n_byte(buf,ret);
}
}
}
}
通用GPIO模拟串口,提供源代码,本人经过测试OK(第一版)的更多相关文章
- GPIO模拟串口注意是事项
GPIO模拟串口需要注意的事项如下:(程序见我的博客第一篇) 1.由于串口是异步通信,则串口发送必须满足宽度要求. (1)假设串口的波特率是9600bps(1s传输9600个bit),则传输1bit需 ...
- 51单片机GPIO口模拟串口通信
51单片机GPIO口模拟串口通信 标签: bytetimer终端存储 2011-08-03 11:06 6387人阅读 评论(2) 收藏 举报 本文章已收录于: 分类: 深入C语言(20) 作者同 ...
- STM32F207 两路ADC连续转换及GPIO模拟I2C给MT9V024初始化参数
1.为了更好的方便调试,串口必须要有的,主要打印一些信息,当前时钟.转换后的电压值和I2C读出的数据. 2.通过GPIO 模拟I2C对镁光的MT9V024进行参数初始化.之前用我以前公司SP0A19芯 ...
- S5PV210之GPIO模拟I2c时序之pcf8591与at24xx linux3.0.8驱动
目录:一. 说明 二. 驱动程序说明及问题 三. 案例一 四. 案例二 一. 说明 mini210开发板上带了at24c08, 看了linux内核自带的at24.c的驱动程序,编译下载到看 ...
- [15单片机] STC15F104W开发入门及模拟串口程序
STC15F104W开发入门及模拟串口程序 Saturday, 31. March 2018 09:42AM - beautifulzzzz 前言 最近找到一款51内核的SOP8封装的8脚单片机STC ...
- Hi35xx 通用GPIO 使用篇(板子3G电源控制脚说明)
在一个嵌入式系统中使用最多的莫过于 通用输入输出 GPIO口.看到论坛中经常有朋友问海思为什么没有提供GPIO驱动.其实不然. 在海思SDK xxx/osdrv/tools/board_tools/ ...
- 用virtualbox+模拟串口+CDT调试linux内核 TCP/IP协议栈-起步
经常有人问一台机器如何将hello经网络发送给另一台机器,我确实是不知道,只能看代码了. 说明:本人对内核的研究学习也是刚刚起步,有很多不了解的,所以文中可能会有一些"一本正经的胡扯&quo ...
- gpio模拟i2c驱动
前段时间做项目,需要gpio模拟i2c通信,最后参考了一些资料,然后编写了一个程序.现在发出来,以免以后忘记,也为一些需要的朋友提供参考.不喜勿喷哈. /* 说明:该程序是基于atmel公司的sama ...
- GPIO模拟IIC接口信号质量分析
信号质量有问题的波形001: 信号质量有问题的波形002: 从上图可以看出,GPIO口模拟的I2C接口,电平都存在半高的情况. 因为I2C的接口是通过GPIO模拟实现的,该时钟信号线SCL内部默认为下 ...
随机推荐
- 只有在配置文件中或 Page 说明会 enableSessionState 至 true 时刻,能够使用会话状态。另外,还要确保应用程序配置 // 段包含 System.Web.SessionSta
首先,弄清楚我们的目的,我的目标是验证用户登录.那是,Session["userName"]!=null 在ok该 起初,我是这么写的,结果给出,提示如果上述错误标题,在调查的很长 ...
- Androidannotation使用之@Rest与server交互的JSON数据转换(二)
开篇 之前的一篇博客:Androidannotation使用之@Rest获取资源及用户登录验证(一):http://blog.csdn.net/nupt123456789/article/detail ...
- systrace跟踪 Android性能优化
http://blog.csdn.net/oujunli/article/details/8138172 http://blog.csdn.net/oujunli/article/details/50 ...
- Java theory and practice: Thread pools and work queues--reference
Why thread pools? Many server applications, such as Web servers, database servers, file servers, or ...
- 编写android的widget
以前对这个东西很感兴趣,因为确实方便,如今有时间了来做一个例子 首先要定义一个layout(widgetview.xml)和一个配置文件(widgetconfig.xml) <?xml vers ...
- Android(java)学习笔记202:Handler消息机制的原理和实现
联合学习 Android 异步消息处理机制 让你深入理解 Looper.Handler.Message三者关系 1. 首先我们通过一个实例案例来引出一个异常: (1)布局文件activity_m ...
- ZOJ 3903 Ant(公式推导)
这个公式推导过程是看的这位大牛的http://blog.csdn.net/bigbigship/article/details/49123643 扩展欧几里德求模的逆元方法: #include < ...
- 14、SQL Server 存储过程
SQL Server 存储过程 存储过程类似函数,可以重复使用.相对于函数,存储过程拥有更强大的功能和更高的灵活性. 存储过程中可以包含逻辑控制语句和数据操作语句,可以接受参数,输出参数,返回单个值或 ...
- Java_Activiti5_菜鸟也来学Activiti5工作流_之初识常用服务类和数据表(二)
/** * 代码清单中使用 ProcessEngines类加载默认的流程配置文件(activiti.cfg.xml),再获取各个服务组件的实例. * RepositoryService主要用于管理流程 ...
- cocos2dx 各种环境的搭建
http://www.cocos.com/doc/tutorial/index?type=cocos2d-x Windows7上搭建Cocos2d-x 3.4开发环境 这里需要注意的是,如果是搭建VS ...