串口通信——串口助手发送正数/负数(以ascii码的形式发送或者以16进制形式发送),最后展示出发送的数

这篇具有很好参考价值的文章主要介绍了串口通信——串口助手发送正数/负数(以ascii码的形式发送或者以16进制形式发送),最后展示出发送的数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 实验目的

1.串口助手发送一个数(发送的形式是ascii码),最后除以100展示这个数,如发送一个-29987,最后要展示出-299.87。
2.串口助手发送一个数(发送的形式是16进制),最后除以100展示这个数,如发送一个-3,最后要展示出-0.03。
其中串口是USART1,其端口是GPIOA,引脚是PIN9、PIN10,一个用来收数据,一个用来发收据。

2. 实验流程

初始化串口;
编写数据转换函数函数;
编写接收数据中断函数和空闲中断函数。

2.1 初始化串口

//配置中断函数,这个函数下面有调用
 void EXTI_NVIC_Config(void){
	//NVIC初始化结构体
	NVIC_InitTypeDef  NVIC_InitStruct;
	//设置中断优先级的分组
	//就是设置主抢占优先级和子抢占优先级各是几,这里是分组为1,代表主优先级可以是0和1(就是1个位来设置主优先级),子优先级是0-7,是2的3次方
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
	//配置USART为中断源
	NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;
	//配置抢占优先级
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
	//配置子优先级
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
	//使能中断
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStruct);
}
//串口初始化函数
void USART_Config(void){
	//1.初始化GPIO(PA9(接串口1的TX引脚),这里是PA10(接串口1的RX引脚))
	//初始化结构体 GPIO_InitStruct
	//里面是GPIO的速度,上下拉,输出类型等
	 GPIO_InitTypeDef   GPIO_InitStruct;
	//USART结构体
	 USART_InitTypeDef   USART_InitStruct;
	//打开GPIOA时钟(一般开时钟要放到前面的位置,然后再是设置上拉,输出这些)
	 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);  //使能时钟必须放到前面,不然后面的操作不会使灯点亮
	//打开USART1时钟
	 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟
	//复位串口1
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource9,  GPIO_AF_USART1); //PA9 复用为 USART1
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1); //PA10 复用为 USART1
	//驱动是哪个引脚  PA9/PA10
	GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_9|GPIO_Pin_10;
	//模式是复用功能
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
	//输出的速度
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	//推挽复用输出
	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
	//上拉
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
	//变量获取它的指针,取地址就行(&)
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	//2.初始化串口
	//使能串口时钟 (放在最上面了)
	//配置波特率
	USART_InitStruct.USART_BaudRate = 115200;  //设置波特率115200
	//配置针数据字长
	USART_InitStruct.USART_WordLength = USART_WordLength_8b; //字长为8位数据格式
	//配置停止位
	USART_InitStruct.USART_StopBits = USART_StopBits_1;     //设置为一个停止位
	//配置校验位
	USART_InitStruct.USART_Parity = USART_Parity_No;     //无奇偶校验位
	//配置硬件流控制
	USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //不使用硬件流控制
	//配置工作模式
	USART_InitStruct.USART_Mode =  USART_Mode_Rx|USART_Mode_Tx;  //收发模式
	//完成串口的初始化配置
	USART_Init(USART1,&USART_InitStruct);
	//串口中断优先级配置(初始化)
	EXTI_NVIC_Config();
	//使能串口接收中断(中断配置函数)  这是使能哪种中断,比如在接收到数据的时候(RXNE 读数据寄存器非空),我们要产生中断
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);  //生成串口中断   接收到数据就产生了中断
	USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);	// 开启空闲中断
	//使能串口(串口使能函数)
	USART_Cmd(USART1,ENABLE);
}

2.2 编写数据转换函数函数

在写转换函数之前,先要看这个ASCII码中的0123456789对应的是什么。在空闲中断里面打印接收到的数据,下面是部分代码,详细代码参见2.3。

   for(i = 0;i < 10; i++){
		 printf("value_10 = %x\n",rx_buff[i]);
   }
	memset(rx_buff,0,sizeof(rx_buff));   //清空数组
	rx_cnt = 0;                          //数组指针置0

得到结果如下图所示:
串口通信——串口助手发送正数/负数(以ascii码的形式发送或者以16进制形式发送),最后展示出发送的数
所以我们通过判断接收过来的字节,判断这个值是哪个数字。

