完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
STM32 单或者多串口 ASCII 的接收与发收
单个串口发送 先重定义,如下 int fputc(int ch,FILE* f) { HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,1); return ch; } 数据量大的可用DMA,亲测有效 int fputc(int ch,FILE* f) { while(HAL_UART_Transmit_DMA(&huart1,(uint8_t*)&ch,1)!=HAL_OK); return ch; } 发送的内容用printf即可 多串口发送 在实际应用中,我们难免会使用多个串口来发送ASCII,像上面的printf是不能达到效果的。 因此可以采用以下的方法: //创建一个变量存字符串 char TXDate[]=”abcd“; //假设用串口一来发送 HAL_UART_Transmit(&huart1,(uint8_t*)&TXDate,strlen(TXDate),strlen(TXDate)); 但有时有些应用不只是发单一的字符串,有些变量会在字符串发送,可以利用C语言的sprintf函数的帮助来实现。 //创建一个变量存字符串,数组大小跟实际情况变化 char TXDate[20]; //创建一个发送的变量 float x; //假设用串口一来发送 sprintf(char,"char:%.2fn",x); HAL_UART_Transmit(&huart1,(uint8_t*)&TXDate,strlen(TXDate),strlen(TXDate)); 串口的接收 接收ASCII的数字并组合,此函数可处理 有小数的正负和无小数的正负的数字。 //此函数用于接收ascii码的数字,可方便后续的计算 /* uint8_t *rxbuffer 存放数据的数组 */ float readstring (uint8_t *rxbuffer) { float str = 0;//返回的变量 int sum = 0; float t = 0,c = 0,z=0,a = -1;//作为中间变量 uint8_t flag = 0;//做标记位,判断有无小数点 for(int i = 0;i<50;i++)//50是因为创建了一个50的数组来存放数据,可根据自己情况改变 { if(rxbuffer=='.')//记录小数点位置 { flag =1; c = i-1;//记录此时的位置 } if(rxbuffer==0x0D&&rxbuffer[i+1] == 0x0A)//ascii数据接收完毕 { sum = i-1;//记录次数位置 //数字处理 //没有小数点处理 if(rxbuffer[sum] >= 'A') { flag = 2; } if(flag==0) { //判断正 if(rxbuffer[0]!='-') { for(int j = 0;j<=sum;j++) { str += (rxbuffer[j]-'0')*(int)(pow(10,sum-t)); t++; } } //判断负 if(uart1_rx_buffer[0]=='-') { for(int j = 1;j<=sum;j++) { str += (rxbuffer[j]-'0')*(int)(pow(10,sum-t-1)); t++; } str = -str; } } //有小数点处理 else if(flag ==1) { //判断正 if(rxbuffer[0]!='-') { for(int l = 0;l<=c;l++) { str += (rxbuffer[l]-'0')*(int)(pow(10,c - z)); z++; } for(int p = c+2;p<=sum;p++) { str += (rxbuffer[p]-'0')*(pow(10,a)); a--; } } //判断负 if(rxbuffer[0]=='-') { for(int l = 1;l<=c;l++) { str += (rxbuffer[l]-'0')*(int)(pow(10,c - z-1)); z++; } for(int p = c+2;p<=sum;p++) { str += (rxbuffer[p]-'0')*(pow(10,a)); a--; } str = -str; } } else if(flag == 2)//有字母时不处理 { str = 0; } break;//退出本次处理数据的循环 } } return str; } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1932 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1705 浏览 1 评论
1185 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
785 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1750 浏览 2 评论
1992浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
827浏览 4评论
stm32f4下spi+dma读取数据不对是什么原因导致的?
279浏览 3评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
637浏览 3评论
643浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-2-2 13:46 , Processed in 1.301105 second(s), Total 74, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号