stm32f103的串口通信之串口轮询实验

经过两天的艰苦战斗,经历了心平气和-->烦躁-->放任自由-->心平气和,我今天晚上的最后一分钟,终于将它搞定了!

首先阐述问题:在把usart.c文件里有关中断的部分注释掉以后,使用轮询模式进行串口通讯,但是在这过程中,遇到的问题是只能显示第一个字符;

首先说明原因:在使用轮询模式时,不要使用延时函数,也不要使用中断,如使用printf()这样的函数;

     如下是完整代码;
     main.c
#include "stm32f10x.h"
#include "delay.h"
#include "lcd.h"
#include <stdio.h>
#include "usart.h"
#include "circular_buffer.h"

//function declaration;
void system_isruning(void);
void str_array_init(u8 a[], int len);

int main()
{

	int j = 0;
  delay_init();
	lcd_init();
  USART1_Configuration();

	for(j = 0; j < 100; j++)
	{
   		m_buf[i] = ‘\0‘;   //m_buf[]来自circular_buffer.h;
	}

	while(1)
	{
		//system_isruning();
		is_recevied();
		//delay_ms(1000);
		//LCD1602_WriteString(str,2);
  }
}

void system_isruning(void)
{
	RCC->APB2ENR |= 1 << 5;
	GPIOD ->CRH &= 0xFFFFFFF0;
	GPIOD ->CRH |= 0x00000003;

  GPIOD ->ODR &= ~(1<<8);
	delay_ms(100);
	GPIOD ->ODR |= (1<<8);
	delay_ms(100);

}

轮询头文件:

#ifndef CIRCULAR_BUFFER_H
#define CIRCULAR_BUFFER_H

#include "sys.h"
#define  BUF_LEN  100

void is_recevied(void);

static u8 m_buf[BUF_LEN];
static int i = 0;

#endif

轮询实现.c

#include "circular_buffer.h"
#include "sys.h"
#include "stm32f10x_usart.h"
#include <stdio.h>
#include "delay.h"

void is_recevied(void)
{
	 u8 x =  0;

       while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)  != RESET)   
	{
  		 x = USART_ReceiveData(USART1);
       USART_SendData(USART1, x); 
		  // save into the receive buffer;
		  i = i % BUF_LEN;  //
		  m_buf[i] = x;
		  i++;
      //printf("received one data! x == %c \n",x);
      //使用轮询模式不能使用printf,因为此函数是一个异步中断函数;
} 

	第一次写技术博客,与君共勉,愿能助君一臂之力。
	在串口方面的学问很深,以后需要虚心安心钻研!

	每日弟子规:

	弟子规,圣人训,首孝悌,次谨信
	泛爱众,而亲仁,有余力,则学文

	自己还不够博爱,不够自信,唯有多行善事,才能自信满满,才可神采飞扬,我很期待那一天;
	自己的努力的第一天!
	加油!
时间: 2024-10-08 22:25:16

stm32f103的串口通信之串口轮询实验的相关文章

C#串口通信—向串口发送数据,同步接收返回数据

最近写C#串口通信程序,系统是B/S架构.SerialPort类有一个DataReceived事件,用来接收串口返回的数据,但这种方式在C/S架构下很好用,但B/S就不好处理了.所以写了一个同步模式接收返回数据的方法,不使用DataReceived事件.经过测试,可以正常使用(不支持多线程调用). 一.Machine类 1.Machine类有一个静态变量,定义如下: private static SerialPort serialPort = null; 2.向串口发送数据,同步接收返回数据的方

深入理解51单片机串口通信

串口通信的基本认识 通信分为并行通信和串行通信,并行通信时的数据各个位同时传送,可以实现字节为单位通信,但通信线多占用资源,成本高.以前用到的的P1=0x55,一次给P1口的8个管脚分别赋值,同时进行信号输出,类似于8个车道可以过去8辆车,这样的形式是并行的,一般称P0,P1,P2,P3为51单片机的4组并行总线. 串行通信,就是一个车道,一个只能通过一辆车,如果一个0x55这样一个字节的数据要传输过去的话,假如低位在前,高位在后的话,那发送方式是:0-1-0-1-0-1-0-1,一位一位的进行

