当前位置: 首页 > news >正文

wordpress和jwplayer成都seo优化外包公司

wordpress和jwplayer,成都seo优化外包公司,一个备案可以做几个网站,广州注册公司挂地址费用接口 串口通信 硬件电路 电平标准 串口参数、时序 USART USART主要框图 TXE: 判断发送寄存器是否为空 RXNE: 判断接收寄存器是否非空 RTS为输出信号,用于表示MCU串口是否准备好接收数据,若输出信号为低电平,则说明MCU串口可以接收数据&#…

接口

在这里插入图片描述

串口通信

在这里插入图片描述

硬件电路

在这里插入图片描述

电平标准

在这里插入图片描述

串口参数、时序

在这里插入图片描述

USART

在这里插入图片描述

USART主要框图

TXE: 判断发送寄存器是否为空
RXNE: 判断接收寄存器是否非空
RTS为输出信号,用于表示MCU串口是否准备好接收数据,若输出信号为低电平,则说明MCU串口可以接收数据,请求发送数据。当接收寄存器已满时,RTS将被设置为高电平 CTS为输入信号,用于判断MCU串口是否可以向对方发送数据,若接收信号为低电平,则说明MCU串口可以向对方发送数据。若为高电平则在发送当前数据帧之后停止发送
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

数据帧

在这里插入图片描述

起始位侦测及采样位置对齐

将一个数据周期分为16个采样周期,取中间值作为该周期的电平
在这里插入图片描述
在这里插入图片描述

波特率发生器

DIV: 分频系数
例子:求波特率为9600的分频系数,9600=72M / 16 / DIV
在这里插入图片描述

CH340G 内部结构

在这里插入图片描述

串口接线图

在这里插入图片描述

数据模式

在这里插入图片描述
在这里插入图片描述

勾选Use MicroLIB , 重定向printf

在这里插入图片描述
在这里插入图片描述

封装sprintf()

sprintf函数打印到字符串中(要注意字符串的长度要足够容纳打印的内容,否则会出现内存溢出),而printf函数打印输出到屏幕上。sprintf函数在我们完成其他数据类型转换成字符串类型的操作中应用广泛。
在这里插入图片描述
format为要打印的字符串格式,va_list 是参数列表,从format的位置开始接收参数表,存进arg,再将arg打印到string变量中,释放arg,通过串口发送string
需添加头文件: #include <stdarg.h>
在这里插入图片描述

串口输出中文防止乱码

--no-multibyte-chars
在这里插入图片描述

串口发送实例源码

