打印
[STM32F1]

HAL库 STM32F417关于串口转发丢数的问题

[复制链接]
988|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wyjie|  楼主 | 2022-2-4 09:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现有有一个外部设备(115200,8,1),通过串口与单片机的串口2通过TTL直接连接,我要实现的是将串口2的数据直接转发到串口1(115200,8,1),将串口1的数据直接转发的串口2。
实现时,不采用中断,DMA,直接对数据进行转发,且单片机不作其它操作

使用特权

评论回复
沙发
wyjie|  楼主 | 2022-2-4 09:23 | 只看该作者
代码如下:
..............
/* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1|GPIO_PIN_0, GPIO_PIN_RESET);
        HAL_Delay(1000);
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1|GPIO_PIN_0, GPIO_PIN_SET);      
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
                while(1)
                {
                        huart1ToHuart2_up();
                        huart2ToHuart1_up();
                }

}
............
void        huart1ToHuart2_up(void)
{
        unsigned char temp;
        if(RESET != __HAL_UART_GET_FLAG(&huart1,UART_FLAG_ORE))
        {
                HAL_UART_Receive(&huart1,&temp,1,0x0);
                __HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_ORE);
        }
        if(RESET != __HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE))
        {

                HAL_UART_Receive(&huart1,&temp,1,0x0);
                HAL_UART_Transmit(&huart2,&temp,1,0x0);
                __HAL_UART_CLEAR_FLAG(&huart2,UART_FLAG_TC);
        }
}


void        huart2ToHuart1_up(void)
{
        unsigned char temp;
        if(RESET != __HAL_UART_GET_FLAG(&huart2,UART_FLAG_ORE))
        {
                HAL_UART_Receive(&huart2,&temp,1,0x0);
                __HAL_UART_CLEAR_FLAG(&huart2,UART_FLAG_ORE);
        }
        if(RESET != __HAL_UART_GET_FLAG(&huart2,UART_FLAG_RXNE))
        {
                HAL_UART_Receive(&huart2,&temp,1,0);
                HAL_UART_Transmit(&huart1,&temp,1,0x0);
                __HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_TC);
        }
}

使用特权

评论回复
板凳
heweibig| | 2022-2-4 09:26 | 只看该作者

你有什么打算呢?或者你想知道什么?

使用特权

评论回复
地板
wyjie|  楼主 | 2022-2-4 09:29 | 只看该作者
转发基本能够完成,但在测试时发现,当发送多个字符串(无法做到等长)串口1向串口2发送数据正常,但串口2向串口1发送时出现丢数一般的固定丢10到11个字节。

使用特权

评论回复
5
wyjie|  楼主 | 2022-2-4 09:31 | 只看该作者
由于串口2是外部设备的升级口,在使用时可能会由串口1向串口2发送大量的数据(速率比较快)!

使用特权

评论回复
6
llljh| | 2022-2-4 22:24 | 只看该作者
这种应用有没有其它更好的方法

使用特权

评论回复
7
wyjie|  楼主 | 2022-2-4 22:27 | 只看该作者
出现的问题是什么引起的,有没解决的办法。

使用特权

评论回复
8
jiajs| | 2022-2-4 22:30 | 只看该作者
最简单的办法就是硬件直接连线,不用写代码了

使用特权

评论回复
9
zwll| | 2022-2-4 22:32 | 只看该作者
要是写代码,就需要增加缓冲区和中断。以避免因为等待延时导致的数据丢失。不用中断难以避免数据丢失的。

使用特权

评论回复
10
wyjie|  楼主 | 2022-2-4 22:35 | 只看该作者
主要是  我这边串口1平时的时候要做别的应用比如做协议的转化什么的,但用户又要求单片机和外设都可以以串口1进行升级,没办法啊!

使用特权

评论回复
11
wuhany| | 2022-2-4 22:37 | 只看该作者
如果你空间和成本没问题的话,也可以考虑加一个“双刀双置”的继电器,由某个单片机的一个IO控制。

使用特权

评论回复
12
dengdc| | 2022-2-4 22:39 | 只看该作者
这种异步串行透传的模式,应该没有很好的方法避免!可能降低速度(比如9600)会有一定效果。

使用特权

评论回复
13
juventus9554| | 2022-2-4 22:41 | 只看该作者
对于这样的芯片来说,115200这速度不快,软件处理都可以搞定,多检查程序吧
直接在中断里处理

使用特权

评论回复
14
xxrs| | 2022-2-4 22:43 | 只看该作者
单步运行试试看

使用特权

评论回复
15
llljh| | 2022-2-4 22:47 | 只看该作者
是不是缓存太小了

使用特权

评论回复
16
hanwe| | 2022-2-4 22:50 | 只看该作者
连续2个接收中断 ,数据就崩盘了,加大缓冲区试试

使用特权

评论回复
17
wyjie|  楼主 | 2022-2-4 22:54 | 只看该作者

好的,我明天去单位试一下,多谢各位大侠了哈

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

927

主题

12706

帖子

5

粉丝