C#实现简单的串口通信

前言 本着学习研究的态度,用c#语言实现简单的串口通信工具. 一.串口通信原理 串口通信 串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节.尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据.它很简单并且能够实现远距离通信.由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据.其他线用于握手,但不是必须的.串口通信最重要的参数是波特率.数据位.停止位和奇偶校验.对于两个进行通信的

S5PV210 串口设置与实验(轮询方式)

S5PV210 UART 相关说明 通用异步收发器简称 UART, 即 UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER,它用来传输串行数据.发送数据时, CPU 将并行数据写入 UART,UART 按照一定的格式在一根电线上串行发出:接收数据时, UART 检测另一根电线的信号,将串行收集在缓冲区中, CPU 即可读取 UART 获得这些数据. 在 S5PV210 中, UART 提供了 4 对独立的异步串口 I/O 端口,有 4 个独立的通道,每

嵌入式Linux裸机开发(七)——UART串口通信

嵌入式Linux裸机开发(七)--UART串口通信 一.UART串口通信简介 通用异步收发器简称UART,即UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER, 它用来传输串行数据.发送数据时, CPU 将并行数据写入UART,UAR按照一定的格式在一根电线上串 行发出:接收数据时, UART检测另一根电线的信号,将串行收集在缓冲区中, CPU 即可读取 UART 获得这些数据. 在 S5PV210中, UART提供了 4 对独立的异步串口I/O端口,

VC++串口通信编程详解

总结来看串口通信原理,(也可以说大多数通信原理也是如此). 通信首先要有个通信,可以简单的把通信看成一个小桶,发送方住水桶里装水,接收方从水桶中取水.如果你要和对方通信首先需要将桶盖打开,再将水装入到桶中,这时接收方才能够从桶中取到水.这里就存在着一定的问题, 1,如果桶盖还没有打开,发送方已经发送了.这时接收方再从桶中取水,肯定取的水不对,会不一部分缺失了.解决方式就是让桶盖打开再往其中加水. 2,但是桶盖何时打开,发送方何时发送,这个不好把握.解决方法:接收方接到数据时,要返回一个应答标志,

[VISA]实现PC与外设串口通信功能

简述 串口通信是使用非常广泛的通信协议之一,一般都是指的RS232,一般PC都会支持串口的,对于速度要求不是特别高的,用串口来通信相对比较简单,而且成本也很低. 关于RS232 RS232常见的9针串口接口,其电平其实是-15V和15V的,-15V貌似表示数据1,而15V表示数据0.而一般单片机的UART接口是使用的TTL电平,0表示低电平,1表示高电平.因此单片机的UART和PC的RS232之间需要有一个转换,有许多成熟的IC可以使用.RS232的通信协议也相对简单. 关于VISA LabVI

STM32F10x_硬件I2C主从通信(轮询发送,中断接收)

Ⅰ.写在前面 关注我分享文章的朋友应该知道我在前面讲述过(软件.硬件)I2C主机控制从机EEPROM的例子.在I2C通信主机控制程序是比较常见的一种,可以说在实际项目中,很多应用都会使用到I2C通信.但在实际项目中作为I2C从机的应用相对要少的多,本文主要讲述关于[STM32F10x_硬件I2C主从通信]中STM32作为从机的例子. 在学习本问内容之前,如果对I2C协议还不太了解的朋友请先去了解一下I2C协议,或看我之前关于I2C通信的文章(我微信公众号和博客都有). 关于STM32硬件I2C作

Java实现RS485串口通信,发送和接收数据进行解析

最近项目有一个空气检测仪,需要得到空气检测仪的实时数据,保存到数据库当中.根据了解得到,硬件是通过rs485进行串口通讯的,需要发送16进制命令给仪器,然后通过轮询来得到数据. 需要先要下载RXTX的jar包,win64位下载地址:http://pan.baidu.com/s/1o6zLmTc):将解压后的rxtxParallel.dll和rxtxSerial.dll两个文件放在%JAVA_HOME%/jre/bin目录下,这样该包才能被正常的加载和调用. 代码如下: package com.g