按网上教程,用cubeMx写了一个通过rs485发送16进制数据的程序
- HAL_GPIO_WritePin(GPIOD, GPIO_PIN_7, GPIO_PIN_SET);
- uint16_t TxByte = 0x01 ;
- HAL_UART_Transmit(&huart2, (uint8_t *)&TxByte, 1, 0xFF);
-
- TxByte =0x06 ;
- HAL_UART_Transmit(&huart2, (uint8_t *)&TxByte, 1, 0xFF);
-
- TxByte =0x00 ;
- HAL_UART_Transmit(&huart2, (uint8_t *)&TxByte, 1, 0xFF);
- TxByte = 0x42 ;
- HAL_UART_Transmit(&huart2, (uint8_t *)&TxByte, 1, 0xFF);
-
- TxByte = 0x03 ;
- HAL_UART_Transmit(&huart2, (uint8_t *)&TxByte, 1, 0xFF);
-
- TxByte = 0xE8 ;
- HAL_UART_Transmit(&huart2, (uint8_t *)&TxByte, 1, 0xFF);
-
- TxByte = 0x29 ;
- HAL_UART_Transmit(&huart2, (uint8_t *)&TxByte, 1, 0xFF);
-
- TxByte = 0x60 ;
- HAL_UART_Transmit(&huart2, (uint8_t *)&TxByte, 1, 0xFF);
- HAL_Delay(1000);
复制代码 然后烧录上之后理论上发送的是01 06 00 42 03 E8 29 60 ,结果用串口助手试了下收到的是81 06 00 42 03 E8 A9 60
请问是怎么回事……
|
但是你的第1个和第7个数据都不对,都是最高位有问题,串口发送时是低在前高在后,最高位后面是校验位和停止位。
上位机的校验位、停止位,一定要与MCU的一致,波特率也要一致。拿不准的话,用示波器看一下波特率是多少
这是程序
huart2.Instance = USART2;
huart2.Init.BaudRate = 115200;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_EVEN;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
这是串口助手
串å£å©æ
麻烦您也看下楼上那个……我不知道哪里设置错了
huart2.Init.WordLength = UART_WORDLENGTH_8B;
这句改成
huart2.Init.WordLength = UART_WORDLENGTH_9B;
解决了!多谢!但是是为什么呢?
使用偶检验要多一位,但是上位机不是这样算的。最好你仔细看看规格书,上面说的很详细。
7楼说的很对。
STM32就是这么用的,数据位本身可以是7位或8位,有校验位的时候,校验位也加进里面,这样的话就可以有9位了。