STM32采集问答式串口传感器数据写入SD卡(spi模式)

这篇具有很好参考价值的文章主要介绍了STM32采集问答式串口传感器数据写入SD卡(spi模式)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.实验工具

  1. STM32f103RCT6板子
  2. 问答式温湿度传感器(TTL信号)
  3. 外接SD卡模块(淘宝都差不多)

2.接线说明

1.SD卡模块,采用SPI1接线
(CLK)SCK <—>PA5
(DATA0)MISO <—>PA6
(CMD)MOSI <—>PA7
(DATA3)CS <—>PA4
前面小括号里的是SDIO模式的接线,可以忽略。
2.传感器模块
问答式TTL信号的传感器都可以,
连接到板子的串口2,PA2,PA3

3.部分代码说明

代码是在野火的SD卡测试代码上更新修改的,所以接口初始化啥的直接参考野火或者其它的就可以,主要写一下问询方式串口中断采集变量数据在主函数写入SD卡的实现。

1.文件的覆盖问题

刚开始移植野火代码是,每次写入的数据总是会把上一次的内容覆盖,所以这里需要注意两个问题:

1.文件系统的文件打开方式

res_sd = f_open(&fnew, "0:test.csv",FA_OPEN_ALWAYS | FA_WRITE ); 

f_open函数有三个参数,文件对象,文件名,文件打开方式,文件打开方式如下图:
STM32采集问答式串口传感器数据写入SD卡(spi模式)
这里英文解释很容易明白,我们选择FA_OPEN_ALWAYS模式,如果文件存在直接打开,不存在就创建。

2.移动文件初始写入指针位置

//文件对象的读写指针移动到文件结束处
	  f_lseek (&fnew,f_size (&fnew));
		printf("%lu",f_size (&fnew));

f_lseek函数移动指针,此函数用于文件指针的移动,共有两个参数,第一个参数为文件对象,第二个参数为移动的字节数。 f_size函数获取文件字节大小。

完成这两个才可以保证下一次的写入数据是接着之前写入。

2.变量的转换及写入问题

1.因为SD卡只能写入字符串类型,所以采集的变量数据必须先转换为字符串,然后再进行写入操作即可,要将变量数据转换为字符串,就用到了sprintf函数。

1.sprintf函数

Sprintf函数具体形式: int sprintf( char *buffer, const char *format, [ argument,…] );
解释:整形输出 sprintf(输出数组地址,<格式字符串>,参量表……)
注:只要在printf中可以使用的格式化字符串,在sprintf都可以使用。
如:

	sprintf(buff,"%.1f%RH,%.1f℃\n",humidity,temperature);

buff为已经定义的char类型的一个字符串接收数组,将后面数即温湿度浮点型存入buff数组,注意换行符前不要有空格,否则可能无效。

2.CSV文件创建

//创建CSV文件
	res_sd = f_open(&fnew, "0:test.csv",FA_OPEN_ALWAYS | FA_WRITE ); 
res_sd= f_write(&fnew,buff,sizeof(buff),&fnum);

在打开文件那一步创建的,与txt文件一样,只是后缀不同,写入数据时,逗号即代表下一列写入,逗号对应sprintf转换里第二个参数里几个逗号。

sprintf(buff,"%.1f%RH,%.1f℃\n",humidity,temperature);

3.数据采集流程(主函数、中断函数处理代码)

读取问答式温湿度传感器数据,当主程序向串口2的传感器发送问询指令后,传感器产生应答,发送当前的温湿度数据,进入中断,当返回的数据记录解析完成后,将主函数中调用中断采集的温湿度变量转成字符串类型,执行写入SD卡操作,主函数没发送一次采集指令,就在中断了写入记录一次,所以指令发送延时长一点比较好。

main函数:

FATFS fs;													/* FatFs文件系统对象 */
FIL fnew;													/* 文件对象 */
FRESULT res_sd;                /* 文件操作结果 */
UINT fnum;            					  /* 文件成功读写数量 */

