stm32f103实现uart收发数据操作

// stm32f103c8t6实现usart接收到0xFF 0xFF 0xCE 0xCE,
// 发送0xEE 0xEE 0x01 0xCE
// 然后PA6输出高电平,否则为低电平
// 中断写法#include"stm32f10x.h#include"stm32f10x_usart.h"

#defineRX_BUFFER_SIZE4
uint8_t rxBuffer[RX_BUFFER_SIZE];
uint8_t txBuffer[] = {0xEE, 0xEE, 0x01, 0xCE};

void USART1_IRQHandler(void)
{
    // check if received a byte in RX register
    if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)        // 判断接收缓冲区
    {
        static uint8_t i = 0;
        uint8_t byte = USART_ReceiveData(USART1);

        // store received byte in rx buffer
        rxBuffer[i++] = byte;

        // check if rx buffer is full
        if (i == RX_BUFFER_SIZE)
        {
            if ((rxBuffer[0] == 0xFF) && (rxBuffer[1] == 0xFF) &&
                (rxBuffer[2] == 0xCE) && (rxBuffer[3] == 0xCE))
            {
                // clear rx buffer
                memset(rxBuffer, 0, RX_BUFFER_SIZE);

                // send tx buffer
                for (int i = 0; i < 4; i++)
                {
                    USART_SendData(USART1, txBuffer[i]);

                    // wait until transmission complete
                    while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
                }

                // configure PA6 as output
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                GPIO_Init(GPIOA, &GPIO_InitStructure);

                // set PA6 high
                GPIO_SetBits(GPIOA, GPIO_Pin_6);
            }

            // reset counter
            i = 0;
        }
    }
}
 
 
UART常用算法:

1、奇偶校验:UART在发送数据时可以添加奇偶校验位,用于检测数据传输中的错误。奇偶校验算法通过检查发送的数据位(或字节)中有偶数个还是奇数个逻辑1,来决定添加产生校验位逻辑0或1。接收方在接收数据时,也会使用奇偶校验算法进行检验。

 

2、流控制:流控制算法用于控制数据的传输速率。在UART通信中,可能会出现发送和接收速率不匹配的情况,为了避免数据丢失或通信故障,可以通过流控制算法对数据进行缓冲和控制。

流控制是一种通过调节发送和接收数据的速率来协调数据传输的技术。在计算机网络或串行通信中,流控制通常用于控制数据传输的速率,以避免出现数据丢失、数据错误或带宽浪费等问题。

在串行通信中,流控制通常涉及两种机制:硬件流控制和软件流控制。

硬件流控制使用物理信号线来实现数据传输的控制。在UART通信中,CTS(Clear to Send)信号线和RTS(Request to Send)信号线就是用于硬件流控制的信号线。

  当CTS信号线为低电平时,表示接收方已经准备好接受数据,此时发送方可以继续发送数据。

  当CTS信号线为高电平时,则表示接收方当前无法接收数据,此时发送方需要暂停发送数据,等待CTS信号线变为低电平后再继续发送数据。

软件流控制是通过在数据包头或尾部添加控制信息的方式来实现数据传输的控制。

例如,在TCP/IP协议中,由于TCP协议无法保证数据包的精确传输时间,因此TCP通过发送方和接收方之间的滑动窗口机制来控制数据的传输速率。

   接收方通过向发送方发送确认信息(ACK)和窗口大小(Window Size)信息来控制数据的传输速率,从而达到流控制的目的。

   流控制可以帮助网路设备协同工作,防止瓶颈或拥塞,从而使通信更加高效和可靠。

 

 

 

 

 

3、DMA传输:直接存储器访问(DMA)算法可以通过芯片中的DMA控制器来完成UART数据的传输,从而减少CPU的负载。在DMA传输中,芯片将数据存储在存储器中,然后通过DMA传输到UART发送或接收缓冲器中。

 

 

 

4、自适应波特率:自适应波特率算法可以动态调整UART通信的速率,以适应不同的数据传输需求。

例如,当UART作为端口调试工具用于上位机时,通常需要将速率设为较低的波特率(例如9600bps),而当UART用于高速数据通信时,波特率则需设定为较高的数值。

 

 

5、FIFO缓冲:先进先出(FIFO)缓冲算法可以将UART接收和发送的数据存储在缓冲区中,从而提高数据传输的效率和可靠性。当芯片的处理速度无法跟上UART的发送速率时,FIFO缓冲区可以防止数据流的丢失或溢出。

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
posted @ 2023-06-09 09:17  颖风船  阅读(390)  评论(0)    收藏  举报