通过i2c从Arduino发送Array或int到STM32时出现问题

vhmi4jdf  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(150)

我必须建立Arduino和STM 32之间的连接(用C和HAL编程)。Arduino用于从机模式,而STM32用于主机模式。
在这种状态下,我可以很容易地执行这些传输:

  • 从STM 32到Arduino的整数;
  • 从STM32到Arduino的整数数组;
  • uint8_t array(a“string”)从STM32到Arduino;
  • 从Arduino到STM32的字符串;

通过UART在终端上显示接收到的内容来检查交换。
因此,从STM32到Arduino的传输按预期工作。但我在接收方面有些困难。即使是从Arduino接收字符串,我也必须在Arduino上使用Wire.write(Message.c_string());指令。但是如果我尝试接收一个整数,STM32终端上什么也没有发生。如果我尝试接收一个整数数组,我会在终端上看到N个空字符,然后是光标(N是数组的大小)。
所以我确定我收到了一些东西...但我不能确定是否:
1.我收到错误的数据
1.我没有好好展示
有人知道是什么导致了这种行为吗?你可以在下面找到我的代码。

/* On STM32. I'm just sharing the main function to avoid to flood the topic. Please be assured that all the other stuff, as UART or I2C configuration, is done properly*/
    
    int main(void)
    {
        HAL_StatusTypeDef retour_i2c;
    
        uint8_t message_envoye[] = "Hello World !!";
        uint8_t entier_envoye = 32;
        uint8_t tableau_envoye[] = {1, 2, 3, 4};
    
        uint8_t message_recu[10];
        uint8_t entier_recu;
        uint8_t tableau_recu[4]; // My Arduino is sending an array of 4 integers
    
      HAL_Init();
      SystemClock_Config();
      MX_GPIO_Init();
      MX_USART2_UART_Init();
      MX_I2C1_Init();
    
      I2C_Verif_Addresses();
    
      while (1)
      {
          // Transmition part is OK
          retour_i2c = HAL_I2C_Master_Transmit(&hi2c1, (uint16_t)(I2C_SLAVE_ADDR << 1), tableau_envoye, sizeof(tableau_envoye), 1000);
          if(retour_i2c != HAL_OK){
              I2C_Error_Handler(&hi2c1);
          }
          else{
              HAL_Delay(1000);
              HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
          }
    
    
          // Reception part is not OK
          // retour_i2c = HAL_I2C_Master_Receive(&hi2c1, (uint16_t)(I2C_SLAVE_ADDR << 1), message_recu, sizeof(message_recu), 1000); // "strings" are working
          retour_i2c = HAL_I2C_Master_Receive(&hi2c1, (uint16_t)(I2C_SLAVE_ADDR << 1), tableau_recu, sizeof(tableau_recu), 1000); // Receiving an array cause invisible characters to be printed
          // retour_i2c = HAL_I2C_Master_Receive(&hi2c1, (uint16_t)(I2C_SLAVE_ADDR << 1), entier_recu, sizeof(entier_recu), 1000);
          if(retour_i2c != HAL_OK){
              I2C_Error_Handler(&hi2c1);
          }
          else{
              HAL_Delay(1000);
              HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
              HAL_UART_Transmit(&huart2, tableau_recu, sizeof(tableau_recu), 10);
          }
      }
    }
oymdgrw7

oymdgrw71#

通过TCP发送二进制数据将不会在终端程序中显示可读结果。
如果值对应于可打印字符的编码,则您将看到一些内容,但不是数字的值,例如。0x31 = 49的二进制值将被打印为1
您可以使用sprintf将数字转换为字符串表示,或者编写自己的转换函数。或者使用一个可以将二进制数据显示为十六进制转储的程序来检查值。

示例:

for(uint_8 i = 0; i < sizeof(tableau_recu); i++)
   {
      uint8_t buf[32];
      int n = sprintf((char*)buf, "%d\n", (int)tableau_recu[i]);
      HAL_UART_Transmit(&huart2, (uint16)buf, n, 10);
   }

相关问题