先找规律,这里是假设发送的数字是-29987,函数中传入的值一个是数组,一个是数组的总索引值,这里取到的字节首先要减去0X30,得到这个数字是几,然后再乘以10的几次方,2在万位上,需要乘以10000,它的索引值对应的是1,传来的索引总数是6,所以乘的10次方应该是:10的次方数 = 6(总索引值) - 1(2所在的索引值) - 1;9在千位上,需要乘以1000,它的索引值对应的是2,所以乘的10次方应该是:10的次方数 = 6(总索引值) - 2(9所在的索引值) - 1;第二个9在百位上,需要乘以100,它的索引值对应的是3,所以乘的10次方应该是:10的次方数 = 总索引值 - 3(9所在的索引值) - 1;以此类推。

如果是正数的话,假如是29987,2在万位上,需要乘以10000,它的索引值对应的是1,传来的索引总数是5,所以乘的10次方应该是:10的次方数 = 5(总索引值) - 1(2所在的索引值) - 1;9在千位上,需要乘以1000,它的索引值对应的是2,传来的索引总数是5,所以乘的10次方应该是:10的次方数 = 5(总索引值) - 1(2所在的索引值) - 1;以此类推。

数据转换函数函数(发送ASCII的形式的)如下:

void Value_Show(uint8_t*  array, uint8_t rx_cnt)   //传入数组地址,数组的索引
{
	uint8_t i;
	uint8_t j;
    uint16_t value_fu = 0;
	uint16_t temp = 0;	
    uint8_t rx_buff1[10] = {0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39};
	if(array[0] ==  '-'){   //判断接收的第一个字节是不是负数,这里写if(array[0] ==  0X2d)也是可以的,负号的16进制就是0X2d
			for(i = 1;i < rx_cnt; i++){
			  for(j= 0;j < sizeof(rx_buff1)/sizeof(rx_buff1[0]);j++){   //循环的次数是10
				 if(array[i] == rx_buff1[j]){                           //判断接收到的数据是那一个
				       value_fu += (rx_buff1[j] - 0X30) * pow(10,rx_cnt - i -1);
					   break;
					}
				}
			}
			printf("value_10 = %.2f\n",(float)-value_fu/100);		
			}else{  //接收的是正数
				 for(i = 0;i < rx_cnt; i++){
					for(j= 0;j < sizeof(rx_buff1)/sizeof(rx_buff1[0]);j++){
					   if(array[i] == rx_buff1[j]){
						  value_fu += (rx_buff1[j] - 0X30) * pow(10,rx_cnt - i -1);
						  break;
					}
				}
			}
		   printf("value_10 = %.2f\n",(float)value_fu/100);
		}
}

数据转换函数函数(发送的是16进制的)如下:
计算机中存放的整型数据都是按补码的形式存放的,负数的补码是其本身绝对值的原码取反再加1。
~本身绝对值 + 1 = 负数;现在求本身绝对值就是:本身绝对值 = ~(负数 - 1);对应下面代码的temp = ~(value - 1);

void Value_Show_16(uint8_t*  array, uint8_t rx_cnt){
		value = (rx_buff[0]<<8)|(rx_buff[1]); //拼接数据
	   //最高位为1代表的是负数  &同为1的时候才为1
		if(value &(1<<15) != 0){ 
			temp = ~(value - 1);
			printf("value_10 = %.2f\n",(float)-temp/100);
		}
}

2.3 编写接收数据中断函数和空闲中断函数

//接收数据中断函数
void USART1_IRQHandler(void){
	uint8_t i;
	unsigned int data;
	if(USART_GetITStatus(USART1,USART_IT_RXNE)){  //每当接收到1个字节,会产生USART_IT_RXNE中断
		rx_buff[rx_cnt] = USART_ReceiveData(USART1);  //把这个数据放到数组中去
		rx_cnt++;
	}
	//空闲中断函数
	if(USART_GetITStatus(USART1,USART_IT_IDLE) != RESET){  //当接收到一帧数据,就会产生USART_IT_IDLE中断
		data = USART1->SR;		 // 清空闲中断
		data = USART1->DR;     //空闲中断是在检测到在数据收受后,总线上在一个字节的时间内没有再接收到数据时发生
		usart_idle_flag = 1;	//产生空闲中断,没有用到
	  //Value_Show(rx_buff,rx_cnt);     //ascii转换函数
      Value_Show_16(rx_buff,rx_cnt);     //16进制转换函数
	  memset(rx_buff,0,sizeof(rx_buff));   //清空数组
	  rx_cnt = 0;                          //数组索引置0
	}
}

3. 实验结果

以ASCII发送正数和负数如下图所示:
串口通信——串口助手发送正数/负数(以ascii码的形式发送或者以16进制形式发送),最后展示出发送的数
串口通信——串口助手发送正数/负数(以ascii码的形式发送或者以16进制形式发送),最后展示出发送的数
以16进制发送正数和负数如下图所示:
串口通信——串口助手发送正数/负数(以ascii码的形式发送或者以16进制形式发送),最后展示出发送的数文章来源地址https://www.toymoban.com/news/detail-422013.html

