QT与STM32串口通信的问题记录

前期已经完成的事情:1、QT串口通信的编写,使用QT5自带的QtSerialPort类(串口类)。

                    2、stm32串口通信程序的编写,实现与串口助手的正常通信。

目前遇到的问题:1、用QT编写的上位机与stm32的通信存在问题,缓冲区不能清零,就发多少就会接到后面,不会每次都清空再填充。

                2、但是串口助手没有这种问题,那就肯定是上位机的问题。开始一直在怀疑我自己写的程序,后来发现上位机并没有致命的错误。

  

分析问题:1、stm32串口接受中断判断的是\r\n(0x0d,0x0a),而QT上位机发出去的没有\r\n(我猜测是这个原因),然后将结束判断位变成(0x38,0x39),就实现了功能。


总结:总的来说是这样的,没有对串口中断接受有深刻的理解,对通信传输没有摸透。

通信传输的基本模式为:字符串(char)--->ASCII码----->二进制--->ASCII码--->字符串(char)

这是最基本的模式,所以关于数据帧的封装,帧头帧尾的定义就迎刃而解了。


最后再说一些关于stm32的串口通信的问题:初始化函数就不提了,几个寄存器的配置。


void USART1_IRQHandler(void)函数是串口1 的中断响应函数,当串口 1 发生了相应的中
断后,就会跳到该函数执行。这里我们设计了一个小小的接收协议:通过这个函数,配合一个
数组
USART_RX_BUF[],一个接收状态寄存器USART_RX_STA(此寄存器其实就是一个全局
变量,由作者自行添加。由于它起到类似寄存器的功能,这里暂且称之为寄存器) 实现对串口
数据的接收管理。
USART_RX_BUF 的大小由USART_REC_LEN 定义,也就是一次接收的数据
最大不能超过
USART_REC_LEN 个字节。USART_RX_STA 是一个接收状态寄存器其各的定义
如表
5.3.1.1 所示:

USART_RX_STA
bit15 bit14 bit13~0
接收完成标志 接收到0X0D 标志 接收到的有效数据个数

5.3.1.1 接收状态寄存器位定义表
设计思路如下:
当接收到从电脑发过来的数据,把接收到的数据保存在
USART_RX_BUF 中,同时在接收
状态寄存器(
USART_RX_STA)中计数接收到的有效数据个数,当收到回车(回车的表示由2
个字节组成: 0X0D 0X0A)的第一个字节0X0D 时,计数器将不再增加,等待0X0A 的到来,
而如果
0X0A 没有来到,则认为这次接收失败,重新开始下一次接收。如果顺利接收到0X0A
则标记
USART_RX_STA 的第15 位,这样完成一次接收,并等待该位被其他程序清除,从而开
始下一次的接收,而如果迟迟没有收到 0X0D,那么在接收数据超过USART_REC_LEN 的时候,
则会丢弃前面的数据,重新接收。
 



void USART1_IRQHandler(void)
{
u8 res;
if(USART1->SR&(1<<5))//接收到数据
{  
res=USART1->DR; 
if((USART_RX_STA&0x8000)==0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
else USART_RX_STA|=0x8000; //接收完成了 
}else //还没收到0X0D
{
if(res==0x0d)USART_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=res;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收  
}  
}
}       

刚好为\r\n.如果结束符不是\r\n,那就用最后两位结束符的ASCII码来代替0x0d,0x0A.(注意顺序)

你可能感兴趣的:(QT与STM32串口通信的问题记录)