串口中断服务程序

今天下文主要在学习串口通信这一块,自己尝试写了串口通信的实验,将步骤记录如下:1,串口时钟使能;2,串口复位(非必要);3,GPIO端口模式设置;4,串口参数初始化;5,开启中断并初始化NVIC(中断优先级分组);6,使能串口;7,编写中断处理函数;8,串口数据收发;9,串口传输状态获取。
然后就是看见视频里面用了管脚复用但没有在程序里面说明(CSDN搜STM32发103:什么时候用到IO复位(AFIO))
而后碰到了复杂的中断服务函数,一个小的协议如下:

void USART1_IRQHandler(void) //串口1中断服务程序
{
u8 Res;
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
OSIntEnter();
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
Res =USART_ReceiveData(USART1); //读取接收到的数据

if((USART_RX_STA&0x8000)0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
else USART_RX_STA|=0x8000; //接收完成了
}
else //还没收到0X0D
{
if(Res
0x0d)USART_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收
}
}
}
}
同时结合PPT中的图片,在这里插入图片描述可以知道把电脑发过来的数据保存在USART_RX_BUF里面,然后在接收状态寄存器(USART_RX_STA)中计数接收到的有效数据个数,当收到回车(0x0D)后,计数器不在增加,等着0x0A到来,如果 0X0A 没有来到,则认为接收失败,重新开始下一次接收。如果顺利接收到 0X0A,则标记 USART_RX_STA 的第 15 位,这样完成一次接收,并等待该位被其他程序清除,从而开始下一次的接收,而如果迟迟没有收到 0X0D,那么在接收数据超过 USART_REC_LEN 的时候,则会丢弃前面的数据,重新接收。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
//出入均设有缓冲区,大小可任意设置。 //可供使用的函数名: //char getbyte(void);从接收缓冲区取一个byte,如不想等待则在调用前检测inbufsign是否为1。 //getline(char idata *line, unsigned char n); 获取一行数据回车结束,必须定义最大输入字符数 //putbyte(char c);放入一个字节到发送缓冲区 //putbytes(unsigned char *outplace,j);放一串数据到发送缓冲区,自定义长度 //putstring(unsigned char code *puts);发送一个定义在程序存储区的字符串到串口 //puthex(unsigned char c);发送一个字节的hex码,分成两个字节发。 //putchar(uchar c,uchar j);输出一个无符号字符数的十进制表示,必须标示小数点的位置,自动删除前面无用的零 //putint(uint ui,uchar j);输出一个无符号整型数的十进制表示,必须标示小数点的位置,自动删除前面无用的零 //delay(unsigned char d); 延时n x 100ns //putinbuf(uchar c);人工输入一个字符到输入缓冲区 //CR;发送一个回车换行 //************************************************************************* #include <w77e58.h> #define uchar unsigned char #define uint unsigned int #define OLEN 32 /* size of serial transmission buffer */ idata unsigned char outbuf[OLEN]; /* storage for transmission buffer */ unsigned char idata *outlast=outbuf; //最后由中断传输出去的字节位置 unsigned char idata *putlast=outbuf; //最后放入发送缓冲区的字节位置 #define ILEN 12 /* size of serial receiving buffer */ idata unsigned char inbuf[ILEN]; unsigned char idata *inlast=inbuf; //最后由中断进入接收缓冲区的字节位置 unsigned char idata *getlast=inbuf; //最后取走的字节位置 bit outbufsign0; //最后一个数据覵BUF发完标志 发完=0 bit outbufsign; //输出缓冲区非空标志 有=1 bit inbufsign; //接收缓冲区非空标志 有=1 bit inbufful; //输入缓冲区满标志 满=1 #define CR putstring("\r\n") //CR=回车换行 //***************************** //延时n x 100ns void delay(unsigned char d) //在源程序开头定义是否用w77e58或22。1184M晶振 {unsigned char j; do{ d--; //110592 & 89c52 #ifndef cpuw77e58 #ifndef xtal221184 j=21; //k=38 cpu80320 100us k="21" cpu 8052 #else j=42; #endif #else #ifndef xtal221184 j=38; #else j=76;
博客园是一个知名的中文博客平台,提供了丰富的技术资讯和程序开发资源。下面是一个实现UART串口中断程序的示例,共计300字。 UART(Universal Asynchronous Receiver Transmitter)串口是一种常见的串行通信接口,用于在计算机和外部设备之间进行数据传输。串口中断程序是一种异步通信方式,通过触发中断信号来实现数据的传输和接收。 首先,在嵌入式开发中,我们需要先配置串口参数,包括波特率、数据位数、停止位数和奇偶校验等。然后,我们需要在芯片的中断向量表中设置一个中断服务函数来处理串口中断。 中断服务函数的主要功能是读取串口数据和发送数据,一般通过读取和写入相应的寄存器来完成。当检测到新的数据到达时,串口硬件会触发中断信号,并执行中断服务函数来处理数据。 在中断服务函数中,我们首先需要判断是否是接收到数据的中断,然后读取数据并进行相应的处理。例如,可以将接收到的数据存储到缓冲区中,或者根据接收到的命令执行相应的操作。 对于发送数据的中断,我们需要先判断是否需要发送数据,然后写入要发送的数据到发送寄存器中。发送完成后,可以通过中断标志位来判断发送是否成功,并进行相应的处理。 在实际开发中,我们需要注意一些细节问题,例如使用缓冲区来存储接收和发送的数据,以及设置优先级和开关中断等。此外,还需要根据具体的硬件平台和驱动库来编写相应的代码。 总结起来,博客园上可以找到关于UART串口中断程序的详细教程和示例代码,通过学习和实践可以掌握如何编写和使用UART串口中断程序。这对于嵌入式系统开发和通信应用非常有用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值