请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32发rs485信号错乱

[复制链接]
coldfear 提问时间:2018-11-15 21:13 /
按网上教程,用cubeMx写了一个通过rs485发送16进制数据的程序
  1.         HAL_GPIO_WritePin(GPIOD, GPIO_PIN_7, GPIO_PIN_SET);
  2.         uint16_t TxByte = 0x01 ;
  3.         HAL_UART_Transmit(&huart2, (uint8_t *)&TxByte, 1, 0xFF);
  4.                
  5.                     TxByte =0x06 ;
  6.         HAL_UART_Transmit(&huart2, (uint8_t *)&TxByte, 1, 0xFF);
  7.                
  8.                     TxByte =0x00 ;
  9.         HAL_UART_Transmit(&huart2, (uint8_t *)&TxByte, 1, 0xFF);

  10.                     TxByte = 0x42  ;
  11.         HAL_UART_Transmit(&huart2, (uint8_t *)&TxByte, 1, 0xFF);
  12.                                 
  13.                                 TxByte = 0x03 ;
  14.         HAL_UART_Transmit(&huart2, (uint8_t *)&TxByte, 1, 0xFF);
  15.                                 
  16.                                 TxByte = 0xE8 ;
  17.         HAL_UART_Transmit(&huart2, (uint8_t *)&TxByte, 1, 0xFF);
  18.                                 
  19.                                 TxByte = 0x29 ;
  20.         HAL_UART_Transmit(&huart2, (uint8_t *)&TxByte, 1, 0xFF);
  21.                                 
  22.                                 TxByte = 0x60 ;
  23.         HAL_UART_Transmit(&huart2, (uint8_t *)&TxByte, 1, 0xFF);

  24.         HAL_Delay(1000);
复制代码
然后烧录上之后理论上发送的是01 06 00 42 03 E8 29 60 ,结果用串口助手试了下收到的是81 06 00 42 03 E8 A9 60

请问是怎么回事……
收藏 评论10 发布时间:2018-11-15 21:13

举报

10个回答
疯de_恒 回答时间:2018-11-16 09:02:23
格式没设置对,串口助手的格式一定要和单片机的一致。
七哥 回答时间:2018-11-16 09:28:57
如果用IO来设置发送使能的话,设置了发送使能后,一定要加一点点延时,否则第一个数可能不对。
但是你的第1个和第7个数据都不对,都是最高位有问题,串口发送时是低在前高在后,最高位后面是校验位和停止位。
上位机的校验位、停止位,一定要与MCU的一致,波特率也要一致。拿不准的话,用示波器看一下波特率是多少

TIM图片20181226105958_01.jpg
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
波特率降低一下试试。说不定是线路问题。
疯de_恒 回答时间: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
你程序上使用奇偶校验了
疯de_恒 回答时间:2018-11-16 17:41:59
coldfear 发表于 2018-11-16 10:54
解决了!多谢!但是是为什么呢?

使用偶检验要多一位,但是上位机不是这样算的。最好你仔细看看规格书,上面说的很详细。
七哥 回答时间:2018-11-16 17:56:33
coldfear 发表于 2018-11-16 10:54
解决了!多谢!但是是为什么呢?

7楼说的很对。
STM32就是这么用的,数据位本身可以是7位或8位,有校验位的时候,校验位也加进里面,这样的话就可以有9位了。

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版