我必须建立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);
}
}
}
1条答案
按热度按时间oymdgrw71#
通过TCP发送二进制数据将不会在终端程序中显示可读结果。
如果值对应于可打印字符的编码,则您将看到一些内容,但不是数字的值,例如。
0x31 = 49
的二进制值将被打印为1
。您可以使用
sprintf
将数字转换为字符串表示,或者编写自己的转换函数。或者使用一个可以将二进制数据显示为十六进制转储的程序来检查值。示例: