如何为 UART 传输设置消息的开始字节

Posted

技术标签:

【中文标题】如何为 UART 传输设置消息的开始字节【英文标题】:How to set a byte of start of message for a UART transmission 【发布时间】:2021-12-13 14:03:03 【问题描述】:

我正在尝试使用 UART 从 stm32 Nucleo 到 Matlab Simulink 传输一定数量的数据。更准确地说,我想传输两个 uint16 变量。我将它们分成两个包,每个包 1 个字节。 问题是当我在 Simulink 上收到它们时,不能保证 SImulink 以正确的顺序接收包,所以我必须实现一些东西,让我了解消息的开始位置。 我正在尝试这样做,但目前我没有成功。 我想在Simulink中指定我可以写消息的标题,所以我认为我只需要在我的stm32板中设置它。

这是我的代码:

//Serial Stream Routine
         if ((streamActive != 0) && (dataReady == 1))
         
             do
                     //Sending the first byte of counter
                     firstbyte = counter & 0xFF;
                     memcpy(str, &firstbyte, 1);
                     HAL_UART_Transmit(&huart2, str, 1, HAL_MAX_DELAY);
                     //Sending the second byte of counter
                     secondbyte =(counter >> 8) & 0xFF ;
                     memcpy(str, &secondbyte, 1);
                     HAL_UART_Transmit(&huart2, str, 1, HAL_MAX_DELAY);

                     if(streamActive == 2) //We transmit the counter with an offset

                         offset = counter + OFFSET_VALUE;

                         //Sending the first byte of offset
                         firstbyte = offset & 0xFF;
                         memcpy(str, &firstbyte, 1);
                         HAL_UART_Transmit(&huart2, str, 1, HAL_MAX_DELAY);
                         //Sending the second byte of offset
                         secondbyte =(offset >> 8) & 0xFF ;
                         memcpy(str, &secondbyte, 1);
                         HAL_UART_Transmit(&huart2, str, 1, HAL_MAX_DELAY);
                     

                     counter++;
                     dataReady = 0;
                 while(counter < MAX_VALUE);

所以我想传输变量计数器和偏移量。帮帮我,谢谢。

【问题讨论】:

为什么不能用 same 包裹发送? 因为通过 UART 我不能发送超过 8 位,我错了吗? 但是你说的是一个,它通常是几个字节,带有一个标识头。使用既定协议 - 不要发明新协议。 只有两个变量,每个变量 16 位。我将它们分成两部分,每部分 8 位。现在我想按正确的顺序接收它们。 Simulink 手册没有介绍吗?如果你不能发送超过一个字节而不会对序列感到困惑,那将是非常无用的。 【参考方案1】:

现在我想按正确的顺序接收它们

添加标头和 PC 和 ARM Corex 都是 little-endian,因此足以:

         do
                 HAL_UART_Transmit(&huart2, (void *)"START", 5, HAL_MAX_DELAY);
                 HAL_UART_Transmit(&huart2, (void *)&counter, 2, HAL_MAX_DELAY);
                 if(streamActive == 2) //We transmit the counter with an offset
                     offset = counter + OFFSET_VALUE;
                     HAL_UART_Transmit(&huart2, (void *)"START", 5, HAL_MAX_DELAY);
                     HAL_UART_Transmit(&huart2, (void *)&offset, 2, HAL_MAX_DELAY);
                 
                 counter++;
                 dataReady = 0;
            while(counter < MAX_VALUE);


And in simulink (matlab command): uint16('START') 

【讨论】:

啊哇,这太容易了……但是现在我有这个警告:从不兼容的指针类型传递“HAL_UART_Transmit”的参数 2。为什么?顺便说一句,我认为我解释的问题仍然存在。 @Giulio 因为 STM HAL 程序员不知道如何正确使用类型。 好的,所以我必须忽略该警告? @Giulio 从不忽略警告。查看我的更改 非常感谢。太完美了!!

以上是关于如何为 UART 传输设置消息的开始字节的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Raspberry Pi 编写简单的 UART Linux 设备驱动程序?

如何为底部显示的消息设置动画?

AVR UART 接收到错误的字节

如何为 RabbitMQ RPC 请求设置超时?

如何为编码的 UI 测试设置文化以从资源文件中获取本地化文本?

ARM9 串口fifo大小