串口都是一次接一组数据,具体是几位要看你设置的比如9600 N,8,1那样是8个数据位,1个起始位,1个停止位(起始和停止位是芯片接收部分自己判断的)
之所以发一组都能收到是因为STM32(其实51也一样的,不信你可以试试)运行速度要远大于串口发送数据的速度。比如9600波特率,就是1秒钟发9600个位(bit)这样按N,8,1算的话是10个位(bit)是1个字节(加起始和停止位,还有8个数据位)也就是1秒钟发送960个8位数据。1/960=0.00104秒(1.04ms)发送一个字节 而单片机运行指令周期都是以us为单位的。换算下来就是也是1040us了 按51单片机1us执行一个指令的话,接受一个字节的过程中,芯片可以执行1040个指令,完全可以运算处理完成在发送回去.更何况是速度更高的STM32 1.25MPS的处理速度
接收一个字节数据的时间,够他完成N个复杂的运算处理。
STM32的串口字长=数据位+校验位,你设置8位数据位+无校验,那么数据字长是8位,上位机的数据位选择8位。如果设置7位数据位+偶校验,数据字长是8位,上位机的数据位选择7位。这样设置后就能正常了啊
校验位说明:
Table 155. Frame formats
M bit PCE bit USART frame
0 0 | SB | 8 bit data | STB |
0 1 | SB | 7-bit data | PB | STB |
1 0 | SB | 9-bit data | STB |
1 1 | SB | 8-bit data PB | STB
配置方式:STM32标准库 V3.01
#ifdef USART1_ON
//允许USART1的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
USART_InitStructure.USART_BaudRate = BAUD1;
USART_InitStructure.USART_WordLength = USART_WordLength_9b; //此处在有奇偶校验时需要9个数据位,无奇偶校验时8个数据位
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_Even;//偶校验
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1,USART_InitStructure);
/* 允许USART1 DMA */
#ifdef USART1_DMA_ON
USART_DMACmd(USART1,USART_DMAReq_Rx | USART_DMAReq_Tx, ENABLE);
#endif
/*允许USART1 */
USART_Cmd(USART1,ENABLE);
#endif
本文标签:stm32f1接收串口7位