extern  SD_CardInfo SDCardInfo;
extern  float temperature;//使用中断里的温度变量
extern  float humidity;//使用中断里的湿度变量
int main(void)
{
	u8 buf[8]={0x01,0x03,00,0x02,00,0x02,0x65,0xCB};
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
	
	/* 初始化系统定时器 */
	SysTick_Init();

	/* 初始化调试串口,一般为串口1 */
	USART_Config();	
	
	uart2_init(9600);   //串口2初始化为9600 ,按照用到的传感器进行匹配设置
	/*初始化DTT11的引脚*/

  
	while(1)
	{	
		char buff[20];//接收变量转换的字符串
		 uart2_send_buff(buf,8);//发送问询命令
		 sprintf(buff,"%.1f%RH,%.1f℃\n",humidity,temperature);
		//在外部SPI Flash挂载文件系统,文件系统挂载时会对SPI设备初始化
	   res_sd = f_mount(&fs,"0:",1);
				/*----------------------- 格式化测试 ---------------------------*/  
	/* 如果没有文件系统就格式化创建创建文件系统 */
	if(res_sd == FR_NO_FILESYSTEM)
	{
		printf("》SD卡还没有文件系统,即将进行格式化...\r\n");
    /* 格式化 */
		res_sd=f_mkfs("0:",0,0);							
		
		if(res_sd == FR_OK)
		{
			printf("》SD卡已成功格式化文件系统。\r\n");
      /* 格式化后,先取消挂载 */
			res_sd = f_mount(NULL,"0:",1);			
      /* 重新挂载	*/			
			res_sd = f_mount(&fs,"0:",1);
		}
		else
		{
			printf("《《格式化失败。》》\r\n");
			while(1);
		}
	}
  else if(res_sd!=FR_OK)
  {
    printf("!!SD卡挂载文件系统失败。(%d)\r\n",res_sd);
    printf("!!可能原因:SD卡初始化不成功。\r\n");
		while(1);
  }
  else
  {
    printf("》文件系统挂载成功,可以进行读写测试\r\n");
  }
	
	/*----------------------- 文件系统测试:写测试 -----------------------------*/
	/* 打开文件,如果文件不存在则创建它 */
	printf("\r\n****** 即将进行文件写入测试... ******\r\n");	
	//注意f_open第三个参数,打开文件模式设置要注意
	//创建CSV文件
	res_sd = f_open(&fnew, "0:test.csv",FA_OPEN_ALWAYS | FA_WRITE );   
	if ( res_sd == FR_OK )
	{
		printf("》打开/创建test.csv文件成功,向文件写入数据。\r\n");
		//文件对象的读写指针移动到文件结束处
	  f_lseek (&fnew,f_size (&fnew));
		printf("%lu",f_size (&fnew));
		 
    /* 将指定存储区内容写入到文件内 */
		res_sd= f_write(&fnew,buff,sizeof(buff),&fnum);
    if(res_sd==FR_OK)
    {
      printf("》文件写入成功,写入字节数据:%d\n",fnum);
      
			printf("%lu",f_size (&fnew));
    }
    else
    {
      printf("!!文件写入失败:(%d)\n",res_sd);
    }    
		/* 不再读写,关闭文件 */
    f_close(&fnew);
		f_mount(NULL,"0:",1);
	}
	else
	{	
		printf("!!打开/创建文件失败。\r\n");
	}
		 Delay_ms(5000);
	}
	
}

串口2中断函数处理部分:

//功能:串口2中断服务程序,接收到数据会进入这个函数
//参数:无
//返回:无
 
 u8 USART_RX_BUF[9];//定义接收数组,看传感器返回的有多少字节数据
 u8 USART_RX_STA=0;//数组标志位,如第0位、第一位
 static char  start=0;  //开始接收数据标志位
float temperature=0;//定义温湿度变量
float humidity=0;
FATFS fs;													/* FatFs文件系统对象 */
FIL fnew;													/* 文件对象 */
FRESULT res_sd;    /* 文件操作结果 */
UINT fnum;   /* 文件成功读写数量 */
extern  SD_CardInfo SDCardInfo;

void USART2_IRQHandler(void)
{
	
  u8 Res=0;//定义一个数来接收每次读取的数据
   if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //接收中断,每一个字节都会中断一次
    {
			
        Res =USART_ReceiveData(USART2);	//读取接收到的字节数据
        //接收数据时不要随便加入占用时间的命令,如串口打印,会影响下面数据字节的接收
     // printf("%x ",Res);
			if(Res == 0x01) //如果接收的第一位数据是0XFF(这个是查看传感器的手册得知的,这里相当于进行校验)
            {
						//printf("第一个采集");
                 start=1;   //开始接收数据标志位,一旦第一个接收正确,就就继续向下接收
            }

            if(start== 1)
            {
							
                USART_RX_BUF[USART_RX_STA] = Res ; //把接收到的数据存到数组里面		
							 // printf("%x ",Res);
                USART_RX_STA++;//数组标志位加1						 
                if(USART_RX_STA >= 9 && (USART_RX_BUF[1]==0x03))//这里还校验了接收的第二个数据
                    {
										//	printf("采集结束");
											temperature=(USART_RX_BUF[3]*256+USART_RX_BUF[4])*0.1  ;
											humidity=(USART_RX_BUF[5]*256+USART_RX_BUF[6])*0.1  ;
											printf("温度:%.1f   湿度:%.1f\n",temperature,humidity);//通过串口1打印接收数组里的数据
                    	
                        USART_RX_STA=0;//重新开始接收   
                        USART_RX_BUF[0] = 0;
					              start=0;
										}			

                    }
            } 
        
		}	
	
//功能:串口2发送一个字符
//参数:temp发送的字符
//返回:无
void uart2_send_char(u8 temp)
{
    USART_SendData(USART2,(u8)temp);      
    while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);
}

//功能:串口1发送字符串
//参数:buf发送的字符串,len字符串的长度
//返回:无
void uart2_send_buff(u8* buf,u32 len)      
{
    u32 i;

    for(i=0;i<len;i++)
        uart2_send_char(buf[i]);
} 
	

4.采集结果