到了这里,关于串口通信——串口助手发送正数/负数(以ascii码的形式发送或者以16进制形式发送),最后展示出发送的数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 蓝牙串口调试助手通过PC蓝牙发送数据给ESP32同时在串口上显示

    OK,好久没有更新Blog啦 今天把之前积累的代码放上,给需要学习的程序猿们使用 我还是不太喜欢写文字,倒是比较喜欢客套,哈哈 硬件图: ESP32和USB-micro-B数据线一根 蓝牙串口调试助手通过PC蓝牙发送数据给ESP32同时在串口上显示 具体代码如下:

    2024年02月09日
    浏览(33)
  • C#winform上位机开发学习笔记5-串口助手的定时发送功能添加

    选择自动发送功能后,按照设定的发送时间发送发送框中的信息数据,设定时间可以手动输入,当手动输入信息无效(非数字)时,系统弹出错误提示,并将其设置为默认定时时间。 步骤1:增加计时器空间Timer 步骤2:使能计时器,默认设置定时时间为1秒 注:这里在测试时

    2024年01月23日
    浏览(23)
  • 串口通信实现-串口发送(vivado&verilog版)

    串口系列知识分享: (1)串口通信实现-串口发送 (2)串口通信发送多字节数据 (3)串口通信实现-串口接收 (4)UART 通信-使用VIO进行板级验证 (5)串口接收-控制LED闪烁 (6)使用串口发送实现ACX720开发板时钟显示 (7)串口发送+RAM+VGA传图 此文介绍uart串口协议(串口发

    2024年02月14日
    浏览(30)
  • STM32-串口通信(串口的接收和发送)

    本文在于记录自己的学习过程中遇到的问题和总结,各种情况下串口通信在STM32的实际使用方面占有很大的比重,本文主要对 串口通信 做一个简要的总结。 在STM32里,串口通信是USART,STM32可以通过串口和其他设备进行传输 并行数据 ,是 全双工 , 异步时钟控制 ,设备之间是

    2024年02月03日
    浏览(52)
  • 串口通信-发送和接收数据

    目录 通信方式 硬件电路 软件部分 USART外设(同步/异步收发器) 波特率 引脚复用 初始化基本流程 发送 接收 语言简述 常用的函数 使用的结构体 引脚模式 打印数据的三种方法 使用printf 在实际的串口中,只能发送二进制数,也就是十六进制的最直接数据。如果想发送字符,

    2024年02月12日
    浏览(33)
  • STM32串口通信—串口的接收和发送详解

    目录 前言: STM32串口通信基础知识: 1,STM32里的串口通信 2,串口的发送和接收 串口发送: 串口接收: 串口在STM32中的配置: 1. RCC开启USART、串口TX/RX所对应的GPIO口 2. 初始化GPIO口 3. 串口初始化 4. 串口使能 5. 串口发送数据 串口接收的两种实现方式: 1,轮询方式: 2,中断

    2024年04月08日
    浏览(90)
  • 09 AB 10串口通信发送原理

            通用异步收发传输器( Universal Asynchronous Receiver/Transmitter, UART)是一种异步收发传输器,其在数据发送时将并行数据转换成串行数据来传输, 在数据接收时将接收到的串行数据转换成并行数据, 可以实现全双工传输和接收。它包括了 RS232、 RS449、 RS423、RS422 和

    2024年02月20日
    浏览(27)
  • SpringBoot+RXTXcomm实现Java串口通信 读取串口数据以及发送数据

    记录一下使用SpringBoot+RXTXcomm实现Java串口通信,使用Java语言开发串口,对串口进行读写操作。 案例源码:SpringBoot+RXTXcomm实现Java串口通信 读取串口数据以及发送数据 RXTXcomm.jar这个包支持的系统较多,但是更新太慢,在win系统下使用没有问题,但是在centos的工控机系统里使用

    2024年02月04日
    浏览(30)
  • SpringBoot+jSerialComm实现Java串口通信 读取串口数据以及发送数据

    记录一下使用SpringBoot+jSerialComm实现Java串口通信,使用Java语言开发串口,对串口进行读写操作,在win和linux系统都是可以的,有一点好处是不需要导入额外的文件。 案例demo源码:SpringBoot+jSerialComm实现Java串口通信 读取串口数据以及发送数据 之前使用RXTXcomm实现Java串口通信,这

    2024年02月05日
    浏览(32)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包