飞思卡尔MC9S12G64串口发送接收驱动
因为之前刚入职,对串口调试不了解,下面整理一下书上的串口程序。 移植性还比较强
使用说明:MC9S12系列的串口有两种查询方式
1》使用中断方式查询
2》在主函数中使用轮询的方式的方法进行查询
这两种方法在下面函数中都有体现,需要在用的时候注意分别提取
主要是初始化的SCI1CR2的寄存器配置和调用中断的时候,注意串口1的中断号是VectorNumber_Vsci1 21
注意串口0的中断号是VectorNumber_Vsci0 20
下面是放到主函数中采用轮询方式时调用的函数
/*************************串口轮询方式检测*********************************************************************************/
#if 0
if(SCI1SR1_RDRF)
{
JieSHOU_Ddate[i]=SCI1DRL;
i++;
if(i==12)
{
i=0;
JieSHOU_flag=1; //接收够12 个数组数据
}
}
//MFD_Printf("JieSHOU_Ddate %d!!\r\n",JieSHOU_Ddate[i]);
#endif
*************************************************************************************************************************************************
下面是原版函数,具体使用可根据自己需求改动!
********
/*---- include ---------------------------------------*/
#include Printf.h"
#include <mc9s12g64.h>
#include <stdarg.h>
/*---- config-----------------------------------------*/
#if MFD_DBGUG
const char Hex[] = "0123456789ABCDEF";
unsigned int JieSHOU_Ddate[12];
char ASCALL_TO16[4];
int i=0;
char JieSHOU_flag;
unsigned int JieSHOU();
/*----------------------------------------------------*/
/*******************************************************
* 函数名:void USART_Init(void)
* 创建:ZXL
* 功能:串口初始化
* 版本:1.0.0
* 日期:2019年1月17日
*******************************************************/
void USART_Init(void)
{
/*********只发配置************************/
#if 0
SCI1BD = 14; //波特率115200
SCI1CR1 = 0x00; //模式配置 数据位:8 校验位:无 停止位:1
SCI1CR2 = 0x08; //发送接收配置
#endif
#if 1
/*********接收中断方式*******************/
SCI1BD = 14; //波特率115200
SCI1CR1 = 0x00; //模式配置 数据位:8 校验位:无 停止位:1
SCI1CR2 = 0x2c; //发送接收配置,,接收使能、、接收器满中断使能
#endif // SCI1CR2_ILIE=1;线路空闲使能
/*********接收查询方式*******************/
#if 0
SCI1BD = 14; //波特率115200
SCI1CR1 = 0x00; //模式配置 数据位:8 校验位:无 停止位:1
SCI1CR2 = 0x0c; //发送接收配置,,接收使能、、接收器满中断使能
#endif
}
/*******************************************************
* 函数名:void USART_SendByte(uint16_t Data)
* 创建:ZXL
* 功能:串口发送函数
* 版本:1.0.0
* 日期:2019年1月2日
*******************************************************/
static void USART_SendByte(uint16_t Data)
{
SCI1DRL = Data;
while(!SCI1SR1_TC)
{
;
}
}
/*******************************************************
* 函数名:void DoPrint( const char *fmt, va_list ap ) //va_list char
* 创建:ZXL
* 功能:执行打印函数
* 版本:1.0.0
* 日期:2019年1月2日
*******************************************************/
static void DoPrint( const char *fmt, va_list ap )
{
char ch;
char *ptr;
int value;
uint8_t fl_zero;
uint32_t i, fl_len, cnt, mask = 1;
while(1)
{
switch(ch = *fmt++)
{
case 0:
return;
case '%':
if( *fmt != '%' )
{
break;
}
else
{
}
fmt++;
default:
USART_SendByte(ch);
continue;
}
fl_zero = 0;
cnt = 0;
ch = *fmt++;
if(ch == '0')
{
fl_zero = 1;
ch = *fmt++;
cnt = ch - '0';
ch = *fmt++;
}
else if( (ch >= '0') && (ch <= '9'))
{
cnt = ch - '0';
ch = *fmt++;
}
else
{
}
fl_len = 4;
switch(ch)
{
case 'l':
case 'L':
ch = *fmt++;
fl_len = 4;
break;
case 'b':
case 'B':
ch = *fmt++;
fl_len = 1;
break;
default:
break;
}
switch(ch)
{
case 'd':
case 'u':
switch(fl_len)
{
case 1:
if(ch == 'd')
{
value = (char)va_arg(ap, int);
}
else
{
value = (uint8_t)va_arg(ap, int);
}
break;
case 4:
if(ch == 'd')
{
value = (uint32_t)va_arg(ap, uint32_t);
}
else
{
value = (uint32_t)va_arg(ap, uint32_t);
}
break;
default:
break;
}
if(value < 0)
{
USART_SendByte('-');
value = value*(-1);
}
else
{
}
if(cnt == 0)
{
if(value == 0)
{
USART_SendByte('0');
continue;
}
else
{
}
for(cnt=0, mask=1; cnt<10; cnt++)
{
if((value / mask)==0)
{
break;
}
else
{
}
mask = mask * 10;
}
}
else
{
}
for(i = 0, mask = 1; i < cnt-1; i++)
{
mask = mask*10;
}
while(1)
{
ch = (value / mask) + '0';
if((ch=='0') && (fl_zero==0) && (mask != 1))
{
ch=' ';
}
else
{
fl_zero = 1;
}
USART_SendByte(ch);
value = value % (mask);
mask = mask / 10;
if(mask == 0)
{
break;
}
else
{
}
}
continue;
case 'x':
case 'X':
switch(fl_len)
{
case 1:
value = (uint8_t)va_arg(ap, int);
break;
case 4:
value = (uint32_t)va_arg(ap, int);
break;
default:
break;
}
if(value <= 0x0F)
{
cnt = 1;
}
else if(value <= 0xFF)
{
cnt = 2;
}
else if(value <= 0xFFF)
{
cnt = 3;
}
else if(value <= 0xFFFF)
{
cnt = 4;
}
else if(value <= 0xFFFFF)
{
cnt = 5;
}
else if(value <= 0xFFFFFF)
{
cnt = 6;
}
else if(value <= 0xFFFFFFF)
{
cnt = 7;
}
else
{
cnt = 8;
}
for(i=0; i<cnt; i++)
{
USART_SendByte(Hex[(value >> (cnt - i - 1) * 4) & 0x000F]);
}
continue;
case 's':
ptr = (char *)va_arg(ap, char*);
while(*ptr!='\0')
{
USART_SendByte(*ptr++);
}
continue;
case 'c':
value = va_arg(ap, int);
USART_SendByte((uint8_t)value);
continue;
default:
value = (uint16_t)va_arg(ap, int);
continue;
}
}
}
/*******************************************************
* 函数名:void MFD_Printf(const char *fmt, ...)
* 创建:ZXL
* 功能:串口打印函数
* 版本:1.0.0
* 日期:2018年1月2日
*******************************************************/
void MFD_Printf(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
DoPrint(fmt, ap);
va_end(ap);
}
#else
void MFD_Printf(const char *fmt, ...)
{
}
#endif
unsigned int JieSHOU()
{
unsigned int Result;
unsigned int Result_high;
unsigned int Temp; //清内存
Temp=SCI1SR1;
while(!SCI1SR1_RDRF);
Result=SCI1DRL;
Result_high=SCI1DRH;
return Result;
//return Result_high;
}
unsigned int num1111;
/******************SCI 中断方式查询************************************************/
#if 1
#pragma CODE_SEG NON_BANKED
interrupt VectorNumber_Vsci1 void Sci_Isr(void) //串口1中断号 21
{
SCI1CR2_RIE=0; //中断申请禁止、RDRF OR 接收数据寄存器满标志 溢出标志
JieSHOU_Ddate[i]=JieSHOU();
MFD_Printf("JieSHOU_Ddate %d!!\r\n",JieSHOU_Ddate[i]);
i++;
if(i==8)
{
i=0;
JieSHOU_flag=1; //接收够12 个数组数据
}
SCI1CR2_RIE=1; //中断申请允许、RDRF OR 接收数据寄存器满标志 溢出标志
}
#endif
***********************************************************************************************************************************************
以下为串口的.H文件
*******************************************************/
#ifndef __PRINTF_H
#define __PRINTF_H
/*-----debug open or colse-----------------------------*/
typedef signed char int8_t;
typedef signed short int16_t;
typedef signed int int32_t;
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
#define MFD_DBGUG 1
/*-----function----------------------------------------*/
extern void USART_Init(void);
extern void MFD_Printf(const char *fmt, ...);
extern unsigned int JieSHOU_Ddate[12];
extern unsigned int JieSHOU();
extern char JieSHOU_flag;
extern int i;
#endif
***********************************************************************************************************************************************
以下为串口的轮询方式
/*************************串口轮询方式检测*********************************************************************************/
#if 0
if(SCI1SR1_RDRF)
{
JieSHOU_Ddate[i]=SCI1DRL;
i++;
if(i==12)
{
i=0;
JieSHOU_flag=1; //接收够12 个数组数据
}
}
//MFD_Printf("JieSHOU_Ddate %d!!\r\n",JieSHOU_Ddate[i]);
#endif
飞思卡尔MC9S12G64串口发送接收驱动相关推荐
- 飞思卡尔MC9S12X:CAN接收配置
飞思卡尔MC9S12X:CAN初始化配置 飞思卡尔MC9S12X:CAN发送配置 飞思卡尔MC9S12X:CAN接收配置 飞思卡尔MC9S12X:CAN驱动函数在主函数中的应用 一.MSCAN接收流程 ...
- STM32—USART串口发送+接收
STM32-USART串口发送+接收 本文来自于<STM32--江科大>的笔记整理. 文章目录 STM32-USART串口发送+接收 10.3 串口发送 串口调试助手 10.3.1 数据模 ...
- 串口发送接收浮点型数据
转自:https://blog.csdn.net/liangwei88624/article/details/6885803 转自:https://blog.csdn.net/newstoy/arti ...
- c# 串口发送接收数据
/********************** 串口数据接收事件 *****************************/private void SerialPort_DataReceived( ...
- 51单片机模拟串口发送接收数据(不使用SBUF)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 51单片机.模拟串口.串口发送.串口接收.逻辑分析仪 前言 一.配置定时器 二.串口发送 三.串口接收 四.主函数 五.波形图 5.1 ...
- GPIO口模拟串口发送接收(基于H861)
以前常听说码农需要有严密的逻辑思维,以前不明白.没有思维框架,真的很难写代码,不能瞎蒙,等我的只是效率低下 思路 首先我们要模拟串口通信,就要了解通信的必须条件,包括数据位及其他标志位,以及他的时序, ...
- STM32串口发送接收数据
目录 1.串口通信 2.串口的结构体 3.如何配置串口的发送 4.通过串口向电脑发送ok字符 5.封装发送字符串函数 6.重定向printf串口发送 7.串口输入控制LED灯开关 遇到的问题 1.串口 ...
- 串口 发送 接收 高位_电工进阶PLC大神,必备PLC串口通讯的基本知识!
戳上方蓝字"技成电工课堂"快速关注!!! 电力作业人员在使用PLC的时候会接触到很多的通讯协议以及通讯接口,最基本的PLC串口通讯和基本的通讯接口你都了解吗?1,什么是串口通讯? ...
- C#利用SerialPort类对串口发送接收数据
1.连接串口方法 SerialPort ser = new SerialPort();//也可以在工具箱中直接拖SerialPort控件 public void OpenCom() {try{//波特 ...
- CreateFile系类异步、并行(同一个串口发送接收)
在Windows系统下,串口数据收发CreateFile系类方法对于我来说是最好用的方法,采用异步机制保证了串口读或写入不会使代码停在串口函数内(停在串口函数内原因可能是串口线的原因,或者串口没打开( ...
最新文章
- 因修改/etc/sudoers权限导致sudo和su不能使用的解决方法
- Centos升级php mysql
- Python工程目录组织
- BJUI实现每日数据汇总默认显示某天的数据
- IDA Pro 搜索中文字符串
- 人工智能第二课:认知服务和机器人框架探秘
- php用date语句获取时间,关于php date()函数获取时间的设置和使用方法
- bootstrap-switch 不起作用 class处显示代码_注解KafkaListener不起作用,到底发生了啥?...
- Zoox又融5亿美元!这家腾讯投资的无人车公司现在估值32亿美元
- Euler 的面(Face,F)、顶(Vertex,V)、棱(Edge,E)公式
- python入门经典100题-Python基础训练100题(带答案)[DOC][47KB]
- 三菱5uplc伺服电机指令_【工控无忧原创】三菱FX3U PLC如何控制松下伺服
- mw310r无线路由器怎么设置虚拟服务器,水星mw310r无线路由器接光猫怎么设置?
- Lonlife-ACM 1000 - Spoon Devil's 3-D Matrix(最小生成树)——“玲珑杯”acm比赛-试运行赛
- SocialFi 何以成就 Web3 去中心化社交未来
- qlv是什么格式?要怎么把qlv格式转换成mp4视频
- 计算机打印设置方法,针式打印机设置教程详解,小编教你针式打印机设置共享/纸张大小方法...
- USACO 1.4 Mother's Milk 母亲的牛奶(经典的dfs倒水问题)
- c语言对随机数进行快速排序,C语言自带快速排序对比插入排序
- 高效剪辑,给多个视频同时添加上下图片的操作方法
热门文章
- 用清除cookies的方式实现防止重复投票,值得收藏学习!
- 【每日一题】递增序列中绝对值最小的数
- python 常数赋值给tensor、常数和tensor比较大小、常数和tensor比较大小后作为tensor索引
- 图片相似度判断-差异值哈希算法JAVA版
- linux窗口死,Linux系统入门学习:Linux 上 Wireshark 界面僵死解决
- 日志分析ELK安装日志分析系统
- 【JavaSE】学了这么久Java,你真的会用代码块吗?
- HDU 3954 level up 线段树
- HDU 3954 Level up 2011 Alibaba Programming Contest 线段树
- 设计师的色彩搭配指南