手动阀

Good Luck To You!

串口通信中为何采用9位数据位而非其他位数?

串口通信中,9位数据位指的是在传输数据时,每个字节包含8位的数据加上1位的校验位,总共9位。

串口通信中9位数据位的应用与配置

串口通信

串口通信9位数据位

串口通信是一种常见的计算机通信方式,特别是在嵌入式系统、工业控制以及设备间的数据交换中广泛应用,串行接口通讯指的是数据逐位按顺序传输,具有简单便捷的特点,因此大部分电子设备都支持该通讯方式,串口通信的基本原理包括波特率、数据位、停止位和奇偶校验等参数的配置。

串口通信参数详解

1、波特率(Baud Rate):表示每秒钟传输的比特数(bit/s),如300、4800等,波特率越高,数据传输速度越快,但传输距离相对较短。

2、数据位(Data Bits):数据位表示实际传输的数据长度,通常为8位或9位,在9位数据位的情况下,第9位一般用作校验位或地址/数据标识位。

3、停止位(Stop Bits):用于标志一个数据帧的结束,通常为1位或2位。

4、奇偶校验位(Parity Bit):用于检测传输过程中的错误,可设置为无校验、奇校验或偶校验。

9位数据位的具体应用

多机通信中的应用

在多机通信中,第9位通常用于标识是地址还是数据,在Modbus协议中,第9位为1时表示这是一条地址信息,而第9位为0时则表示这是一条数据信息,这种方式可以有效地区分不同设备间的通信内容,确保数据传输的准确性。

发送地址帧:当第9位为1时,表示当前字节为地址信息,所有从机设备接收到此信息后,会检查是否与自身的地址匹配,如果匹配,则准备接收后续的数据信息;如果不匹配,则忽略该信息。

发送数据帧:当第9位为0时,表示当前字节为数据信息,只有被寻址的设备才会接收并处理这些数据,其他设备则会忽略。

串口通信9位数据位

奇偶校验中的应用

在双机通信中,第9位也可以用于奇偶校验,以提高数据传输的可靠性,奇偶校验有四种状态:奇校验、偶校验、总为1和总为0,通过设置合适的校验模式,可以检测并纠正传输过程中的错误。

奇校验:确保整个数据帧中“1”的个数为奇数,如果传输过程中发生错误,导致“1”的个数变为偶数,接收端可以通过校验位发现错误。

偶校验:确保整个数据帧中“1”的个数为偶数,同样,任何错误都会改变“1”的个数,从而被接收端检测到。

STM32串口配置实例

以STM32单片机为例,配置串口发送宽度为9位的数据需要以下几个步骤:

1、串口硬件和参数初始化

   UART_HandleTypeDef husart3;

2、配置GPIO

   void HAL_UART_MspInit(UART_HandleTypeDef* huart) {
       GPIO_InitTypeDef GPIO_InitStruct;
       if(huart->Instance==USART3) {
           __HAL_RCC_GPIOC_CLK_ENABLE(); // IO时钟使能
           GPIO_InitStruct.Pin = USARTx_Tx_GPIO_PIN | USARTx_Rx_GPIO_PIN;
           GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
           GPIO_InitStruct.Pull = GPIO_PULLUP;
           GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
           GPIO_InitStruct.Alternate = USARTx_AFx;
           HAL_GPIO_Init(USARTx_Tx_GPIO, &GPIO_InitStruct);
           HAL_GPIO_Init(USARTx_Rx_GPIO, &GPIO_InitStruct);
       }
   }

3、配置串口参数

   void MX_USART3_Init(void) {
       __HAL_RCC_USART3_CLK_ENABLE(); // 串口3时钟使能
       husart3.Instance = USART3;
       husart3.Init.BaudRate = USART3_BAUDRATE;
       husart3.Init.WordLength = UART_WORDLENGTH_9B; // 数据位宽度改为9位
       husart3.Init.StopBits = UART_STOPBITS_1; // 一位停止位
       husart3.Init.Parity = UART_PARITY_NONE; // 无奇偶校验位
       husart3.Init.Mode = UART_MODE_TX_RX;
       husart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
       husart3.Init.OverSampling = UART_OVERSAMPLING_16;
       HAL_UART_Init(&husart3);
       HAL_UART_Receive_IT(&husart3, Usart3_TempData, 1);  
       HAL_NVIC_SetPriority(USART3_IRQn, 2, 2);
       HAL_NVIC_EnableIRQ(USART3_IRQn);
   }

4、发送数据

串口通信9位数据位
   HAL_StatusTypeDef HAL_UART_Transmit_9B(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint8_t Bit_9, Timeout) {
       if(huart->Init.WordLength == UART_WORDLENGTH_9B) {
           uint16_t tmp;
           for(uint16_t i = 0; i < Size; i++) {
               tmp = (uint16_t)((*pData & (uint8_t)0x01FF));
               if(Bit_9) tmp |= 0x200; // 设置第9位为1
               huart->Instance->DR = tmp;
               while(!(__HAL_UART_GET_FLAG(huart, UART_FLAG_TXE))); // 等待发送完成
               pData++;
           }
           return HAL_OK;
       } else {
           return HAL_ERROR;
       }
   }

Arduino串口配置实例

在Arduino上,可以通过Serial库来设置串口通信参数,以下是一个简单的例子,演示如何配置波特率、数据位、停止位和校验位。

void setup() {
  Serial.begin(9600, SERIAL_8N1); // 初始化串口,设置波特率为9600,数据位为8,停止位为1,无校验位
}
void loop() {
  if (Serial.available() > 0) {
    char receivedChar = Serial.read(); // 读取接收到的字节
    Serial.print("Received: ");
    Serial.println(receivedChar); // 打印接收到的字符
  }
}

对于9位数据位的配置,可以在Serial库的基础上进行扩展,或者使用更低级别的API来实现。

常见问题与解决方法

1、数据丢失或错误:可能是由于波特率不匹配、校验位设置错误或硬件连接问题导致的,检查双方的串口配置是否一致,并确保硬件连接良好。

2、多机通信中的地址冲突:确保每个设备的地址唯一,避免地址冲突,可以使用软件协议来管理设备的地址分配。

3、奇偶校验错误:检查数据传输过程中是否有干扰或噪声,必要时增加屏蔽措施,确保校验位设置正确。

串口通信中的9位数据位配置可以显著提高数据传输的可靠性和灵活性,特别是在多机通信和高精度数据传输场景中,通过合理配置串口参数和使用合适的校验方式,可以有效减少数据传输过程中的错误,提高系统的鲁棒性,希望本文的介绍能够帮助读者更好地理解和应用串口通信中的9位数据位配置。

小伙伴们,上文介绍了“串口通信9位数据位”的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Z-BlogPHP 1.7.3

Copyright Your WebSite.Some Rights Reserved.