--------------------------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(第一版)的更多相关文章

  1. GPIO模拟串口注意是事项

    GPIO模拟串口需要注意的事项如下:(程序见我的博客第一篇) 1.由于串口是异步通信,则串口发送必须满足宽度要求. (1)假设串口的波特率是9600bps(1s传输9600个bit),则传输1bit需 ...

  2. 51单片机GPIO口模拟串口通信

    51单片机GPIO口模拟串口通信 标签: bytetimer终端存储 2011-08-03 11:06 6387人阅读 评论(2) 收藏 举报 本文章已收录于:   分类: 深入C语言(20) 作者同 ...

  3. STM32F207 两路ADC连续转换及GPIO模拟I2C给MT9V024初始化参数

    1.为了更好的方便调试,串口必须要有的,主要打印一些信息,当前时钟.转换后的电压值和I2C读出的数据. 2.通过GPIO 模拟I2C对镁光的MT9V024进行参数初始化.之前用我以前公司SP0A19芯 ...

  4. S5PV210之GPIO模拟I2c时序之pcf8591与at24xx linux3.0.8驱动

    目录:一. 说明 二. 驱动程序说明及问题 三. 案例一       四. 案例二 一. 说明 mini210开发板上带了at24c08, 看了linux内核自带的at24.c的驱动程序,编译下载到看 ...

  5. [15单片机] STC15F104W开发入门及模拟串口程序

    STC15F104W开发入门及模拟串口程序 Saturday, 31. March 2018 09:42AM - beautifulzzzz 前言 最近找到一款51内核的SOP8封装的8脚单片机STC ...

  6. Hi35xx 通用GPIO 使用篇(板子3G电源控制脚说明)

    在一个嵌入式系统中使用最多的莫过于 通用输入输出 GPIO口.看到论坛中经常有朋友问海思为什么没有提供GPIO驱动.其实不然. 在海思SDK  xxx/osdrv/tools/board_tools/ ...

  7. 用virtualbox+模拟串口+CDT调试linux内核 TCP/IP协议栈-起步

    经常有人问一台机器如何将hello经网络发送给另一台机器,我确实是不知道,只能看代码了. 说明:本人对内核的研究学习也是刚刚起步,有很多不了解的,所以文中可能会有一些"一本正经的胡扯&quo ...

  8. gpio模拟i2c驱动

    前段时间做项目,需要gpio模拟i2c通信,最后参考了一些资料,然后编写了一个程序.现在发出来,以免以后忘记,也为一些需要的朋友提供参考.不喜勿喷哈. /* 说明:该程序是基于atmel公司的sama ...

  9. GPIO模拟IIC接口信号质量分析

    信号质量有问题的波形001: 信号质量有问题的波形002: 从上图可以看出,GPIO口模拟的I2C接口,电平都存在半高的情况. 因为I2C的接口是通过GPIO模拟实现的,该时钟信号线SCL内部默认为下 ...

随机推荐

  1. 使用r.js进行前端repuirejs的合并压缩

    安装 requirejs npm install -g requirejs 安装好后: 找到刚刚requirejs的安装目录,在该目录下找到r.js,并拷贝待压缩合并项目的根目录下 在项目根目录下创建 ...

  2. Qt自定义控件(插件)并添加到QtDesigher

    之前使用Qt的时候都是手写代码的(因为批量按钮可以使用数组实现),但当界面越来越复杂时,这种开发效率就太低了; 后来就开始使用QtDesigner,但要使QtDesigner支持我自己写的控件,需要提 ...

  3. iOS 数据持久化(1):属性列表与对象归档

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css); @import url(/ ...

  4. 微信分享 分享icon和分享标题的简单设置

    前几天做的一个活动,用到微信分享功能,分享的icon.分享的标题和内容是自定义的.我上网查了一下,好多是注册微信公众号,使用微信api来实现的,注册微信号比较麻烦,最简单的方法就是 页面的title改 ...

  5. TabHost理解与使用

    一.继承关系 java.lang.Object ↳ android.view.View ↳ android.view.ViewGroup ↳ android.widget.FrameLayout ↳ ...

  6. Android之使用SharedPreferences保存用户偏好参数

    在Android应用中,我们常需要记录用户设置的一些偏好参数,,此时我们就需要用SharedPreferences和Editor将这些信息保存下来,在下次登录时读取. SharedPreference ...

  7. MySQL性能状态查看方式

    1. QPS(每秒Query量) QPS = Questions(or Queries) / seconds mysql > show global status like 'Question% ...

  8. 如何将硬盘GPT分区转换为MBR分区模式

    现在新出的笔记本普遍自带WIN8系统,硬盘分区一般都采用GPT格式,但是包括WIN7及以下的系统都无法安装在GPT格式的硬盘上,因此,如果我们需要安装WIN7系统,需要将硬盘分区从GPT转换成MBR格 ...

  9. c++实现的Array数据结构

    1.Array.h,Array<T>的定义 template <class T> class Array { protected: T *data; //一个指向数组数据的指针 ...

  10. 寒假挑战PythonTip(一人一python)总结——算法是程序的灵魂,程序员的心法

        2014年2月中旬,我上升到挑战python英雄榜第3名.这是我寒假修炼算法的成果之一.来一下总结吧! Linux的创始人Linus Torvalds在一次演讲中有一段涉及“什么才是优秀程序员 ...