STM32采集问答式串口传感器数据写入SD卡(spi模式)文章来源地址https://www.toymoban.com/news/detail-454372.html

到了这里,关于STM32采集问答式串口传感器数据写入SD卡(spi模式)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于STM32 RS485传感器数据采集(参考正点原子部分代码)

    目前工业上,传感器一般都选RS485,modbus通讯协议,这种通讯方式,有很强的鲁棒性,本篇文章基于原子哥的精英板进行开发。 1、初始化与电脑通信的串口(PA9 PA10) 2、采用串口中断将数据保存到数组buff中 3、用定时器来配置一帧字节是否结束(空闲时间指定时间) 5、从机

    2024年02月11日
    浏览(48)
  • STM32实现薄膜压力传感器数据采集(标准库和HAL库实现)

    单片机型号及压力传感器: STM32F103C8T6 最小系统板 压力传感器选用的是薄膜压力传感器 生活中经常遇到需要测量压力值,因此,考虑到这样的需求从网上买了一个薄膜压力传感器,实物图如下: 柔性薄膜压力传感器的 产品特点 : 超薄,厚度小于0.3mm 响应速度快 寿命长,通

    2024年02月02日
    浏览(48)
  • TCP透传数据至Onenet平台(简单用STM32上传采集的传感器数据)

    主页点击控制台  点击全部产品服务,再点击多协议接入  选择TCP透传,点击添加产品      点击确定,然后选择立即添加设备  点击添加设备  随便起个设备名称,这里的鉴权信息等下要用来作为登录设备用,点击添加  添加数据流模板,就是绑定上传的数据      这里我

    2024年02月05日
    浏览(46)
  • STM32CubeMX 读取DS18B20温度传感器数据串口打印显示

    本文要做的所有工作标题基本都包括了,读取温度传感器的温度数值,再通过串口打印到串口助手; 好多博主大神的教程我按步骤做了之后总是出现程序不报错并且检测不到传感器的情况,后来找到原因并且修改后调试正常。 我用的是普中科技的实验板,主控芯片为STM3210

    2024年02月05日
    浏览(84)
  • STM32--ADC数值采样/附ADC采集热敏传感器使用

    目录 一丶ADC介绍 二丶ADC工作原理及管脚分布 三丶代码部分详解 (一)库函数介绍 (二)代码部分整合         ADC模块中文名为模拟/数字转换器,是12位逐次逼近型的模拟数字转换器,一般用于数值的采样   可以将引脚上连续变化的模拟电压转换为内存中存储的数字变

    2024年02月03日
    浏览(49)
  • 基于STM32F103——XGZP6847D压力传感器+串口打印

    XGZP6847D 型压力传感器尺寸小、易安装,广泛用于医疗电子、汽车电子、消费电子、运动健身器材、 物联网等领域 Reg0x30(测量命令寄存器) Measurement_control2:0( 工作模式 ) 010b ,组合采集模式(一次温度采集后立即进行一次传感器压力信号采集)。 011b ,休眠工作模式(定期的执

    2023年04月24日
    浏览(83)
  • STM32(HAL库)驱动SHT30温湿度传感器通过串口进行打印

    目录 1、简介 2、CubeMX初始化配置 2.1 基础配置 2.1.1 SYS配置  2.1.2 RCC配置 2.2 软件IIC引脚配置 2.3 串口外设配置  2.4 项目生成  3、KEIL端程序整合 3.1 串口重映射 3.2 SHT30驱动添加 3.3 主函数代 3.4 效果展示 本文通过STM32F103C8T6单片机通过HAL库方式对SHT30传感器进行数据的读取,并

    2024年02月16日
    浏览(44)
  • STM32采集4-20mA传感器,以及ADC+DMA出现的问题及解决

    STM32只能采集0-3.3V的数据,如果需要采集0-5V和4-20mA的数据需要在电路中进行相关设计: 0-5V采集电路 4-20mA采集电路 本文主要讲述4-20mA采集电路采集 电路输入4-20mA,作用在120欧姆电路(后面面是电压跟随电路,并联),对应输入电压0.48~2.4V STM32103ZET6为例,内部ADC采集12bit,0

    2024年04月12日
    浏览(36)
  • # 项目一:‍‍‍STM32+串口DMA+RS485+MODBUS+传感器实现SO2的测试

    通过STM32控制传感器实现气体浓度的测量:RS485+MODBUS+串口DMA+定时器。 其中,USART2负责控制数据的发送和接受,USART3负责将询问帧、应答帧以及处理后数据打印出来,TIM1负责每隔1秒发送一次询问帧。 持续更新手中的项目(导师给的活)经验。。。 打工人加油🐱‍🚀🐱‍🚀

    2024年02月11日
    浏览(39)
  • ARM开发,stm32mp157a-A7核IIC实验(采集温湿度传感器值)

    ---iic.h封装时序协议头文件--- ---iic.c封装时序函数实现--- ---si7006.h读取温湿度头文件--- ---si7006.c读取温湿度函数--- ---main.c主函数测试---

    2024年02月11日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包