做的是工业传感采集器,现场采集的参数查询指令为FE FE 68 19 01 00 00 00 00 33 78 01 03 1F 90 01 E1 16 ,8位数据位,奇校验模式
串口设置:
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_Parity = USART_Parity_Odd;
代码写入:
index = 0;
Max3485SendBuf[index++] = 0xfe;
Max3485SendBuf[index++] = 0xfe;
Max3485SendBuf[index++] = 0x68;
Max3485SendBuf[index++] = 0x19;
Max3485SendBuf[index++] = 0x01;
Max3485SendBuf[index++] = 0x00;
Max3485SendBuf[index++] = 0x00;
Max3485SendBuf[index++] = 0x00;
Max3485SendBuf[index++] = 0x00;
Max3485SendBuf[index++] = 0x33;
Max3485SendBuf[index++] = 0x78;
Max3485SendBuf[index++] = 0x01;
Max3485SendBuf[index++] = 0x03;
Max3485SendBuf[index++] = 0x1f;
Max3485SendBuf[index++] = 0x90;
Max3485SendBuf[index++] = 0x01;
Max3485SendBuf[index++] = 0xe1;
Max3485SendBuf[index++] = 0x16;
UART4_SendLongData(Max3485SendBuf, index);
用串口调试工具接收到的数据确是:
一直怀疑是不是现场采集的校验方式错了,或者是其他什么问题。后来根据发送接收的数据对比,发现接收的数据是把最高位
变成校验位了。查看数据手册发现stm32的设置数据长度是把校验位算在一起的,所以上图设置的数据长度8位,其实是7位y有效数据位,1位停止位。而接收端设置的是8位有效数据位,1位停止位。所以在发送的时候把校验位覆盖掉了最高位。
改为
USART_InitStructure.USART_WordLength = USART_WordLength_9b;
USART_InitStructure.USART_Parity = USART_Parity_Even;