串口接收函数
串口接收函数篇一:串口发送与接收
串口的发送功能:数据通过串口由芯片向上位机发送
串口发送的时候是不能够用中断的,要使用查询模式,所以要从初始化串口开始一步一步的进行
/****************************************************************
/*函数功能: 串口发送字符串
/*函数说明:*DATA为发送缓存指针
/* len为发送字串的长度
/*只能是在初始化函数void initUARTtest(void)之后调用才有效。
/*返回值: 无 *
****************************************************************/
void UartTX_Send_String(char *Data,int len)
{
int j;
for(j=0;j<len;j++)
{
U0DBUF = *Data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
}
void UartTX_Send_word(char word)
{
U0DBUF = word;
while(UTX0IF == 0);
UTX0IF = 0;
}
串口初始化
void initUARTtest(void)
{
CLKCON &= ~0x40; //
while(!(SLEEP & 0x40));//
CLKCON &= ~0x47; //
SLEEP |= 0x04;//
PERCFG = 0x00;
P0SEL = 0x3c;
U0CSR |= 0x80;
// //baud_e = 10; //U0GCR |= 10; U0BAUD |= 216;
UTX0IF = 1;
////
U0CSR |= 0X40;
IEN0 |= 0x84;
}
// //
串口接收:芯片通过串口从上位机接收数据
void URX0Init(void)
{
U0CSR |= UART_ENABLE_RECEIVE;URX0IF = 0;
IEN0 |= 0x04;
EA = 1;
}
#pragma vector=URX0_VECTOR __interrupt void URX0_IRQ(void) {
INT_GLOBAL_ENABLE(INT_OFF);
if(URX0IF == 1)
{
URX0IF = 0;
ch = U0DBUF;
}
INT_GLOBAL_ENABLE(INT_ON); }
串口接收函数篇二:简单的串口发送与接收程序
(碧海蓝天)stm32应用-简单的串口接收与发送程序 (2014-03-23 22:42:53)
转载▼
分类: 单片机 与上位机的串口通信是一个很常用的程序。碧海蓝天在刚刚接触stm32芯片时写的第一个简单程序就是串口通信,现在把程序代码甩出来与大家分享。完整的程序哦~一般人我不告诉他
库版本 :ST3.0.0
文件:mian.c
//功能:串口初始化、打开定时器中断,然后一直接收数据状态就好了。发送在中断中实现
#include "stm32f10x.h"
#include "usart.h" u8 USART_rx_data;
int main(void) {
RCC_Configuration();//系统时钟配置
GPIO_Configuration();//端口初始化NVIC_Configuration();//中断源配置
USART_Configuration(); //串口1初始化
Time_Init();//定时器初始化
#ifdef DEBUG debug();
#endif
TIM_Cmd(TIM3,ENABLE);
while(1)
{
}
}
文件:usart.c
#include "stm32f10x.h"
#include "stdio.h"
#include "usart.h"
unsigned char auchCRCHi [256] ={
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x
41,
0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40};
unsigned char auchCRCLo [256] ={
0x00,0xC0,0xC1,0x01,0xC3,0x03,0x02,0xC2,0xC6,0x06,0x07,0xC7,0x05,0xC5,0xC4,0x04,
0xCC,0x0C,0x0D,0xCD,0x0F,0xCF,0xCE,0x0E,0x0A,0xCA,0xCB,0x0B,0xC9,0x09,0x08,0xC8,
0xD8,0x18,0x19,0xD9,0x1B,0xDB,0xDA,0x1A,0x1E,0xDE,0xDF,0x1F,0xDD,0x1D,0x1C,0xDC,
0x14,0xD4,0xD5,0x15,0xD7,0x17,0x16,0xD6,0xD2,0x12,0x13,0xD3,0x11,0xD1,0xD0,0x10,
0xF0,0x30,0x31,0xF1,0x33,0xF3,0xF2,0x32,0x36,0xF6,0xF7,0x37,0xF5,0x35,0x34,0xF4,
0x3C,0xFC,0xFD,0x3D,0xFF,0x3F,0x3E,0xFE,0xFA,0x3A,0x3B,0xFB,0x39,0xF9,0xF8,0x38,
0x28,0xE8,0xE9,0x29,0xEB,0x2B,0x2A,0xEA,0xEE,0x2E,0x2F,0xEF,0x2D,0xED,0xEC,0x2C,
0xE4,0x24,0x25,0xE5,0x27,0xE7,0xE6,0x26,0x22,0xE2,0xE3,0x23,0xE1,0x21,0x20,0xE0,
0xA0,0x60,0x61,0xA1,0x63,0xA3,0xA2,0x62,0x66,0xA6,0xA7,0x67,0xA5,0x65,0x64,0xA4,
0x6C,0xAC,0xAD,0x6D,0xAF,0x6F,0x6E,0xAE,0xAA,0x6A,0x6B,0xAB,0x69,0xA9,0xA8,0x68,
0x78,0xB8,0xB9,0x79,0xBB,0x7B,0x7A,0xBA,0xBE,0x7E,0x7F,0xBF,0x7D,0xBD,0xBC,0x7C,
0xB4,0x74,0x75,0xB5,0x77,0xB7,0xB6,0x76,0x72,0xB2,0xB3,0x73,0xB1,0x71,0x70,0xB0,
0x50,0x90,0x91,0x51,0x93,0x53,0x52,0x92,0x96,0x56,0x57,0x97,0x55,0x95,0x94,0x54,
0x9C,0x5C,0x5D,0x9D,0x5F,0x9F,0x9E,0x5E,0x5A,0x9A,0x9B,0x5B,0x99,0x59,0x58,0x98,
0x88,0x48,0x49,0x89,0x4B,0x8B,0x8A,0x4A,0x4E,0x8E,0x8F,0x4F,0x8D,0x4D,0x4C,0x8C,
0x44,0x84,0x85,0x45,0x87,0x47,0x46,0x86,0x82,0x42,0x43,0x83,0x41,0x81,0x80,0x40};
unsigned short CRC16(unsigned char* puchMsg, unsigned short usDataLen) {
unsigned char uchCRCHi = 0xFF ;
unsigned char uchCRCLo = 0xFF ;
unsigned char uIndex ;
while (usDataLen--)
{
uIndex = uchCRCHi^*puchMsg++;
uchCRCHi = uchCRCLo^auchCRCHi[uIndex];
uchCRCLo = auchCRCLo[uIndex];
}return (uchCRCHi << 8 | uchCRCLo) ;
}
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus;//枚举变量,定义高速时钟的启动状态RCC_DeInit(); //RCC系统重置,用于Debug目的
RCC_HSEConfig(RCC_HSE_ON); //使能高速时钟源HSE
HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待HSE稳定
if(HSEStartUpStatus == SUCCESS)
{
FLASH_SetLatency(FLASH_Latency_2);
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
RCC_HCLKConfig(RCC_SYSCLK_Div1);// HCLK = SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1); // PCLK2 = HCLK
RCC_PCLK1Config(RCC_HCLK_Div2);///PCLK1 = HCLK/2
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource() != 0x08){}
}
RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 |RCC_APB2Periph_GPIOA
|RCC_APB2Periph_AFIO |RCC_APB2Periph_GPIOB , ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
}
//------------------------------------------------------------------ //函数名:void GPIO_Configuration()
//输入参数:null
//返回参数:null
//说明:GPIO初始化函数
//------------------------------------------------------------------
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //GPIO初始化结构体声明
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //USART1 TX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);//A端口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //USART1 RX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//复用浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure); //A端口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
//------------------------------------------------------------------
//函数名:void NVIC_Configuration()
//输入参数:null
//返回参数:null
//说明:NVIC初始化函数
//------------------------------------------------------------------
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure; //NVIC初始化结构体声明
#ifdef VECT_TAB_RAM
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); //如果程序在RAM中调试那么定义中断向量表在RAM中否则在Flash中
#else
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//设置串口1中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级 0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级为0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //设置定时器3全局中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级 1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//子优先级为0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
NVIC_Init(&NVIC_InitStructure);
}
//------------------------------------------------------------------
//函数名:void USART_Configuration()
//输入参数:null
//返回参数:null
//说明:串口初始化函数
//------------------------------------------------------------------
void USART_Configuration(void){
USART_InitTypeDef USART_InitStructure; //串口初始化结构体声明
USART_ClockInitTypeDef USART_ClockInitStruct;
串口接收函数篇三:串口通讯函数详解
串口通讯API详解
一:函数列表
1:CreateFile打开串口函数
2:SetupComm缓冲区分配函数
3:GetCommState获取当前串口配置函数
4:SetCommState设置当前串口配置函数
5:GetCommProperties获取串口属性函数
6:BuildCommDCB//DCB填充函数
7:BuildCommDCBAndTimeouts//DCB和Timeouts填充函数
8:GetCommTimeouts//获取超时函数
9:SetCommTimeouts设置超时函数
10:ReadFile/ReadFileEx串口读取数据函数
11:WriteFile/WriteFileEx串口写数据函数
12:ClearCommError清除错误标志函数
13:PurgeComm终止读写/清空缓冲区函数
14:FlushFileBuffer清空缓冲区函数
15:GetOverlappedResult获取异步IO操作结果获取函数
16:WaitforSingleObject等到事件函数
17:SetCommMask设置串口监视通讯事件
18:GetCommMask获取串口当前设置的通讯事件
19:WaitCommEvent通讯事件监测函数
20:CreateEvent创建事件函数
21:EscapeCommFunction握手信号设置函数
22:SetCommBreak通讯设备挂起函数
23:ClearCommBreak通讯设备恢复函数
二:结构接收
1:DCB结构
DCB结构有几个经常用到的成员变量,分别为
BaudRate--通讯波特率大小,一般为CBR_9600,CBR_19200,CBR_38400等。
FParity--是否运行奇偶校验
FOutxCtsFlow—指定CTS信号是否检测输出流控制,该值为TRUE且CTS为OFF时,发生被暂停,直到CTS回复为ON状态。
FOutX—设置在发送时是否应用XON/XOFF流控制
FInX—设置在接收是是否应用XON/XOFF流控制
fRtsControl—是否允许RTS控制
ByteSize—设置数据位
Parity—设置奇偶校验方式
StopBits—设置停止位】
2:COMMTIMEOUTS结构
超时结构有一下几个重要的成员变量
ReadIntervalTimeout:以毫秒为单位设置通讯线路上两个字符到达之间的最大时间间隔。
ReadTotalTimeoutMultiplier:以毫秒为单位设置一个用来计算读操作总超时时间的时间系数。
ReadTotalTimeoutConstant:以毫秒为单位设置一个用来计算读操作总超时时间的时间常量
ReadTotalTimeoutMultiplier:以毫秒为单位设置一个用来计算写操作总超时时间的时间系数
ReadTotalTimeoutConstant:以毫秒为单位设置一个用来计算读操作总超时时间的时间常量
即:读操作总超时时间=读时间系数 * 要求读取的字节数 + 读时间常量
写操作总超时时间=写时间系数 * 要求读取的字节数 + 写时间常量
3:OVERLAPPED结构
Typedef struct _OVERLAPPED
{
DWORD Internal;//系统内部使用
DWORD InternalHigh;//系统内部使用
DWORD OffSet;//指定开始传输数据的位置
DWORD offSetHigh;//定义OffSet的高字节
HANDLE hEvent;//数据传输完成时候的句柄
}
其中最重要的是hEvent函数,hEvent是一个事件对象句柄,线程应该用CreateEvent为hEvent创建一个手工重置事件。作为同步对象使用。如果异步函数操作完成(包括超时完成),则会置hEvent为有信号状态,如果操作未完成操作就返回,则为无信号状态。每次异步函数操作的时候,根据异步操作的结果会重置hEvent状态。可以用WaitforSingleObject或者GetOverlappedResult来等待hEvent信号。
4:COMMSTAT结构
在串口通讯过程中,如果奇偶校验,终端等错误,I/O操作就会停止,如果要进一步进行I/O操作,则必须调研ClearCommError清除错误标志。其中关键字段为cbInQue和cbOutQue。分别为串行设备接收到的字节数和设备发生缓冲区还没有发送出去的用户数据字节数,但这些字节并不已经全部由ReadFile读出。
三:详细介绍
1:CreateFile创建串口函数
打开串口函数,第一个参数为文件名或者串口名,比如”COM1,baud=9600,parity=0,data=8,stop=1”或者 “c:\\temp.txt”等。第二个参数为访问模式,一般为GENERIC_READ|GENERIC_WRITE。第三个参数为0表示不共享。第四个为安全属性,一般设置为NULL,第五个参数为创建方式,一般为OPEN_EXISTING,如果是文件,可以为OPEN_EXISTING。第六个参数很重要,如果是异步操作,设置为FILE_FLAG_OVERLAPPED,否则为
FILE_ARRIBUTE_NORMAL。第七个函数一般为0.
2:SetupComm缓冲区分配函数
第一个参数为通信设备句柄,CreateFile返回的有效句柄,第二个参数为输入缓冲区大小,第三个参数为输出缓冲区函数。
3:GetCommState获取当前系统配置函数
第一个参数为通讯设备句柄,第二个参数为指向DCB结构的指针。
4:SetCommState设置系统配置函数
参数同GetCommState
5:GetCommProperties获取串口属性函数
第一个参数为通讯设备句柄,第二个参数为指向COMMPROP结构的指针。
6:BuildCommDCB设备控制块填充函数
第一个参数为指向设备控制字符串的字符串,第二个为指向DCB结构。第一个参数格式示例如下:
"baud=%d parity=%c data=%d stop=%d"。而DCB结构在前面有所叙述。第一个参数有三种格式,分别为无后缀,带字符x后缀,带字符p后缀。
7:BuildCommDCBAndTimeouts设备控制块DCB和超时Timeouts填充函数
第一个参数为指向设备控制字符串指针,第二个为指向DCB结构的指针,第三个为指向COMMTIMEOUTS结构的指针。
8:GetCommTimeouts超时结构获取函数。
第一个参数是由CreateFile得到的句柄,第二个参数指向超时结构的指针。
9:SetCommTimeouts超时设置函数
参数同GetCommTimeouts。
10:ReadFile/ReadFileEx读串口函数
ReadFile函数:第一个参数为通讯设备句柄,第二个参数为指向接收缓冲区的指针,第三个参数为要从串口接收的数据字节数,第四个参数指向DWORD变量的指针,该地址存储实际从串口设备读出的字节数。第五个参数为指向OVERLAPPED结构。
ReadFileEx函数:前三个参数同ReadFile,第四个参数指向OVERLAPPED结构,第五个参数为指向 OVERLAPPED_COMPLETION_ROUTINE的指针。指向一个IO完成例程。
11:WriteFile/WriteFileEx函数
用于写串口操作,第一个参数为通讯设备句柄,第二个参数为指向发送缓冲区的指针,第三个参数为要向串口写入 的缓冲区字节数,第四个参数返回实际写入的字节数。第五个参数为指向OVERLAPPED结构的指针。WriteFileEx 函数的参数同ReadFileEx函数
12:ClearCommError清除错误标志函数
第一个参数为通讯设备句柄,第一个参数指向DWORD结构的指针
,第三个参数最重要,指向COMSTAT结构的指针, 该结构返回设备状态信息。13:PurgeComm终止读写/清空缓冲区函数
该函数终止正在进行的读写操作,并且清空输入和输出缓冲区的内容。第一个参数为通讯设备句柄,第二个参数为
DWORD类型的操作代码。可以为PRGE_TXABORT, PRGE_RXABORT, PRGE_TXCLEAR和PRGE_RXCLEAR操作。 14:FlushFileBuffer清空缓冲区函数
该函数先将发送缓冲区所有内容发生完毕之后,才进行缓冲区的清空操作。只有一个通讯设备句柄参数。 15:GetOverlappedResult异步IO操作结果获取函数
第一个参数为通讯设备句柄,第二个参数指向OVERLAPPED结构的指针,第三个参数为指向DWORD的指针,该地址存储读写操作实际传输的字节数。第四个参数类型为BOLL,指明函数是否等待被挂起的异步IO完成。 16:WaitForSingleObject异步IO操作事件获取函数
第一个参数为IO操作的事件句柄,第二个参数为等待超时时间上限。对于WaitForMultipleObject第一个参数为事件句柄数目,第二个参数为指向事件数组的指针,第三个参数指明是否等待全部事件才返回,第四个参数为等待超时时间限。
17:SetCommMask通讯事件设置函数
第一个参数为通讯设备句柄,第二个参数为检测通讯设备事件的掩码,DWORD类型,可以为EV_RXFLAG,EV_RXCHAR等。
18:GetCommMask函数
获取当前通讯设备正在发生的通讯事件,第一个参数为通讯设备句柄,第二个参数为指向DWORD结构的指针,用于获取当前通讯设备设置的检测事件类型。
19:WaitCommEvent通讯事件监测函数
第一个参数为通讯设备句柄,第二个函数为指向DWORD的指针,用于返回当前正在发生的通讯事件掩码,第三个为指向OVERLAPPED结构的指针,必须要通讯设备句柄创建时为OVERLAPPED方式才有效。那么该函数以异步方式执行,如果通讯设备句柄不是以OVERLAPPED结构创建,则以同步方式进行。
成功返回非零值,否则返回0,可以用GetLastError获取进一步消息。
注意:一旦设置了OVERLAPPED结构的hEvent成员,那么当异步IO操作完成后才会触发该消息,那么可以用WaitForSingelObject或者GetOverlappedResults函数等待操作的完成。
20:CreateEvent函数
第一个参数为默认事件安全属性,一般为NULL,第二个参数指定是否为手工重置事件,第三个参数指明初始状态事件是否有效,第四个参数为事件的名称。
21:EscapeCommFunction函数
该函数可以将硬件握手信号置为ON或者OFF.也可以设置软件模拟XON和XOFF字符的发送和接收。同时该函数还可以清除终止条件,这与SetCommBreak和CleraCommBreak函数功能相同。
22:SetCommBreak通讯设备挂起函数
该函数将使指定的通讯设备暂停字符传输,处于挂起状态。并使传输线除以BREAK状态。
23:CleraCommBreak通讯设备恢复函数
功能与SetCommBreak正好相反。
编程一般流程
1:打开串口
2:建立串口通讯事件
3:初始化串口,设置串口参数 4:建立读数据的线程 5:写数据
6:结束时关闭端口