如何通过一个串口向另外一个32单片机同时传递温度,湿度,角度数据,保证另外一个单片机准确接收并且在oled显示(我有点不明白串口里面给的库函数有个USARTSendData(USART2,*data)那个data只能传一个变量啊,咋样传递我上面那些数据啊),有谁帮帮我,谁有思路呀
data可以定义为一个数组,如USARTSendData(USART1, RxBuffer[TxCounter]);
data也可以定义为一个结构体,结构体里包含温度,湿度,角度等。
如果该函数只能发送一个值,那循环发送不就可以达到发送字符串的目的了吗
```c
char buf[]="hello";
for(int i=0;i<strlen(buf);i++)
{
USARTSendData(USART2,buf[i]);
}
```
简单解决:
发射端:将数据循环发送,可以将Usart映射到printf,比较方便。
或者可以自己写一个printf
#include "stdarg.h"
#include "string.h"
#include "stdio.h"
#include "string.h"
#include "stdio.h"
uint8_t USART1_RX_BUF[200];
uint16_t USART1_RX_STA=0;
uint8_t USART1_TX_BUF[200];
void u1_printf(char* fmt,...)
{
uint16_t i,j;
va_list ap;
va_start(ap,fmt);
vsprintf((char*)USART1_TX_BUF,fmt,ap);
va_end(ap);
i=strlen((const char*)USART1_TX_BUF);
for(j=0;j<i;j++)
{
while((USART1->SR&0X40)==0);
USART1->DR=USART1_TX_BUF[j];
}
}
接收端:将数据循环接收(创建一个缓冲数组),按照发送顺序解包(解缓冲数组)就行。
优化:
将Usart+DMA的方式,可以直接调用HAL自带的函数,可以实现其发送。
参考:
void tx_dma_enable(uint8_t *data, uint16_t len)
{
//disable DMA
__HAL_DMA_DISABLE(&hdma_usart1_tx);
while(hdma_usart1_tx.Instance->CR & DMA_SxCR_EN)
{
__HAL_DMA_DISABLE(&hdma_usart1_tx);
}
__HAL_DMA_CLEAR_FLAG(&hdma_usart1_tx, DMA_HISR_TCIF7);
hdma_usart1_tx.Instance->M0AR = (uint32_t)(data);
__HAL_DMA_SET_COUNTER(&hdma_usart1_tx, len);
__HAL_DMA_ENABLE(&hdma_usart1_tx);
}
接收端:采用Usart+DMA+Fifo的方式,网上页挺多这个教程。
我们可以去网上使用一个小型的fifo开源库就行。
我们分字节进行结算,这里就不做展示了。
望题主采纳谢谢。
参考一下这篇文章
https://blog.csdn.net/HHHSSD/article/details/115226382
把截图发上来才能进一步分析
这个需要写一个简单的通信协议,详细的可以参考下面这篇文章,基本可以满足你的要求。
https://www.csdn.net/tags/MtjacgysMDIzMjgtYmxvZwO0O0OO0O0O.html
总结一下STM32通过串口实现双机通信的方法,主机通过串口一发送,从机通过串口三接收,其他串口配置类似。
https://blog.csdn.net/weixin_42280621/article/details/86268012