在STM32F1上的多个USART连接之间发出中继消息

在STM32F1上的多个USART连接之间发出中继消息,stm32,uart,freertos,usart,libopencm3,Stm32,Uart,Freertos,Usart,Libopencm3,我在USART连接上安装了一个STM32F103C8T8和两个模块(SARA和ESP82)。 我们目前正在使用libopencm3和FreeRTOS库 目标 我希望STM向SARA模块发送AT命令,接收响应,并将来自SARA模块的此消息中继到ESP模块。全部通过USART连接 设置说明: STM连接到USART2上的SARA R412 LTE-M/NB物联网板,ESP8266连接到USART3上 SARA R412的PWR_ON和RST分别连接到A5和A4。这些用于电源循环,以正确打开SARA模

我在USART连接上安装了一个STM32F103C8T8和两个模块(SARA和ESP82)。 我们目前正在使用libopencm3和FreeRTOS库

目标

我希望STM向SARA模块发送AT命令,接收响应,并将来自SARA模块的此消息中继到ESP模块。全部通过USART连接

设置说明:

STM连接到USART2上的SARA R412 LTE-M/NB物联网板,ESP8266连接到USART3上

SARA R412的PWR_ON和RST分别连接到A5和A4。这些用于电源循环,以正确打开SARA模块

STM32具有一些硬编码的命令,这些命令被发送到USART2上的SARA模块,作为回报,该模块应应答,然后STM32应将该应答转发到USART3上的ESP8266

出于测试目的,ESP没有连接到atm,我们只是在同一个USART端口上使用TTL进行监听

下面是TTL到STM连接的图像:

下面是STM到SARA连接的图像(SARA板上的RX和TX切换):

问题:

当从SARA向ESP8266转发消息应答时,有些地方不对劲。我们正在经历一些连接,消息被正确地传递,但是它非常不一致,大多数时候它被卡在一个字符上

我们的尝试: 我们正在使用TTL连接器和minicom来监听USART连接,并查看问题出现的位置。我们观察到SARA模块正确地接收来自STM32的命令,并且正确地回答了相应的消息。接下来发生的事情是STM32应该正确地接收消息,但是在侦听USART3(ESP usart连接)时,消息有时是正确的,有时不是

我们也尝试过降低波特率,但是结果没有差别

STM32可以在USART2和USART3上发送命令,但是应该中继的答案有时没有正确中继(或者根本没有)

我们怀疑问题出在我们的usart\u get\u string方法中,该方法将来自一个usart的消息中继到另一个usart连接:

static void usart_get_字符串(uint32_t usart src、uint32_t usart dst、uint16_t str_max_size)
{
接收到的uint8_t='V';
uint16_t itr=0;
uint8_t recvPrev;
同时(itr
该方法非常简单,
received=usart\u recv\u blocking(usart src)部分可能应该在第一个if语句中,但如果这样做,则不会返回任何内容

包括完整代码:

#包括
#包括
#包括
#包括
#包括
#定义消息长度512
静态空隙
uart\u设置(无效)
{
//莎拉装置
rcc外围时钟启用(rcc GPIOA);
rcc外围时钟启用(rcc USART2);
gpio_设置_模式(GPIOA,
GPIO_模式_输出_50_MHZ,
GPIO\u CNF\u输出\u ALTFN\u推拉,
GPIO_USART2_TX);
usart_设置_波特率(USART2,115200);
usart_集合_数据位(USART2,8);
usart\u设置\u停止位(USART2、usart\u停止位\u 1);
usart_设置_模式(USART2、usart_模式_发送_接收);
usart\U集合\U奇偶校验(USART2,usart\U奇偶校验\U无);
usart\U设置\U流量控制(USART2,usart\U流量控制\U无);
usart_启用(USART2);
//ESP设置
rcc外围时钟启用(rcc GPIOB);
rcc外围时钟启用(rcc USART3);
gpio_设置_模式(GPIOB,
GPIO_模式_输出_50_MHZ,
GPIO\u CNF\u输出\u ALTFN\u推拉,
GPIO_USART3_TX);
usart_设置_波特率(USART3115200);
usart_集合_数据位(USART3,8);
usart\u设置\u停止位(USART3、usart\u停止位\u 1);
usart_设置_模式(USART3、usart_模式_发送_接收);
usart\U集合\U奇偶校验(USART3,usart\U奇偶校验\U无);
usart\U设置\U流量控制(USART3,usart\U流量控制\U无);
usart_启用(USART3);
}
静态内联空洞
uart_putc(uint8_t ch,uint32_t usart_端口)
{
usart_发送(usart_端口,ch);
}
静态内联空洞
uart_putc_阻塞(uint8_t ch,uint32_t usart_端口)
{
usart_发送_阻塞(usart_端口,ch);
}
静态内联无效uart\U puts(uint8\U t*s、uint32\U t usart\U端口)
{
而(*s!='\0')
{
uart_putc_阻塞(*s,usart_端口);
gpio_切换(GPIOC、GPIO13);
vTaskDelay(pdMS到刻度(100));
s++;
}
uart\U putc\U阻塞('\r',usart\U端口);
uart\U putc\U阻塞('\n',usart\U端口);
}
静态无效usart_get_字符串(uint32_t usartSrc、uint32_t usartDst、uint16_t stru_max_size)
{
接收到的uint8_t='V';
uint16_t itr=0;
uint8_t recvPrev;
同时(itr