发送整数,字符串等总结

上位机端,发送的是字符串的每个字节,在下位机中接收到每个字节之后,再综合处理得到数据。
比如
aa=123
outstr=str(aa)
uart.write(outstr[0])
uart.write(outstr[1])
uart.write(outstr[2])

下位机接收到每个字节之后,用str_long函数整合成long型,这样就不用联合体了。

/******************************************************************
功能:将一个字符串转为32位长整型变量,比如"1234"转为1234
参数:str:指向待转换的字符串           
返回:转换后的数值										       
 ******************************************** **********************/ 
unsigned long Str_Long(char *str,unsigned char len) 
{
	 unsigned long temp=0;
	 unsigned long fact=1;
	// unsigned char len=strlen(str);	// <string.h>头文件包含strlen()函数	
	 unsigned char i;		// strlen()函数计算的字符串长度不包含最后一个空字符(值0)
	 for(i=len;i>0;i--)															   
	 {
		temp+=((str[i-1]-0x30)*fact);  // 数组下标从0开始
		fact*=10;
	 }
	 return temp;
}

得到long型之后,再计算,这里传入的形参长度应是len=3…
上位机发送肯定知道长度,也可以把长度一起发送过。

如果是浮点数,也一样,先将浮点数乘以100或者10,1000,放大,成整数,然后转换成str类型,在发送
比如。
aa=1234.45
bb=aa*100
outstr=str(bb)
在发送6个字节数据。
uart.write(outstr[0])
uart.write(outstr[1])
uart.write(outstr[2])
uart.write(outstr[3])
uart.write(outstr[4])
uart.write(outstr[5])

下位机就进行处理。
得到整数,再除以100.
得到浮点数

# Untitled - By: Administrator - 周二 九月 22 2020

import sensor, image, time
from pyb import UART
uart=UART(1,9600)
uart.init(9600, bits=8, parity=None, stop=1) # init with given parameters

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
clock = time.clock()
while(True):  #查十次,看下是不是都测试对
    clock.tick()
    img = sensor.snapshot()
    img.lens_corr(1.8) # strength of 1.8 is good for the 2.8mm lens.
    for code in img.find_qrcodes():
           img.draw_rectangle(code.rect(), color = (255, 0, 0))
          # print(code)
           output_str=str(code.payload())
           aa=code.x()
           bb=code.y()
           cc=aa+bb
           data = bytearray([aa,bb])#转成16进制
           output_str="%.2f" % (code.x()) #10进制字符包
           cc=63.4;
           output_str=str(cc) #10进制字符包
           uart.writechar(0xab)
           uart.writechar(0x01)
           uart.write(cc[0])
           #uart.write(output_str[0])#1---a,包括了+0x30的数据,不是原始的
           #uart.write(output_str[1])
           #uart.write(output_str[2])
           #uart.write(output_str[3])
           #uart.write(output_str[4])
          
           print(code.x())
           #uart.write(bb)
           #uart.write(cc)
          
           #uart.writechar(0xab)
           #uart.writechar(0x01)
           #uart.write(code.payload())#'\r\n' 
           #abc[abc{123+123}....cab[cba
           #a---1 b--2 c--3####  output_str=str(code.payload())#10进制字符包
           #uart.write(output_str[0])#1---a,包括了+0x30的数据,不是原始的
           #uart.write(output_str[1])#取一个个字节出来发送
           #uart.write(output_str[2])
           #uart.write(output_str[3])
           #uart.write(output_str[4])
           #uart.write(output_str[5])
           #uart.write(output_str[6])
           #uart.writechar(0xba)
           #print(code.payload())
    print(clock.fps())

<think>嗯,用户想知道如何在STM32中使用HAL库通过串口发送整数。首先,我需要回忆一下HAL库的串口发送函数。根据引用[1],HAL_UART_Transmit函数可以发送数据,参数是UART句柄、数据指针、数据长度和超时时间。但直接发送整数的话,可能需要转换,因为整数是二进制形式,而串口通常发送字符。 用户可能需要将整数转换为字符串,然后发送字符串的每个字符。比如,可以使用sprintf或更安全的snprintf将整数格式化为字符串,然后通过HAL_UART_Transmit发送这个字符串。或者,如果用户想直接发送二进制数据,可以将整数指针转换为uint8_t*,并发送其字节。但要注意大小端的问题。 另外,引用[4]中提到可以通过重定向printf来发送数据,这样用户可以直接使用printf发送格式化的数据,包括整数。但需要实现__io_putchar函数,并处理换行符的问题。这样会更方便,但用户可能需要配置好工程中的相关设置。 可能还需要考虑DMA方式,比如引用[2]和[3]提到的DMA发送,这样可以提高效率,但用户的问题可能更基础,先解决基本发送方法再考虑优化。 总结步骤应该是:1. 转换整数字符串;2. 使用HAL_UART_Transmit发送字符串;或者使用printf重定向。可能需要示例代码,比如用sprintf生成字符串,然后调用发送函数。同时提醒用户注意字符串终止符和缓冲区大小,避免溢出。 另外,用户可能不清楚这些转换的具体方法,所以需要详细说明转换过程,比如分解各位数字,或者使用库函数。同时要说明不同方法的优缺点,比如直接发送二进制可能更高效但需要接收端解析,而字符串更易读但效率低。 可能的问题是如何处理负数或大整数的情况,这时候格式化函数会自动处理,但手动转换的话需要考虑更多情况。因此推荐使用库函数进行格式化,减少错误。 最后,确保提供的代码示例正确,比如在STM32CubeMX生成的工程中添加代码的位置,是否需要启用某些功能,比如UART的中断或DMA,但根据用户的问题,可能只需要基本的阻塞发送方法,所以示例代码不需要涉及中断或DMA配置,除非用户进一步询问优化方法。</think>### 如何在STM32中使用HAL库通过串口发送整数? #### 方法1:将整数转换为字符串发送 通过格式化函数(如`sprintf`或`snprintf`)将整数转换为字符串,再通过串口发送字符串。这是最通用的方法,适用于调试信息输出。 ```c // 在代码中定义缓冲区和转换逻辑 char buffer[20]; // 确保缓冲区足够大 int value = 1234; snprintf(buffer, sizeof(buffer), "%d\n", value); // 添加换行符\n以触发发送[^4] HAL_UART_Transmit(&huart1, (uint8_t*)buffer, strlen(buffer), 100); ``` #### 方法2:直接发送二进制数据(需注意大小端) 将整数按字节拆分后发送,适用于高速数据传输,但需接收端解析字节序: ```c int value = 1234; HAL_UART_Transmit(&huart1, (uint8_t*)&value, sizeof(value), 100); ``` #### 方法3:重定向`printf`函数(推荐) 通过重定向`printf`,可直接使用格式化输出,简化代码: 1. 在`uart.c`中添加以下代码: ```c #include <stdio.h> int __io_putchar(int ch) { HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 20); return ch; } ``` 2. 在`main.c`中调用: ```c int value = 5678; printf("%d\n", value); // 自动触发__io_putchar发送 ``` #### 关键注意事项 1. **缓冲区溢出**:使用`sprintf`时需确保缓冲区足够大,建议用`snprintf`限制长度。 2. **换行符问题**:若未添加`\n`,`printf`可能因缓冲区未刷新而延迟发送[^4]。 3. **DMA优化**:高频发送时建议结合DMA(参考引用[2][3]的缓冲发送方法)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值