通用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内部默认为下 ...
随机推荐
- POJ 2750 Potted Flower
Potted Flower Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 3872 Accepted: 1446 Des ...
- Linux命令之dot - 绘制DOT语言脚本描述的图形
本文链接:http://codingstandards.iteye.com/blog/840055 用途说明 Graphviz (Graph Visualization Software的缩写)是一个 ...
- Objective-C:KVC
1 概述 1.1 访问方法 Key-value coding(KVC)是一种间接访问对象属性的机制,类似键值对,通过名字(或键)可以直接获得对象的属性值.事实上,key-value coding定义了 ...
- mysql复习笔记
阅读目录 1.什么是SQL语句2.使用sql语句创建数据库和表3.创建数据表4.数据完整性约束5.四中基本字符类型说明6.SQL基本语句7.类型转换函数8.日期函数9.数学函数10.字符串函数11.联 ...
- tableView嵌套collectionView
首先是自定义collectionView填充的tableViewCell import UIKit // 定义一个collectionView,重写初始化大小和布局方法 class TrendsDet ...
- PV、UV、IP的区别
网站推广需要一个网站访问统计工具,常用的统计工具有百度统计.51la.量子恒道统计等.网站访问量常用的指标为PV.UV.IP.那么什么是PV.UV和IP,PV.UV.IP的区别是什么? --首先来看看 ...
- PHP算法 《图》 之 理论基础
转载自:http://www.cnblogs.com/skywang12345/p/3691463.html Ⅰ 图的基本概念 1. 图的定义 定义:图(graph)是由一些点(vertex)和这些点 ...
- html 5的localstorag
随着我们硬件技术的发展,浏览器本身的功能也愈发的完善,从之前的cookie到现在的本地缓存机制,再到web storage,在之前html4 的时候使用cookie具有一些明显的局限,如大小限制,co ...
- Builder 模式
Builder 模式和 AbstractFactory 模式在功能上很相似,因为都是用来创建大的复杂的对象,它们的区别是:Builder 模式强调的是一步步创建对象,并通过相同的创建过程可以获得不同的 ...
- cocos2dx 实现华丽丽的滚动层.
前言 好久没写博客了. 前几周策划要求实现一个比较多功能的滚动层控件. 这个艰巨的任务就这样自然而然的落在了我这小身板上. 当然了, 只要我出手, 难度再高的需求也变得不堪一击. 哈哈哈哈 示例图 该 ...