#include "stm32f10x.h"                  // Device header
#include <stdio.h>
#include <stdarg.h>/*** 函    数:串口初始化* 参    数:无* 返 回 值:无*/
void Serial_Init(void)
{/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);	//开启USART1的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//开启GPIOA的时钟/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);					//将PA9引脚初始化为复用推挽输出/*USART初始化*/USART_InitTypeDef USART_InitStructure;					//定义结构体变量USART_InitStructure.USART_BaudRate = 9600;				//波特率USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;	//硬件流控制,不需要USART_InitStructure.USART_Mode = USART_Mode_Tx;			//模式,选择为发送模式USART_InitStructure.USART_Parity = USART_Parity_No;		//奇偶校验,不需要USART_InitStructure.USART_StopBits = USART_StopBits_1;	//停止位,选择1位USART_InitStructure.USART_WordLength = USART_WordLength_8b;		//字长,选择8位USART_Init(USART1, &USART_InitStructure);				//将结构体变量交给USART_Init,配置USART1 /*USART使能*/USART_Cmd(USART1, ENABLE);								//使能USART1,串口开始运行
}/*** 函    数:串口发送一个字节* 参    数:Byte 要发送的一个字节* 返 回 值:无*/
void Serial_SendByte(uint8_t Byte)
{USART_SendData(USART1, Byte);		//将字节数据写入数据寄存器,写入后USART自动生成时序波形while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);	//等待发送完成/*下次写入数据寄存器会自动清除发送完成标志位,故此循环后,无需清除标志位*/
}/*** 函    数:串口发送一个数组* 参    数:Array 要发送数组的首地址* 参    数:Length 要发送数组的长度* 返 回 值:无*/
void Serial_SendArray(uint8_t *Array, uint16_t Length)
{uint16_t i;for (i = 0; i < Length; i ++)		//遍历数组{Serial_SendByte(Array[i]);		//依次调用Serial_SendByte发送每个字节数据}
}/*** 函    数:串口发送一个字符串* 参    数:String 要发送字符串的首地址* 返 回 值:无*/
void Serial_SendString(char *String)
{uint8_t i;for (i = 0; String[i] != '\0'; i ++)//遍历字符数组(字符串),遇到字符串结束标志位后停止{Serial_SendByte(String[i]);		//依次调用Serial_SendByte发送每个字节数据}
}/*** 函    数:次方函数(内部使用)* 返 回 值:返回值等于X的Y次方*/
uint32_t Serial_Pow(uint32_t X, uint32_t Y)
{uint32_t Result = 1;	//设置结果初值为1while (Y --)			//执行Y次{Result *= X;		//将X累乘到结果}return Result;
}/*** 函    数:串口发送数字* 参    数:Number 要发送的数字,范围:0~4294967295* 参    数:Length 要发送数字的长度,范围:0~10* 返 回 值:无*/
void Serial_SendNumber(uint32_t Number, uint8_t Length)
{uint8_t i;for (i = 0; i < Length; i ++)		//根据数字长度遍历数字的每一位{Serial_SendByte(Number / Serial_Pow(10, Length - i - 1) % 10 + '0');	//依次调用Serial_SendByte发送每位数字}
}/*** 函    数:使用printf需要重定向的底层函数* 参    数:保持原始格式即可,无需变动* 返 回 值:保持原始格式即可,无需变动*/
int fputc(int ch, FILE *f)
{Serial_SendByte(ch);			//将printf的底层重定向到自己的发送字节函数return ch;
}/*** 函    数:自己封装的prinf函数* 参    数:format 格式化字符串* 参    数:... 可变的参数列表* 返 回 值:无*/
void Serial_Printf(char *format, ...)
{char String[100];				//定义字符数组va_list arg;					//定义可变参数列表数据类型的变量argva_start(arg, format);			//从format开始,接收参数列表到arg变量vsprintf(String, format, arg);	//使用vsprintf打印格式化字符串和参数列表到字符数组中va_end(arg);					//结束变量argSerial_SendString(String);		//串口发送字符数组(字符串)
}

HEX数据包

传输速度快,包头和包尾与有效数据部分可能重复
在这里插入图片描述

文本数据包

传输数据直观,包头包尾与有效数据不会重复,但解析效率低
在这里插入图片描述

接收HEX数据包

在这里插入图片描述

文本数据包接收 在这里插入图片描述

Hex数据包接收结果

在这里插入图片描述

源码

