stm32发rs485信号错乱
按网上教程,用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
请问是怎么回事……
格式没设置对,串口助手的格式一定要和单片机的一致。 如果用IO来设置发送使能的话,设置了发送使能后,一定要加一点点延时,否则第一个数可能不对。
但是你的第1个和第7个数据都不对,都是最高位有问题,串口发送时是低在前高在后,最高位后面是校验位和停止位。
上位机的校验位、停止位,一定要与MCU的一致,波特率也要一致。拿不准的话,用示波器看一下波特率是多少
す疯Ⅱ恒す 发表于 2018-11-16 09:02
格式没设置对,串口助手的格式一定要和单片机的一致。
这是程序
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;
这是串口助手
toofree 发表于 2018-11-16 09:28
如果用IO来设置发送使能的话,设置了发送使能后,一定要加一点点延时,否则第一个数可能不对。
但是你的第1 ...
麻烦您也看下楼上那个……我不知道哪里设置错了 波特率降低一下试试。说不定是线路问题。 coldfear 发表于 2018-11-16 10:10
这是程序
huart2.Instance = USART2;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
这句改成
huart2.Init.WordLength = UART_WORDLENGTH_9B; す疯Ⅱ恒す 发表于 2018-11-16 10:35
huart2.Init.WordLength = UART_WORDLENGTH_8B;
解决了!多谢!但是是为什么呢? 你程序上使用奇偶校验了 coldfear 发表于 2018-11-16 10:54
解决了!多谢!但是是为什么呢?
使用偶检验要多一位,但是上位机不是这样算的。最好你仔细看看规格书,上面说的很详细。
页:
[1]
2