coldfear 发表于 2018-11-15 21:13:54

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

请问是怎么回事……

す疯Ⅱ恒す 发表于 2018-11-16 09:02:23

格式没设置对,串口助手的格式一定要和单片机的一致。

toofree 发表于 2018-11-16 09:28:57

如果用IO来设置发送使能的话,设置了发送使能后,一定要加一点点延时,否则第一个数可能不对。
但是你的第1个和第7个数据都不对,都是最高位有问题,串口发送时是低在前高在后,最高位后面是校验位和停止位。
上位机的校验位、停止位,一定要与MCU的一致,波特率也要一致。拿不准的话,用示波器看一下波特率是多少


coldfear 发表于 2018-11-16 10:10:11

す疯Ⅱ恒す 发表于 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;

这是串口助手



coldfear 发表于 2018-11-16 10:10:41

toofree 发表于 2018-11-16 09:28
如果用IO来设置发送使能的话,设置了发送使能后,一定要加一点点延时,否则第一个数可能不对。
但是你的第1 ...

麻烦您也看下楼上那个……我不知道哪里设置错了

zjczm 发表于 2018-11-16 10:29:01

波特率降低一下试试。说不定是线路问题。

す疯Ⅱ恒す 发表于 2018-11-16 10:35:06

coldfear 发表于 2018-11-16 10:10
这是程序

huart2.Instance = USART2;


huart2.Init.WordLength = UART_WORDLENGTH_8B;


这句改成
huart2.Init.WordLength = UART_WORDLENGTH_9B;

coldfear 发表于 2018-11-16 10:54:16

す疯Ⅱ恒す 发表于 2018-11-16 10:35
huart2.Init.WordLength = UART_WORDLENGTH_8B;



解决了!多谢!但是是为什么呢?

TLLED 发表于 2018-11-16 11:01:19

你程序上使用奇偶校验了

す疯Ⅱ恒す 发表于 2018-11-16 17:41:59

coldfear 发表于 2018-11-16 10:54
解决了!多谢!但是是为什么呢?

使用偶检验要多一位,但是上位机不是这样算的。最好你仔细看看规格书,上面说的很详细。
页: [1] 2
查看完整版本: stm32发rs485信号错乱