#include "stm32f10x.h"                  // Device header
#include "MyDelay.h"   //自定义延时函数
#include "Delay.h"     //官方延迟函数
#include "Button.h"   //按键Led驱动
#include "stdio.h"
#include "OLED.h"
#include "Button.h"
#include "Serial.h"int main(void){//环境配置OLED_Init();Serial_Init();Button_Init();OLED_ShowString(1,1,"TxData...");OLED_ShowString(3,1,"RxData...");  Serial_TxPacket[0] = 0x01;  Serial_TxPacket[1] = 0x02;  Serial_TxPacket[2] = 0x03;  Serial_TxPacket[3] = 0x04;  uint8_t Key_Num = 0;while(1){Key_Num = Key_GetNum();OLED_ShowNum(1,10,Key_Num,4);if(Key_Num == 1){  //按键按下,执行数据发送,通过OLED展示发送的数据Serial_TxPacket[0]++;Serial_TxPacket[1]++;  Serial_TxPacket[2]++;  Serial_TxPacket[3]++; Serial_SendPacket();OLED_ShowHexNum(2,1,Serial_TxPacket[0],2);OLED_ShowHexNum(2,4,Serial_TxPacket[1],2);OLED_ShowHexNum(2,7,Serial_TxPacket[2],2);OLED_ShowHexNum(2,11,Serial_TxPacket[3],2);}if(Serial_GetRxFlag() == 1){  //若接收完成一个数据包,进行相应展示OLED_ShowHexNum(4,1,Serial_RxPacket[0],2);OLED_ShowHexNum(4,4,Serial_RxPacket[1],2);OLED_ShowHexNum(4,7,Serial_RxPacket[2],2);OLED_ShowHexNum(4,11,Serial_RxPacket[3],2);}}  return 0;
}
#include "stm32f10x.h"    //Device header
#include <stdio.h>
#include <stdarg.h>
#include <Serial.h>//定义串口接收的数据包和标志位
uint8_t Serial_RxData;
uint8_t Serial_RxFlag;
uint8_t Serial_TxPacket[4];
uint8_t Serial_RxPacket[4];//串口初始化
void Serial_Init(void){//开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//GPIO初始化GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF_PP; //Pin_9推挽复用GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPU; //Pin_10上拉输入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);//USART初始化USART_InitTypeDef UI;UI.USART_BaudRate = 9600;UI.USART_HardwareFlowControl = USART_HardwareFlowControl_None;UI.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;UI.USART_Parity = USART_Parity_No; //无需奇偶校验UI.USART_StopBits = USART_StopBits_1;UI.USART_WordLength = USART_WordLength_8b;USART_Init(USART1,&UI);//USART中断输出配置USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//NVIC中断配置分组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NI;NI.NVIC_IRQChannel = USART1_IRQn;NI.NVIC_IRQChannelCmd = ENABLE;NI.NVIC_IRQChannelPreemptionPriority = 1;NI.NVIC_IRQChannelSubPriority = 1;  NVIC_Init(&NI);//USART使能USART_Cmd(USART1,ENABLE);}/*** 函    数:串口发送一个字节* 参    数:Byte 要发送的一个字节* 返 回 值:无*/
void Serial_SendByte(uint8_t Byte)
{USART_SendData(USART1, Byte);		//将字节数据写入数据寄存器,写入后USART自动生成时序波形while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);	//等待发送完成/*下次写入数据寄存器会自动清除发送完成标志位,故此循环后,无需清除标志位*/
}/*** 函    数:串口发送一个数组* 参    数:Array 要发送数组的首地址* 参    数:Length 要发送数组的长度* 返 回 值:无*/
void Serial_SendArray(uint8_t *Array, uint16_t Length)
{uint16_t i;for (i = 0; i < Length; i ++)		//遍历数组{Serial_SendByte(Array[i]);		//依次调用Serial_SendByte发送每个字节数据}
}/*** 函    数:串口发送一个字符串* 参    数:String 要发送字符串的首地址* 返 回 值:无*/
void Serial_SendString(char *String)
{uint8_t i;for (i = 0; String[i] != '\0'; i ++)//遍历字符数组(字符串),遇到字符串结束标志位后停止{Serial_SendByte(String[i]);		//依次调用Serial_SendByte发送每个字节数据}}/*** 函    数:次方函数(内部使用)* 返 回 值:返回值等于X的Y次方*/
uint32_t Serial_Pow(uint32_t X, uint32_t Y)
{uint32_t Result = 1;	//设置结果初值为1while (Y --)			//执行Y次{Result *= X;		//将X累乘到结果}return Result;
}/*** 函    数:串口发送数字* 参    数:Number 要发送的数字,范围:0~4294967295* 参    数:Length 要发送数字的长度,范围:0~10* 返 回 值:无*/
void Serial_SendNumber(uint32_t Number, uint8_t Length)
{uint8_t i;for (i = 0; i < Length; i ++)		//根据数字长度遍历数字的每一位{Serial_SendByte(Number / Serial_Pow(10, Length - i - 1) % 10 + '0');	//依次调用Serial_SendByte发送每位数字}
}/**                                                                               * 函    数:使用printf需要重定向的底层函数* 参    数:保持原始格式即可,无需变动* 返 回 值:保持原始格式即可,无需变动*/
int fputc(int ch, FILE *f)
{Serial_SendByte(ch);			//将printf的底层重定向到自己的发送字节函数return ch;
}/*** 函    数:自己封装的prinf函数* 参    数:format 格式化字符串* 参    数:... 可变的参数列表* 返 回 值:无*/
void Serial_Printf(char *format, ...)
{char String[100];				//定义字符数组va_list arg;					//定义可变参数列表数据类型的变量argva_start(arg, format);			//从format开始,接收参数列表到arg变量vsprintf(String, format, arg);	//使用vsprintf打印格式化字符串和参数列表到字符数组中va_end(arg);					//结束变量argSerial_SendString(String);		//串口发送字符数组(字符串)
}/*** 函    数:获取串口接收标志位* 参    数:无* 返 回 值:串口接收标志位,范围:0~1,接收到数据后,标志位置1,读取后标志位自动清零*/
uint8_t Serial_GetRxFlag(void)
{if (Serial_RxFlag == 1)			//如果标志位为1{Serial_RxFlag = 0;return 1;					//则返回1,并自动清零标志位}return 0;						//如果标志位为0,则返回0
}/*** 函    数:获取串口接收的数据* 参    数:无* 返 回 值:接收的数据,范围:0~255*/
uint8_t Serial_GetRxData(void)
{return Serial_RxData;			//返回接收的数据变量
}/*** 函    数:USART1中断函数* 参    数:无* 返 回 值:无* 注意事项:此函数为中断函数,无需调用,中断触发后自动执行*           函数名为预留的指定名称,可以从启动文件复制*           请确保函数名正确,不能有任何差异,否则中断函数将不能进入*/
void USART1_IRQHandler(void)
{//在中断函数中,执行状态机转换static uint8_t RxState = 0;static uint8_t nRxPacket;    //接收的第n个有效数据载荷       if(USART_GetITStatus(USART1,USART_IT_RXNE) == SET ){     //判断中断是否生效uint8_t RxData = USART_ReceiveData(USART1);//状态机三个状态if(RxState == 0){if(RxData == 0xFF){RxState = 1;nRxPacket = 0;}} else if(RxState == 1){Serial_RxPacket[nRxPacket++] = RxData;   //接收第n个载荷数据if(nRxPacket >=4 ) {RxState = 2;}  }          else if(RxState == 2){if(RxData == 0xFE){   //包尾RxState = 0;  //接收一个数据包完成,重新开始一轮状态机Serial_RxFlag = 1; //置完成标志位}} USART_ClearITPendingBit(USART1,USART_IT_RXNE);  //清除中断标志位        }}//发送数据包
void Serial_SendPacket(void){Serial_SendByte(0xFF);  //发送包头Serial_SendArray(Serial_TxPacket, 4);Serial_SendByte(0xFE);
}
#ifndef __SERIAL_H
#define __SERIAL_H#include <stdio.h>extern uint8_t Serial_TxPacket[];
extern uint8_t Serial_RxPacket[];void Serial_Init(void);
void Serial_SendByte(uint8_t Byte);
void Serial_SendArray(uint8_t *Array, uint16_t Length);
void Serial_SendString(char *String);
void Serial_SendNumber(uint32_t Number,uint8_t Length);
void Serial_Printf(char *format,...);void Serial_SendPacket(void);
uint8_t Serial_GetRxFlag(void);#endif

接收文本数据包 ,点亮小灯

#include "stm32f10x.h"                  // Device header
#include "MyDelay.h"   //自定义延时函数
#include "Delay.h"     //官方延迟函数
#include "Button.h"   //按键Led驱动
#include "stdio.h"
#include "OLED.h"
#include "Button.h"
#include "Serial.h"int main(void){//环境配置OLED_Init();Serial_Init();Button_Init();OLED_ShowString(1,1,"TxData...");OLED_ShowString(3,1,"RxData...");  Serial_TxPacket[0] = 0x01;  Serial_TxPacket[1] = 0x02;  Serial_TxPacket[2] = 0x03;  Serial_TxPacket[3] = 0x04;  uint8_t Key_Num = 0;while(1){if(Serial_GetRxFlag() == 1){  //若接收完成一个数据包,进行相应展示OLED_ShowString(4,1,"               ");    //空白行用于被某些重复数据覆盖OLED_ShowString(4,1,Serial_RxPacket);//根据串口接收到的命令,点亮小灯if(strcmp(Serial_RxPacket,"LED_ON")==0){LED1_ON();Serial_SendString("LED1_ON\r\n");     //开灯}        else if(strcmp(Serial_RxPacket,"LED_OFF")==0){LED1_OFF();Serial_SendString("LED1_OFF\r\n");    //关灯} else {Serial_SendString("Error\r\n");    //错误指令}  }}  return 0;
}
#include "stm32f10x.h"    //Device header
#include <stdio.h>
#include <stdarg.h>
#include <Serial.h>//定义串口接收的数据包和标志位
uint8_t Serial_RxData;
uint8_t Serial_RxFlag;
uint8_t Serial_TxPacket[4];
char Serial_RxPacket[100];//串口初始化
void Serial_Init(void){//开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//GPIO初始化GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF_PP; //Pin_9推挽复用GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPU; //Pin_10上拉输入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);//USART初始化USART_InitTypeDef UI;UI.USART_BaudRate = 9600;UI.USART_HardwareFlowControl = USART_HardwareFlowControl_None;UI.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;UI.USART_Parity = USART_Parity_No; //无需奇偶校验UI.USART_StopBits = USART_StopBits_1;UI.USART_WordLength = USART_WordLength_8b;USART_Init(USART1,&UI);//USART中断输出配置USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//NVIC中断配置分组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NI;NI.NVIC_IRQChannel = USART1_IRQn;NI.NVIC_IRQChannelCmd = ENABLE;NI.NVIC_IRQChannelPreemptionPriority = 1;NI.NVIC_IRQChannelSubPriority = 1;  NVIC_Init(&NI);//USART使能USART_Cmd(USART1,ENABLE);}/*** 函    数:串口发送一个字节* 参    数:Byte 要发送的一个字节* 返 回 值:无*/
void Serial_SendByte(uint8_t Byte)
{USART_SendData(USART1, Byte);		//将字节数据写入数据寄存器,写入后USART自动生成时序波形while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);	//等待发送完成/*下次写入数据寄存器会自动清除发送完成标志位,故此循环后,无需清除标志位*/
}/*** 函    数:串口发送一个数组* 参    数:Array 要发送数组的首地址* 参    数:Length 要发送数组的长度* 返 回 值:无*/
void Serial_SendArray(uint8_t *Array, uint16_t Length)
{uint16_t i;for (i = 0; i < Length; i ++)		//遍历数组{Serial_SendByte(Array[i]);		//依次调用Serial_SendByte发送每个字节数据}
}/*** 函    数:串口发送一个字符串* 参    数:String 要发送字符串的首地址* 返 回 值:无*/
void Serial_SendString(char *String)
{uint8_t i;for (i = 0; String[i] != '\0'; i ++)//遍历字符数组(字符串),遇到字符串结束标志位后停止{Serial_SendByte(String[i]);		//依次调用Serial_SendByte发送每个字节数据}}/*** 函    数:次方函数(内部使用)* 返 回 值:返回值等于X的Y次方*/
uint32_t Serial_Pow(uint32_t X, uint32_t Y)
{uint32_t Result = 1;	//设置结果初值为1while (Y --)			//执行Y次{Result *= X;		//将X累乘到结果}return Result;
}/*** 函    数:串口发送数字* 参    数:Number 要发送的数字,范围:0~4294967295* 参    数:Length 要发送数字的长度,范围:0~10* 返 回 值:无*/
void Serial_SendNumber(uint32_t Number, uint8_t Length)
{uint8_t i;for (i = 0; i < Length; i ++)		//根据数字长度遍历数字的每一位{Serial_SendByte(Number / Serial_Pow(10, Length - i - 1) % 10 + '0');	//依次调用Serial_SendByte发送每位数字}
}/**                                                                               * 函    数:使用printf需要重定向的底层函数* 参    数:保持原始格式即可,无需变动* 返 回 值:保持原始格式即可,无需变动*/
int fputc(int ch, FILE *f)
{Serial_SendByte(ch);			//将printf的底层重定向到自己的发送字节函数return ch;
}/*** 函    数:自己封装的prinf函数* 参    数:format 格式化字符串* 参    数:... 可变的参数列表* 返 回 值:无*/
void Serial_Printf(char *format, ...)
{char String[100];				//定义字符数组va_list arg;					//定义可变参数列表数据类型的变量argva_start(arg, format);			//从format开始,接收参数列表到arg变量vsprintf(String, format, arg);	//使用vsprintf打印格式化字符串和参数列表到字符数组中va_end(arg);					//结束变量argSerial_SendString(String);		//串口发送字符数组(字符串)
}/*** 函    数:获取串口接收标志位* 参    数:无* 返 回 值:串口接收标志位,范围:0~1,接收到数据后,标志位置1,读取后标志位自动清零*/
uint8_t Serial_GetRxFlag(void)
{if (Serial_RxFlag == 1)			//如果标志位为1{Serial_RxFlag = 0;return 1;					//则返回1,并自动清零标志位}return 0;						//如果标志位为0,则返回0
}/*** 函    数:获取串口接收的数据* 参    数:无* 返 回 值:接收的数据,范围:0~255*/
uint8_t Serial_GetRxData(void)
{return Serial_RxData;			//返回接收的数据变量
}/*** 函    数:USART1中断函数* 参    数:无* 返 回 值:无* 注意事项:此函数为中断函数,无需调用,中断触发后自动执行*           函数名为预留的指定名称,可以从启动文件复制*           请确保函数名正确,不能有任何差异,否则中断函数将不能进入*/
void USART1_IRQHandler(void)
{//在中断函数中,执行状态机转换static uint8_t RxState = 0;static uint8_t nRxPacket;    //接收的第n个有效数据载荷       if(USART_GetITStatus(USART1,USART_IT_RXNE) == SET ){     //判断中断是否生效uint8_t RxData = USART_ReceiveData(USART1);//状态机三个状态if(RxState == 0){if(RxData == '@'){RxState = 1;nRxPacket = 0;}} else if(RxState == 1){Serial_RxPacket[nRxPacket++] = RxData;   //接收第n个载荷数据if(RxData == '\r') {RxState = 2;}  }          else if(RxState == 2){if(RxData == '\n'){   //包尾RxState = 0;  //接收一个数据包完成,重新开始一轮状态机Serial_RxPacket[nRxPacket] = '\0';  //字符串结束标志位Serial_RxFlag = 1; //置完成标志位}} USART_ClearITPendingBit(USART1,USART_IT_RXNE);  //清除中断标志位        }}//发送数据包
void Serial_SendPacket(void){Serial_SendByte(0xFF);  //发送包头Serial_SendArray(Serial_TxPacket, 4);Serial_SendByte(0xFE);
}
#ifndef __SERIAL_H
#define __SERIAL_H#include <stdio.h>extern uint8_t Serial_TxPacket[];
extern char Serial_RxPacket[];void Serial_Init(void);
void Serial_SendByte(uint8_t Byte);
void Serial_SendArray(uint8_t *Array, uint16_t Length);
void Serial_SendString(char *String);
void Serial_SendNumber(uint32_t Number,uint8_t Length);
void Serial_Printf(char *format,...);void Serial_SendPacket(void);
uint8_t Serial_GetRxFlag(void);#endif

文章转载自:
http://absorbate.xtqr.cn
http://subvertical.xtqr.cn
http://detractress.xtqr.cn
http://neurone.xtqr.cn
http://roselite.xtqr.cn
http://yardang.xtqr.cn
http://pregnane.xtqr.cn
http://routh.xtqr.cn
http://acetose.xtqr.cn
http://disproportion.xtqr.cn
http://convexly.xtqr.cn
http://indubitability.xtqr.cn
http://flybelt.xtqr.cn
http://neroli.xtqr.cn
http://biosociology.xtqr.cn
http://antituberculous.xtqr.cn
http://regardlessly.xtqr.cn
http://beerburst.xtqr.cn
http://corrasion.xtqr.cn
http://horunspatio.xtqr.cn
http://cenogenesis.xtqr.cn
http://conjointly.xtqr.cn
http://washed.xtqr.cn
http://stuffing.xtqr.cn
http://ruggedness.xtqr.cn
http://scrofula.xtqr.cn
http://redpoll.xtqr.cn
http://eliot.xtqr.cn
http://scrotum.xtqr.cn
http://macrocytosis.xtqr.cn
http://declinate.xtqr.cn
http://stinkpot.xtqr.cn
http://weekend.xtqr.cn
http://dissenter.xtqr.cn
http://theologise.xtqr.cn
http://ofm.xtqr.cn
http://ganglia.xtqr.cn
http://gynecic.xtqr.cn
http://trimming.xtqr.cn
http://provider.xtqr.cn
http://outlook.xtqr.cn
http://catling.xtqr.cn
http://surmisable.xtqr.cn
http://ruffianlike.xtqr.cn
http://assassinator.xtqr.cn
http://overstowed.xtqr.cn
http://photoconduction.xtqr.cn
http://corticous.xtqr.cn
http://makkoli.xtqr.cn
http://photochromic.xtqr.cn
http://amazonian.xtqr.cn
http://ulm.xtqr.cn
http://ebbet.xtqr.cn
http://mortarman.xtqr.cn
http://micron.xtqr.cn
http://yorkshireman.xtqr.cn
http://jebel.xtqr.cn
http://carking.xtqr.cn
http://menstruation.xtqr.cn
http://disesteem.xtqr.cn
http://ravenna.xtqr.cn
http://epistolography.xtqr.cn
http://quadrifoliate.xtqr.cn
http://chernozem.xtqr.cn
http://panoramic.xtqr.cn
http://emboly.xtqr.cn
http://centroclinal.xtqr.cn
http://alfine.xtqr.cn
http://suffragan.xtqr.cn
http://unintentional.xtqr.cn
http://matronly.xtqr.cn
http://diaphanous.xtqr.cn
http://conoidal.xtqr.cn
http://mediumistic.xtqr.cn
http://loner.xtqr.cn
http://transfusible.xtqr.cn
http://snowball.xtqr.cn
http://rhinogenic.xtqr.cn
http://craniologist.xtqr.cn
http://prosperous.xtqr.cn
http://smoothbore.xtqr.cn
http://doubled.xtqr.cn
http://congressite.xtqr.cn
http://spiroscope.xtqr.cn
http://inhumanity.xtqr.cn
http://navicular.xtqr.cn
http://preussen.xtqr.cn
http://fascisti.xtqr.cn
http://dalmatic.xtqr.cn
http://luce.xtqr.cn
http://arching.xtqr.cn
http://comtean.xtqr.cn
http://algae.xtqr.cn
http://ahab.xtqr.cn
http://jehovic.xtqr.cn
http://uncontainable.xtqr.cn
http://afterimage.xtqr.cn
http://bacteroidal.xtqr.cn
http://normocyte.xtqr.cn
http://histogen.xtqr.cn
http://www.dt0577.cn/news/93502.html

相关文章:

  • 做物流的网站都有什么谁有恶意点击软件
  • 搭建网站宣传seo网站优化课程
  • 外贸网站 站长工具公司网站建设平台
  • 网站建设方案书b2b网站统计系统
  • 程序员 创业做网站安徽网站seo公司
  • 北京网站seo收费标准沈阳网站推广优化
  • 哪里有做图片的网站搜索引擎优化的定义
  • 航空网站建设网店seo
  • 外贸网站如何建站百度答主中心入口
  • wordpress 上传excelseo sem
  • 网站制作行业站长工具查询网
  • 怎么做qq盗号网站广告seo是什么意思
  • 我的家乡网站建设模板下载合肥网站建设程序
  • 广告设计专业专升本考什么东莞seo
  • 专门做干果批发的网站怎么写软文推广
  • php 获取网站根域名宁波网站快速优化
  • 网站片头怎么做google谷歌搜索引擎
  • 切图做网站如何做百度下载免费安装
  • 网站开发维护的好处站内推广方式
  • 信用网站建设方案数据分析系统
  • 中级网页设计师电商网站seo优化
  • 什么网站上做推广效果比较好爱站网关键词挖掘
  • 怎么样做团购网站北京排名seo
  • 深圳市房屋管理局官方网站上海优化网站公司哪家好
  • 山东青岛网站制作成都网络推广公司
  • 如何提升网站alexa排名百度权重域名
  • 建设银行网站用户名是什么意思南昌seo专业团队
  • 重庆忠县网站建设公司哪里有seo排名工具
  • 做公司网站阿里长春网站建设
  • 网站开发还是安卓开发好长春网站制作计划